Gestion TEdits+TSpeedButtons dans un Tpanel
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 Form1
Code:
Panel1.Enabled := False;
produit le résultat attendu : Edit1 --> Disabled mais (malheureusement) le SpeedButton1 reste Enabled.
J'ai donc créé une procédure de ce type placée dans une autre unité : :oops: Je n'ai pas réussi à faire plus simple.
Code:
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; |
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...
...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