IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Gestion TEdits+TSpeedButtons dans un Tpanel


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é : Je n'ai pas réussi à faire plus simple.
    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;
    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 :
    1. 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...
    2. 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
    Dernière modification par Invité ; 28/06/2011 à 15h40. Motif: Syntaxe + 1 erreur ds le code 2 sans incidence sur la question

  2. #2
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    Gilles,

    Dans l'exemple que tu cites, les composants TPanel et TSpeedButton n'ont pas le même ancètre (TWinControl et TGraphicControl-->TControle) et la gestion du Enabled d'un point de vue visuel n'est pas prise en compte de la même façon. Le code du Tspeed est bien désactivé mais pas le survol de la souris alors qu'avec le TbitBtn, cela fonctionne

    Aussi, utilise un TBitBtn qui lui a le même ancètre que le TPanel sinon, il va falloir ouvrir le capot

    Il suffit de redefinir un TPersoPanel qui fait remonter l'evennement Enabled
    Ensuite dans cette evenement et tu ajoutes la ligne
    TspeedButon.enabled = Tpanel.enabled
    et le tour est joué

    Cordialement,
    Chris

  3. #3
    Invité
    Invité(e)
    Par défaut
    Rebonjour Chris...

    OK pour le comportement différent du TBitBtn et du TSpeedButton comme je l'ai écrit "malheureusement" car leur codage est très proche. Il aurait suffit d'implanter un type blGlyphCenter dans le Buttons.pp pour régler facilement le problème. J'avais regardé à l'époque où j'ai réalisé mes lzButtons. Mais je ne sais pas comment pérenniser une modification de type sur le descendant d'un ancêtre sans devoir vérifier à chaque release si le code est encore portable. Dommage...

    Mais mon problème n'est pas là. J'aimerais savoir pourquoi 2 écritures semblables ne produisent pas le même effet :

    1. Si tu places un TEdit dans un TPanel sur une TForm1 et que tu codes dans la Form qui contient le Tpanel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Panel1.Enabled := False;
    end;
    alors le TEdit hérite du Enabled := False;

    Mais codé ainsi :
    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
    18
    19
    20
    21
    22
    23
    24
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      PanelEnabled(Panel1,false);
    end;
    
    //Et dans une autre unit
    
    procedure PanelEnabled(aPanel : TPanel; bEnabled : boolean);
    var
      i : integer;
      aForm : Tform;
    begin
     aPanel.Enabled := bEnabled; 
     aForm := TForm(aPanel.Parent);
     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 TSpeedButton then
        if TSpeedButton(Components[i]).Parent.Name = aPanel.Name then
         TSpeedButton(Components[i]).Enabled := bEnabled;
     end;
    end;
    Pourquoi la ligne aPanel.Enabled := bEnabled; n'agit-elle pas sur le Tedit que contient le Tpanel ? Autrement dit, pourquoi fau-il ajouter les lignes rouges à la bleue pour obtenir le même résultat (ie que le Tedit du Tpanel devienne inactif) ?

    2. Pour la question 2, c'est réglé. J'étais persuadé qu'il fallait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if aForm.Components[0] is TEdit then begin
     if TEdit(aForm.Components[0]).Parent.Name = aForm.aPanel.Name then
     showmessage('Erreur');
     end;
    alors que la bonne écriture était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if aForm.Components[0] is TEdit then begin
     if TEdit(aForm.Components[0]).Parent.Name = aPanel.Name then
     showmessage('Erreur');
     end;
    Cordialement. Gilles
    Dernière modification par Invité ; 28/06/2011 à 16h33.

  4. #4
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    Je monte un petit test et je regarde

    Par contre, ta méthode est super longue et pas du tout optimisée si tu as beaucoup d'objets sur ta forme alors qu'un composant perso te fait ca en 1s

    .....

  5. #5
    Invité
    Invité(e)
    Par défaut
    Pour le composant, à mon avis non...

    J'ai besoin dans ce cas précis d'une présentation à la SpeedButton, image centrée dans un BitBtn... Essayes de centrer une image dans un BitBtn sans Caption et tu comprendras le problème en voyant le rendu. Je l'ai fait mais il faut un type de centrage... Et là, ce n'est pas trop compliqué à faire mais à chq fois que les Lazarusiens modifient le source de leur Button.pp ou BitButton.inc, ton "héritier" est hors jeu en tas sa propriété...

    Cordialement. Gilles

  6. #6
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    Bon,
    Premier test

    Unite 2 qui gere le panel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    unit Unit2; 
    {$mode objfpc}{$H+}
    interface
    uses
      Classes, SysUtils, ExtCtrls;
        procedure PanelEnabled(aPanel : TPanel; bEnabled : boolean);
    implementation
    procedure PanelEnabled(aPanel : TPanel; bEnabled : boolean);
    begin
      aPanel.Enabled:=bEnabled;
    end;
    end.
    Unite principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    { TForm1 }
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      PanelEnabled(Panel1,false);
    end;
         ....
    Ca fonctionne !

    Je test en ajoutant ton code de parcours des composants

  7. #7
    Invité
    Invité(e)
    Par défaut
    OK,

    Je confirme... cela marche avec des Tedits sur un projet vide... La présence du SpeedButton ne semble pas interagir... Quelle est la différence avec la Form que j'utilise ? Je regarde...

    Donc le problème ne vient pas de là. Merci pour ton aide et désolé pour le dérangement.

    Cordialement. Gilles

Discussions similaires

  1. [DLL] Afficher le contenu d'une dll dans un Tpanel
    Par Fabs dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/08/2007, 14h30
  2. [Sécurité]Gestion des accès dans plusieurs bases
    Par vincentj dans le forum Débuter
    Réponses: 1
    Dernier message: 05/01/2005, 14h19
  3. Gestion des headers dans un Makefile
    Par Weren dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/11/2004, 10h44
  4. Gestion du blit dans un moteur2D
    Par Fry dans le forum DirectX
    Réponses: 2
    Dernier message: 01/11/2004, 02h05
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo