Bonjour,
Pour simplifier la gestion de mon IHM, j'ai placé des composants dans un TPanel que j'ai géré par une procédure placée dans une autre unit que celle qui contient la Form.
Dans un premier temps, dans une Form1, je place un Panel1 qui contient 1 Tedit et un TSpeedbutton (les 2 dans le TPanel).
Ensuite dans cette Form1produit le résultat attendu : Edit1 --> Disabled mais (malheureusement) le SpeedButton1 reste Enabled.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Panel1.Enabled := False;
J'ai donc créé une procédure de ce type placée dans une autre unité : Je n'ai pas réussi à faire plus simple.
Bon, il n'y a pas les sécurités ni les vérifications nécessaires (Ex. si le TPanel n'a pas directement pour parent la Form). Le code fonctionne...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 procedure PanelEnabled(aPanel : TPanel; bEnabled : boolean); var i : integer; aForm : Tform; begin aForm := TForm(aPanel.Parent); aPanel.Enabled := bEnabled; with aForm do begin for i := 0 to ComponentCount -1 do if Components[i] is TEdit then begin if TEdit(Components[i]).Parent.Name = aPanel.Name then TEdit(Components[i]).Enabled := bEnabled; end else if Components[i] is TlzSpeedButton then if TlzSpeedButton(Components[i]).Parent.Name = aPanel.Name then TlzSpeedButton(Components[i]).Enabled := bEnabled; end; end;
...mais je ne comprends pas :
- Pourquoi faut-il faire dans ce cas précis une boucle sur le TEdit alors que dans la TForm ce n'est pas nécessaire : Dans le premier code, "Panel1.Enabled := False;" agit directement et automatiquement sur le TEdit, mais dans le second code, sans les lignes rouges, le Tedit du TPanel reste obstinément actif.. Du coup, le code a moins d'intérêt s'il faut inventorier tous les composants contenus dans le TPanel... La procédure avait pour but de régler le problème des TSpeedButtons uniquement. Si maintenant, il faut gérer, les Tedits, les TMemos...
- Pourquoi le code "aForm.aPanel.Enabled :=...." plante alors que le même code avec "With aForm do aPanel.Enabled :=..." passe.
C'est certainement un problème d'héritage dans les 2 cas, mais plus précisément ? Le fait que je fasse appel à des objets "génériques"( le aForm, le aPanel), semble ,en [F9], ne pas permettre à la form d'exécuter des traitements automatiques sur les objets dont ils sont les parents. Pourtant un aForm := TForm(aPanel.Parent); appliquée à Panel1 de Tform1 indique bien la bonne Form... Alors pourquoi cela serait-il différent des objets dont le Parent est le Tpanel (les Tedits en l'occurrence) ?
Globalement pour la gestion de l'état de l'affichage de "secteurs" de la Form (Enabled, Visible), y-a-il une méthode plus adaptée que les TPanels sachant que j'utilise les ancres dans toutes mes Forms ? Il ne faut pas qu'une amélioration de la gestion des Enabled et Visible m'amène à me compliquer la tâche ou à faire des concessions avec les ancres...
Cordialement. Gilles
Partager