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

  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 expérimenté
    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 : 55
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    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 expérimenté
    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 : 55
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    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 expérimenté
    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 : 55
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    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

  8. #8
    Membre expérimenté
    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 : 55
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    TEST 2 en ajoutant le parcours des TspeedButton et mon projet n'est pas vide puisque j'ai d'autres composant sur la form
    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
    unit Unit2; 
    {$mode objfpc}{$H+}
    interface
    uses
    Classes, SysUtils, ExtCtrls,Forms,Buttons;
    procedure PanelEnabled(aPanel : TPanel; bEnabled : boolean);
    implementation
    procedure PanelEnabled(aPanel : TPanel; bEnabled : boolean);
    var
    i : integer;
    aForm : Tform;
    begin
    //Pour les objets de meme ancetre que le TPanel
    aPanel.Enabled:=bEnabled;
    //Pour les autres
    aForm:=TForm(aPanel.Parent);
    with aForm do begin
    for i := 0 to ComponentCount -1 do
    if TSpeedButton(Components[i]).Parent.Name = aPanel.name then
    TSpeedButton(Components[i]).Enabled := bEnabled;
    end;
     
    end;
    end.
    Ca fonctionne aussi !

  9. #9
    Membre expérimenté
    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 : 55
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Code de la Form si ca peut t'aider !
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    unit Unit1; 
    {$mode objfpc}{$H+}
    interface
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
      StdCtrls, Buttons,Unit2;
    type
      { TForm1 }
      TForm1 = class(TForm)
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;
        Edit1: TEdit;
        Edit2: TEdit;
        Memo1: TMemo;
        Panel1: TPanel;
        SpeedButton1: TSpeedButton;
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure SpeedButton1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end; 
    var
      Form1: TForm1; 
    implementation
    {$R *.lfm}
    { TForm1 }
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      PanelEnabled(Panel1,false);
    end;
     
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      PanelEnabled(Panel1,true);
    end;
    procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
      PanelEnabled(Panel1,false);
    end;
    procedure TForm1.BitBtn3Click(Sender: TObject);
    begin
      ShowMessage('CLICK BITBTN');
    end;
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin
      ShowMessage('CLICK SPEED');
    end;
     
    end.

    LE LFM
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    object Form1: TForm1
      Left = 624
      Height = 343
      Top = 256
      Width = 768
      Caption = 'Form1'
      ClientHeight = 343
      ClientWidth = 768
      OnCreate = FormCreate
      LCLVersion = '0.9.30'
      object Panel1: TPanel
        Left = 61
        Height = 143
        Top = 49
        Width = 627
        Caption = 'Panel1'
        ClientHeight = 143
        ClientWidth = 627
        TabOrder = 0
        object Edit1: TEdit
          Left = 32
          Height = 23
          Top = 23
          Width = 80
          TabOrder = 0
          Text = 'Edit1'
        end
        object SpeedButton1: TSpeedButton
          Left = 227
          Height = 22
          Top = 7
          Width = 87
          NumGlyphs = 0
          OnClick = SpeedButton1Click
        end
        object BitBtn3: TBitBtn
          Left = 227
          Height = 30
          Top = 55
          Width = 87
          Caption = 'BitBtn3'
          OnClick = BitBtn3Click
          TabOrder = 1
        end
        object Edit2: TEdit
          Left = 35
          Height = 23
          Top = 55
          Width = 80
          TabOrder = 2
          Text = 'Edit2'
        end
        object Memo1: TMemo
          Left = 355
          Height = 90
          Top = 7
          Width = 150
          Lines.Strings = (
            'Memo1'
          )
          TabOrder = 3
        end
      end
      object BitBtn1: TBitBtn
        Left = 168
        Height = 30
        Top = 216
        Width = 75
        Caption = 'Enabled'
        OnClick = BitBtn1Click
        TabOrder = 1
      end
      object BitBtn2: TBitBtn
        Left = 248
        Height = 30
        Top = 216
        Width = 75
        Caption = 'DisEnabled'
        OnClick = BitBtn2Click
        TabOrder = 2
      end
    end

  10. #10
    Invité
    Invité(e)
    Par défaut
    OK merci Chris.

    Je ne vois pas de différences significatives entre la Form qui fonctionne comme prévu et l'autre. Je vais remonter cette dernière à partir d'une fiche vierge et regarder à quel moment cela pose problème.

    J'ai recopié dans le projet vierge le panel de mon projet... et cela ne fonctionne pas... Les lignes sont nécessaires... Très curieux...

    Encore merci pour ton aide. Gilles
    Dernière modification par Invité ; 28/06/2011 à 17h29.

  11. #11
    Invité
    Invité(e)
    Par défaut
    J'hallucine : Chris tu pourrais refaire le Test en mettant la propriété du TEdit contenu par le TPanel par défaut en Enabled := False ?

    Si tu arrives à reproduire mon problème, cela signifie que le Tedit est sourd à l'appel du TPanel quand celui-ci déclenche la procédure externe et même locale (ie Panel1.Enabled:= True; )... Cela paraît éventuellement logique... Comme il est Disabled, il est inerte et donc sourd à l'appel du TPanel. D'où l'obligation de "forcer" la consigne (les lignes rouges). C'est éventuellement logique mais est-ce que c'est normal... Si un TEdit Enabled ne reçoit que les consignes qui lui sont directement adressées...

    En tous cas je sais comment je me suis moi-même bricolé mon problème... Initialement je n'avais pas de Panel... et les TEdiits étaient tous par défaut Disabled, certains Boutons Enabled et d'autres pas. Comme le nb de fenêtres commençait à devenir important et comme elles se ressemblaient, j'ai voulu "factoriser".

    Encore une fois, merci pour ton aide.
    Gilles
    Dernière modification par Invité ; 28/06/2011 à 18h29.

  12. #12
    Membre expérimenté
    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 : 55
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Heu !

    J'ai mis en commentaire la ligne du create de la form et viens de refaire le test comme demandé en positionnant à false mes tedit et le tmemo et..... ca fonctionne au poil des que je clique sur les boutons de pilotage du panel

    ....????.....

  13. #13
    Invité
    Invité(e)
    Par défaut
    Non, non, je confirme.... sur ma config.

    Sur Lazarus 0.9.31-30686 fpc-2.4.3-20110512-Win32,

    Nouveau projet - Form1 vide - un TPanel (par défaut) - un Tedit : Enabled := False dans l'inspecteur objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Panel1.Enabled:= True;
    end.
    Le TEdit reste inactif. Idem dans une Lazarus 0.9.31-31370 fpc-2.4.4-20110625-Win32. Je n'ai pas de 0.30 et encore moins de 0.28 au bureau. J'essayerai ce soir sur mon portable.

    Enfin, tout ceci est peu important puisque la solution des lignes "rouges" fonctionne. Mais je reste intrigué.

    Bonne soirée Chris.
    A bientôt. Gilles
    Dernière modification par Invité ; 28/06/2011 à 18h37.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Donc j'ai vérifié sur plusieurs configurations 0.9.30 et 31 sous Windows et Linux 32 bits.

    Voici une synthèse des résultats :

    Explications :
    -Encadré de gauche : Etats du TPanel et du TEdit dans l'inspecteur d'objet.
    -Encadré central : Code figurant dans le TButton.
    -Encadré de droite : Etat du TEdit après Click sur le TButton.

    Quelque soit la manière dont j'analyse les résultats, ils ne sont pas cohérents : les cas 1, 3, 6 et 8 ne sont pas significatifs puisqu'il n'y a pas de changement d'état demandé du TEdit.

    Par contre, les cas 2 et 4 nécessitent un changement d'état du TEdit de True vers False qui sont effectivement réalisés que le Panel.enabled soit initialement False ou True.

    Mais parallèlement, le changement d'état réciproque du TEdit de False vers True n'est pas réalisé que le Panel.Enabled soit False ou True.

    Conclusion :
    1. Les lignes rouges ajoutées sont actuellement indispensables.
    2. Je ne trouve pas rationnelle l'approche tant que l'on ne m'aura pas démontré le contraire.



    Cordialement. Gilles
    Dernière modification par Invité ; 28/06/2011 à 22h58. Motif: Pffff : orthographe

  15. #15
    Membre expérimenté
    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 : 55
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Il faut savoir que tu es sur une version BETA et que la compile de celle ci met peut être en cause un code en cours de développement ! Donc méfiance quand à d'eventuelles interprétations mais je partage ton avis sur ce mystère

  16. #16
    Invité
    Invité(e)
    Par défaut
    Oui, on sera en beta longtemps. Et j'assume ce choix de travailler avec des SVN... et avec Lazarus . Il me semble toujours concurrentiel et pertinent pour travailler parallèlement dans les 2 OS.

    Mais avant de casser les pieds de l'équipe Lazarus, je voulais être sûr de l'existence d'un problème et d'être capable de le formuler correctement. Mais que ce soit en 0.9.30, considérée comme actuellement la plus "stable", ou en 0.9.31, dans les 2 OS, le problème est strictement identique et facile à reproduire.

    Bon, va encore falloir faire de l'anglais Rien contre, mais au début de mes études, au Collège, on favorisait et consolidait alors le rapprochement franco-allemand. Donc l'anglais... j'ai découvert bien tard, à la Fac... Et encore l'écrit, c'est rien comparé à ma prononciation de Normand ! Je crois que malgré mes efforts actuels, l'anglais restera chez moi en beta version... Shame on me ! Ceci dit je ne regrette pas l'apprentissage de l'allemand pendant de longues années... C'est une très belle langue comme le français !

    Also, gute Nacht, mein Freund.
    Tchuss. Gilles
    Dernière modification par Invité ; 28/06/2011 à 23h09.

  17. #17
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Bonjour

    A ma connaissance, le fait d'activer un Panel n'a jamais activé les objets désactivés qui s'y trouvent, pas même sous Delphi. Imagine que tu ne veuilles activer qu'une partie des objets...
    La SVN regorge de bugs, mais ceci n'en est pas un.
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    ce que vous me dites Patrick, c'est que l'activation d'un Panel n'a pas d'action sur le TEdit alors que sa désactivation en a une (cas N° 4) ?
    Citation Envoyé par DOLPat® Voir le message
    Bonjour
    Imagine que tu ne veuilles activer qu'une partie des objets...
    Donc en retournant votre argumentation, pourquoi est-ce que dans le cas N° 4, tous les TEdits (initialement Enabled) dans le TPanel (initialement Enabled) sont-ils désactivés par la modification de l'état du TPanel lors de son passage à Enabled := False; ? Pourquoi une telle asymétrie du fonctionnement de la propriété ?
    Et pour répondre à votre question, on gèrerait simplement de manière fine en utilisant des lignes 'rouges' (cf ci-dessus) en activant ou non le TPanel pour traiter en programmation les cas "minoritaires" afin de réduire le code.
    Citation Envoyé par DOLPat® Voir le message
    [...] pas même sous Delphi.
    Je ne cherche pas trop à savoir si Delphi fait pareil... Lazarus, c'est aussi gtk2, l'absence de ProcessMessage sauf si Lazarus est sous Windows. Mais il ne l'est pas tout le temps ! Les Linuxiens, "Macintoshiens" et Cie ont leur mot à dire aussi en dehors de la référence Delphi qui n'a pas cours dans leur monde. Tout cela pour dire que, même sans renier l'apport extraordinaire de Delphi dans Lazarus, il est possible d'utiliser une approche différente et de ne pas balayer celle-ci avec un référencement systématique à ce que fait ou qu'a fait Delphi. Ce qui me ramène au TPanel de Lazarus.
    Citation Envoyé par DOLPat® Voir le message
    La SVN regorge de bugs, mais ceci n'en est pas un.
    Donc, mon problème est de savoir si le fonctionnement des objets que j'utilise est cohérent ou non et à ce titre représente un bug ou non. Sachant que je n'ai pas d'avis définitif sur cette question précise du TPanel. Voila pourquoi j'ai posé la question sur ce forum. Je ne connaissais pas cet objet et comme je dispose du temps pour le faire, je découvre son fonctionnement -comme je le fais pour chaque nouvel objet que j'utilise- et je trouve le comportement du TPanel pour le moins curieux, comme j'avais trouvé que le comportement des TStringgrids l'était tout autant, il y a quelques versions et même encore maintenant. Mais peut-être qu'un TPanel n'est-il qu'une zone de regroupement "géométrique". Mais dans ce cas, pourquoi le cas 4 ? Il faut le "désactiver" .

    Merci pour votre aide... et pour la différence de votre approche.
    Cordialement. Gilles
    Dernière modification par Invité ; 29/06/2011 à 14h46.

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