famjerom
Messages postés15Date d'inscriptionmercredi 3 novembre 2004StatutMembreDernière intervention13 février 2009
-
12 févr. 2009 à 00:04
famjerom
Messages postés15Date d'inscriptionmercredi 3 novembre 2004StatutMembreDernière intervention13 février 2009
-
13 févr. 2009 à 08:58
Je ne suis pas vraiment un débutant en Delphi, donc je reste perplexe devant le comportement, décrit ci-dessous.
Bug? ou j'ignore un principe important? Moyen de contourner? Je le soumets à votre perspicacité.
J'ai créé une application fiche VCL contenant un tpagecontrol avec une page (ttabsheet).
Normalement, cette page permet de voir de fiches d'une base de données, et selon certaines conditions, un bouton peut être visible ou pas.
Pour exposer le problème, j'ai simplifié au maximum pour ne garder que le bouton sur cette tabsheet.
En conception, ce bouton est déclaré invisible. et dans le formshow je mets Button1.Visible:=true;
Si j'exécute le bouton est bien visible, puisque rendu visible à l'exécution.
Si maintenant, je mets le Button1.Visible:=true; dans le TabSheet1Show, le bouton reste invisible bien que l'on passe bien sur la ligne de code (vérifié avec un point d'arrêt) et que Button1.Visible est bien à true (vérifié en le faisant afficher à l'aide d'un autre bouton).
Pire. Si je mets Button1.Visible:=true; dans le tabsheet1show ET dans le formshow qui sera exécuté juste après, cette ligne n'arrive plus à faire apparaitre le bouton.
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 12 févr. 2009 à 09:53
Salut,
petites infos déjà :
1) on dit bonjour (c'est écrit dans le règlement et c'est une question de politesse, meme sur le net)
2) http://jargonf.org/wiki/programmateur - Mais ici il y a des programmeurs.
Afin de mieux aider, as tu la possibilité de poster du code ou de zipper ton projet et le mettre à disposition ?
famjerom
Messages postés15Date d'inscriptionmercredi 3 novembre 2004StatutMembreDernière intervention13 février 2009 12 févr. 2009 à 14:42
Je ne sais pas comment mettre le zip du projet à votre disposition, mais était simplifié au maximum pour ne pas faire de parasite, je vous le mets en texte.
1. Le dfm
object Form1: TForm1
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
Height = 375
Width = 651
Left = 0
Top = 0
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Caption = 'Label1'
Left = 176
Top = 40
Width = 31
Height = 13
end
object PageControl1: TPageControl
ActivePage = TabSheet1
TabOrder = 0
Left = 160
Top = 128
Width = 289
Height = 193
object TabSheet1: TTabSheet
Caption = 'TabSheet1'
OnShow = TabSheet1Show
object Button1: TButton
Caption = 'Button1'
TabOrder = 0
Visible = False
Left = 54
Top = 32
Width = 75
Height = 25
end
end
end
object Button2: TButton
Caption = 'Button2'
TabOrder = 1
Visible = False
Left = 472
Top = 64
Width = 75
Height = 25
OnClick = Button2Click
end
end
procedure TForm1.FormShow(Sender: TObject);
begin
Button1.Visible:=true;
Button2.Visible:=true;
end;
procedure TForm1.TabSheet1Show(Sender: TObject);
begin
Button1.Visible:=true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Label1.Caption:=booltostr(Button1.Visible);
end;
end.
PS1:
Le bouton2 sert à afficher la proprité visible du bouton 1 (cela donne -1 pour true($FFFF) alors que le bouton est invisible)
PS2:
rajouter des invalidate, des repaint, des refresh un peu partout et sur form tabsheet ou bouton n'y change rien
PS3: Dans le vrai programme (heu, logiciel? application? Je vais encore me faire engueuler moi) il y a plein de tabsheet et passer de l'un à l'autre fait que le bouton s'affiche correctement. Mais je n'ai pas réussi à le reproduire simplement dans le test joint.
PS4: Je peux faire un zip du projet pour Delphi 2005 mais je ne sais pas comment le poster.
famjerom
Messages postés15Date d'inscriptionmercredi 3 novembre 2004StatutMembreDernière intervention13 février 2009 12 févr. 2009 à 14:47
Vous avez raison, enabled est pris en compte, mais ce serait plus clair pour le client que le bouton ne soit pas présent (signalisation bien visible de l'état de la fiche)
Vous n’avez pas trouvé la réponse que vous recherchez ?
famjerom
Messages postés15Date d'inscriptionmercredi 3 novembre 2004StatutMembreDernière intervention13 février 2009 12 févr. 2009 à 17:29
Boujour à f0xi
le dessin du tabsheet a bien lieu car si au lieu de mettre un bouton dans le tabsheet, je mets un label, le label devient visible.
J'ai aussi mis un bouton à côté qui force un repaint (ou refresh ou invalidate)
Deuxièmement si je mets le visible = true dans le formshow qui a lieu après le tabsheetshow, le bouton est visible.
Encore plus fort, si je mets visible = true dans le formshow ET le tabsheetshow, le bouton n'apparait pas. C'est comme si le tabsheet fichait la pagaille, et que plus rien ne marchait après.
Encore plus plus fort, si je mets un deuxième tabsheet dans le pagecontrol, et qu'au lancement du programme on arrive sur ce dernier puis qu'on clique sur celui avec le bouton, il est visible (le visible=true est dans le tabsheetshow).
Tout ceci est vrai pour un bouton, un bitbtn, un panel un tedit mais pas pour un label qui fonctionne normalement.
famjerom
Messages postés15Date d'inscriptionmercredi 3 novembre 2004StatutMembreDernière intervention13 février 2009 12 févr. 2009 à 21:31
Bonsoir Caribensila,
malheureusement le problème a lieu sur tous les onglets.
Par contre c'est vrai, il n'a lieu que sur l'onglet où on arrive directement à l'ouverture du programme. Dès qu'on change de tabsheet, le problème disparait.
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202114 12 févr. 2009 à 21:55
Tu fais ouvrir le pagecontrol sur un tabsheet où il n'y a pas de bouton
une belle image ou une petite animation.
De plus tu peux rendre l'onglet actif invisible (du moins l'étiquette)
..et du coup l'utilisateur sera obligé de cliquer sur un autre onglet déclenchant
le OnChange.
famjerom
Messages postés15Date d'inscriptionmercredi 3 novembre 2004StatutMembreDernière intervention13 février 2009 13 févr. 2009 à 08:58
Merci Caribensila,
C'est effectivement parfait, et ça reste propre.
Je n'ai pas trouvé d'effet secondaire (on revient à la page 0 à un moment inatendu), mais si c'était le cas il suffirait de rajouter un bool pour qu'il ne fasse que la première fois.