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

Langage Delphi Discussion :

Événements dynamiques locaux


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    749
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 749
    Points : 500
    Points
    500
    Par défaut Événements dynamiques locaux
    bonjour ,

    Dans une des fiches de mon appli, je souhaite créer une fiche sans passer par la création standard ( Nouvelle unité...). J'ai donc crée cette fiche et les quelques composants présents dans cette fiche en dynamique.

    En général quand je crée des composants dynamiques, le parent est la fiche en cours, je sais donc créer les événement de ces composants dynamiques, en les déclarants dans le type de la fiche principale qui est la "parent".

    Mais comment faire quand la fiche est déclarée en local et n'est pas un type?

    J'ai mis une procédure pour exemple dans le code ci-dessous : Cette procédure crée et affiche une fiche, avec un TEdit et un clavier.
    Cela fonctionne , mais je n'arrive pas a déclarer un événement sur ces composants en fait je ne sais pas comment faire la déclaration.
    Par exemple un événement OnKeydown du Tedit ou de la fiche.

    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
     
    procedure TFVisuRes.AfficheClavier(var valeur:string);
    var Fcl:Tform;
          ed:TadvEdit;
    begin
        Fcl:=TForm.create(application);
        Try
          Fcl.Height:=435;
          Fcl.Width:=322;
          Fcl.color:=clwhite;
     
          ed:=TEdit.Create(fcl);
          ed.Parent:=Fcl;
          ed.Align:=alTop;
          ed.Alignment:=taCenter;
     
          CreationClavier8(3,95,Fcl);
     
          Fcl.Showmodal;
     
          valeur:=ed.text;
     
          freeAndNil(ed);
        Finally
            Fcl.Free;
            Fcl:=nil;
        end;
    end;
    Si quelqu'un peut me donner la méthode, sinon je créerai une nouvelle fiche juste pour cela.

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Juste pour se décrasser la tête ce matin
    Message pour les grincheux : ce n'est pas la solution mais une solution parmi d'autres

    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
     
    unit ex01a;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Label1: TLabel;
        procedure Edit1Change(Sender: TObject);
        procedure EditXChange(Sender: TObject);
      end;
     
    var
      Form1: TForm1;
      Form2: TForm;
     
    procedure ajoutComposants(aForm: TForm);
     
    implementation
     
    {$R *.dfm}
     
    procedure ajoutComposants(aForm: TForm);
    begin
      with TLabel.Create(aForm) do
      begin
        Name := 'lb1';
        Top := 70;
        Left := 40;
        Width := 100;
        Parent := aForm;
        Caption := 'Hello';
      end;
      with TEdit.Create(aForm) do
      begin
        Name := 'ed1';
        Top := 20;
        Left := 40;
        Width := 100;
        Parent := aForm;
        Text := 'Hello';
        OnChange := Form1.EditXChange ;
      end;
      aForm.Visible := true;
    end;
     
    procedure TForm1.Edit1Change(Sender: TObject);
    begin
      Label1.Caption := Edit1.Text;
    end;
     
    procedure TForm1.EditXChange(Sender: TObject);
    var
      aForm: TForm;
      aEdit: TEdit;
      aLabel: TLabel;
    begin
      aForm := TForm(TControl(Sender).Parent);
      aEdit := Tedit(aForm.FindComponent('ed1'));
      aLabel:= TLabel(aForm.FindComponent('lb1'));
      aLabel.Caption := aEdit.Text;
    end;
     
    end.

    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
     
    program ex01;
     
    uses
      Vcl.Forms,
      ex01a in 'ex01a.pas' {Form1};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TForm, Form2);
        ajoutComposants(Form2) ;
     
      Application.Run;
     
    end.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    A noter que l'on peut fournir un gestionnaire d'évènement OnKeydown avec une class procedure en exploitant que le Sender

    il est aussi possible de créer un dérivé de TForm sans DFM mais il faut l'instancier via CreateNew ce qui permet d'avoir quand même les champs Label et Edit en privé (au lieu de published)

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    749
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 749
    Points : 500
    Points
    500
    Par défaut
    Bonjour a vous deux..

    je suis d'accord avec vos solutions ... mais je me suis surement mal expliqué car cela n'est pas ma question.

    Pour faire simple, reprenons l'exemple de code de Alweber, C'est une fiche (Form1) associée a une unité (ex01a.pas). Il y crée dynamiquement un Tlabel et d'un Tedit, avec quelques événements, cela ne me pose pas de problème.
    Mais si dans cet exemple j'ajoute la procédure que j'ai mis dans mon 1er post.

    Cette procédure que j'ajoute se doit d’être autonome. Donc elle crée sa propre fenêtre "FCL"et ses propres composants, tous cela est déclarés en local dans cette procédure. Ce sont bien sur les composante de cette fenêtre "FCL" ou je ne sais pas comment faire pour déclarer mes événements.

    Quand j’appuie sur un bouton qui appelle ma procédure : La fenêtre est crée, ainsi qu'un Tedit et d'autres composants, mais par exemple je n'ai pas accès au "OnChange" du Tedit qui se trouve dans la fenêtre "FCL"

    Il va de soit que je sais répondre a ce problème en créant cette fiche associé à une autre unité autonome que j’appelle depuis la fiche principale.
    Mais il m'arrive assez souvent d'avoir des fonctions (saisie, affichage... spécifique) et qui doivent être modale d'ou la simplicité de passer par une fiche. ce qui m'amène à essayer d'éviter la création une nouvelle unité à chaque fois.

    exemple ci-dessous


    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    unit ex01a;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Label1: TLabel;
        procedure Edit1Change(Sender: TObject);
        procedure EditXChange(Sender: TObject);
      end;
     
    var
      Form1: TForm1;
      Form2: TForm;
     
    procedure ajoutComposants(aForm: TForm);
     
    implementation
     
    {$R *.dfm}
     
    procedure ajoutComposants(aForm: TForm);
    begin
      with TLabel.Create(aForm) do
      begin
        Name := 'lb1';
        Top := 70;
        Left := 40;
        Width := 100;
        Parent := aForm;
        Caption := 'Hello';
      end;
      with TEdit.Create(aForm) do
      begin
        Name := 'ed1';
        Top := 20;
        Left := 40;
        Width := 100;
        Parent := aForm;
        Text := 'Hello';
        OnChange := Form1.EditXChange ;
      end;
      aForm.Visible := true;
    end;
     
    procedure TForm1.Edit1Change(Sender: TObject);
    begin
      Label1.Caption := Edit1.Text;
    end;
     
    procedure TForm1.EditXChange(Sender: TObject);
    var
      aForm: TForm;
      aEdit: TEdit;
      aLabel: TLabel;
    begin
      aForm := TForm(TControl(Sender).Parent);
      aEdit := Tedit(aForm.FindComponent('ed1'));
      aLabel:= TLabel(aForm.FindComponent('lb1'));
      aLabel.Caption := aEdit.Text;
    end;
     
    // *********************************** ma procedure ....
     
    procedure TForm.AfficheClavier(var valeur:string);
    var Fcl:Tform;
          ed:TadvEdit;
    begin
        Fcl:=TForm.create(application);
        Try
          Fcl.Height:=435;
          Fcl.Width:=322;
          Fcl.color:=clwhite;
     
          ed:=TEdit.Create(fcl);
          ed.Parent:=Fcl;
          ed.Align:=alTop;
          ed.Alignment:=taCenter;
     
          ed.Monclick := Fcl.edCLIK ;  // <====== comment déclarer cet evement et l'associer au TEDIT crée dans la fiche  "FCL"  et non Form1 
     
          CreationClavier8(3,95,Fcl);
     
          Fcl.Showmodal;
     
          valeur:=ed.text;
     
          freeAndNil(ed);
        Finally
            Fcl.Free;
            Fcl:=nil;
        end;
    end;
     
     
     
     
     
    //************************************
     
     
    end.

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Comme dans l'exemple que j'ai envoyé.

    EditXChange est une métode de type TNotifyEvent décrite dans un objet hérité de TForm et il y a toute la mécanique qui va avec (principe de base de la VCL). Rappel :

    Delphi et la bibliothèque de composant VCL
    Delphi au moment de sa sortie est une variante de Pascal Objet. Des fonctionnalités novatrices orientées objet sont incluses, telles que les propriétés et les informations de type au moment de l'exécution (RTTI). Ces fonctionnalités sont inspirées par les langages Modula et Smalltalk. Au sein de Delphi nous trouvons la VCL (Visual Component Library). Cet ensemble modifie radicalement l'approche devenue plus intuitive par la construction visuelle de l'interface utilisateur.

    Caractéristiques novatrices de la VCL à sa sortie
    - Un framework qui permet à un objet et ses sous-objets d'être stocké en format texte ou binaire et restitués le moment venu (sérialisation).
    - Une classe racine du framework VCL : la classe TComponent
    - La conception du formulaire enregistrée dans un flux (DFM Delphi Form Module). Ce flux associé à la partie de programme concernée conserve la description particulère des objets et non le code requis pour les créer. Ainsi les objets peuvent, grâce à ce référentiel, être créés automatiquement le moment venu.

    Ces caractéristiques permettent de personnaliser les instances d'une classe sans sous-classement de deux façons:
    1. Utilisation de propriétés, permettant aux instances d'un objet d'avoir ses propres caractéristiques
    2. Gestion des événements - pointeurs de méthode appelés à des endroits spécifiques du code pour être traités par un autre objet. En d'autres termes, cela crée des comportements personnalisés par délégation et non par héritage.

    En complément d'informations vous trouverez la mouture initiale du projet VCL de mai 1993 à l'adresse suivante : http://edn.embarcadero.com/article/32975

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 875
    Points : 11 365
    Points
    11 365
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Y aurait-il une piste avec les Méthodes anonymes en tant qu'événements ?

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bonjour,

    Y aurait-il une piste avec les Méthodes anonymes en tant qu'événements ?
    En Object Pascal une méthode anonyme est en réalité ce que l'on appelle dans d'autres langages informatiques une fermeture (closure). Une fermeture est donc créée lorsqu'une fonction est définie dans le corps d'une autre fonction et fait référence à des arguments ou des variables locales à la fonction dans laquelle elle est définie.
    Dans la clause type une description incluant "reference to function" permet de déclarer une valeur de retour de type function à une fonction. Un usage, hors méthode anonyme, en est présenté dans l'unité System.Classes. Voir TListSortCompareFunc = reference to function …

    exemple en mode console

    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
     
    type
      TRefFonc1 = reference to function(x: Integer): string;
     
     
     
    function Ajouter(y: Integer): TRefFonc1;
    begin
      Writeln ('Y = '+intToStr(y));
      Result := function(x: Integer) : String
      begin
        Writeln ('X = '+intToStr(x));
        Result := 'X + Y = '+intToStr(x + y);
      end;
    end;
     
    var
      v1 : TRefFonc1 ;
    begin
      v1 := Ajouter(3);
      Writeln (v1(5));
      Writeln (v1(7));
      readln ;
    end.. .
    Une autre solution passe aussi par l'envoi de Windows Messages personnalisé WM_USER + n

  8. #8
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    749
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 749
    Points : 500
    Points
    500
    Par défaut
    Merci pour vos réponses..

    Je vais passer par les méthodes standarts .. une fiche et son unité .

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par petitcoucou31 Voir le message
    Merci pour vos réponses..

    Je vais passer par les méthodes standarts .. une fiche et son unité .
    c'est le plus simple, mais sinon rien ne t’empêchait de déclarer un dérivé de TForm avec toutes les méthodes que tu veux, il faut simplement le créer avec TMaForm.CreateNew() au lieu de Create() sinon il réclame un DFM

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Paul TOTH relance ma proposition

    Citation Envoyé par ShaiLeTroll Voir le message
    A noter que l'on peut fournir un gestionnaire d'évènement OnKeydown avec une class procedure en exploitant que le Sender

    il est aussi possible de créer un dérivé de TForm sans DFM mais il faut l'instancier via CreateNew ce qui permet d'avoir quand même les champs Label et Edit en privé (au lieu de published)
    Le CreateNew est la clé de cette technique

    Citation Envoyé par petitcoucou31 Voir le message
    j ... mais je me suis surement mal expliqué car cela n'est pas ma question.
    Pourtant ma réponse était totalement dans ton sens, peut-être qu'un code sera plus simple à comprendre
    Vous avez déjà une belle collection d'approche

    FormClickEventHandler méthode de classe de Form1 utilisé comme Gestionnaire de votre FCL.OnClick (FCL étant ici TSubForm)
    ClickEventHandler méthode de classe de Form1.TSubForm utilisé comme Gestionnaire de FCL.Edit.OnClick
    EditKeyDownEventHandler méthode d'instance de Form1.TSubForm utilisé comme Gestionnaire de FCL.Edit.OnKeyDown

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
      Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        type
          TSubForm = class(TForm)
          strict private
            FEdit: TEdit;
            FLabel: TPanel;
            function GetValue(): string;
            procedure SetValue(const AValue: string);
          private
            procedure EditKeyDownEventHandler(Sender: TObject; var Key: Word; Shift: TShiftState);
            class procedure ClickEventHandler(Sender: TObject);
          protected
            procedure InitializeNewForm(); override;
          public
            property Value: string read GetValue write SetValue;
          end;
      private
        type
          TColoredControl = class(TWinControl);
      private
        class procedure FormClickEventHandler(Sender: TObject);
      public
        procedure AfficheClavier(var Valeur: string);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure CreationClavier8(AForm: TForm);
    begin
      // a défaut de savoir ce que c'est !
      with TBitBtn.Create(AForm) do
      begin
        Parent := AForm;
        Kind := bkOK;
        Align := alBottom;
      end;
    end;
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      V: string;
    begin
      AfficheClavier(V);
      ShowMessage(V);
    end;
     
    class procedure TForm1.FormClickEventHandler(Sender: TObject);
    var
      I: Integer;
    begin
      // Self c'est la classe TForm1
      // On ne peut pas accéder aux membres d'instance et cela évite toute tentation d'utiliser autre chose que le Sender
      if Sender is TForm then
        with TForm(Sender) do
          for I := 0 to ComponentCount - 1 do
            if Components[I] is TWinControl then
              TColoredControl(Components[I]).Color := clSkyBlue; // le petit Hack du Protected
    end;
     
    procedure TForm1.AfficheClavier(var Valeur: string);
    var
      SubForm: TSubForm;
    begin
      SubForm := TSubForm.CreateNew(nil); // inutile de mettre un owner sur une instance géré via un try modal finally
      try
        SubForm.Height := 435;
        SubForm.Width := 322;
        SubForm.Color := clWhite;
        SubForm.OnClick := FormClickEventHandler;
     
        CreationClavier8((*3, 95*)SubForm);
     
        SubForm.Value := Valeur;
        if SubForm.ShowModal() = mrOk then
          Valeur := SubForm.Value;
      finally
        SubForm.Free(); // inutile l'affectation de nil sur une variable locale
      end;
    end;
     
    { TForm1.TSubForm }
     
    class procedure TForm1.TSubForm.ClickEventHandler(Sender: TObject);
    begin
      // Self c'est la classe TForm1.TSubForm
      // On ne peut pas accéder aux membres d'instance
      if Sender is TEdit then
      begin
        if TEdit(Sender).Color = clCream then
          TEdit(Sender).Color := clMoneyGreen
        else
          TEdit(Sender).Color := clCream;
      end
      else if Sender is TPanel then
      begin
        TPanel(Sender).ParentBackground := False;
        if TPanel(Sender).Color = clMoneyGreen then
          TPanel(Sender).Color := clCream
        else
          TPanel(Sender).Color := clMoneyGreen;
      end;
    end;
     
    procedure TForm1.TSubForm.EditKeyDownEventHandler(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      // Self c'est l'instance de TForm1.TSubForm
      Self.FLabel.Caption := IntToStr(Key);
    end;
     
    function TForm1.TSubForm.GetValue(): string;
    begin
      Result := FEdit.Text;
    end;
     
    procedure TForm1.TSubForm.InitializeNewForm();
    begin
      inherited InitializeNewForm();
     
      FEdit := TEdit.Create(Self); // Self va libérer automatiquement, pas besoin de le faire explictement
      FEdit.Parent := Self; // un Enfant ne peut pas exister dans Parent, alors effet de bord, c'est la libération du Parent qui libère l'enfant avant même la notion du Owner
      FEdit.Align := alTop;
      FEdit.Alignment := taCenter;
      FEdit.OnKeyDown := EditKeyDownEventHandler;
      FEdit.OnClick := ClickEventHandler; // petite démo du class procedure au passage comme EventHandler;
     
      FLabel := TPanel.Create(Self); // TStaticText pour la couleur de fond !
      FLabel.Parent := Self;
      FLabel.Align := alTop;
      FLabel.OnClick := ClickEventHandler;
    end;
     
    procedure TForm1.TSubForm.SetValue(const AValue: string);
    begin
      FEdit.Text := AValue;
    end;
     
    end.
    Je pense qu'il faudrait que vous différenciez bien le Sender du Self, de la souplesses des méthodes en Delphi

  11. #11
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    j'ajouterais que je ne vois aucun intérêt à créer manuellement des composants s'ils ne sont pas surchargés...

    typiquement, au lieu d'écrire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
          ed:=TEdit.Create(fcl);
          ed.Parent:=Fcl;
          ed.Align:=alTop;
          ed.Alignment:=taCenter;
     
          ed.Monclick := Fcl.edCLIK ;  // <====== comment déclarer cet evement et l'associer au TEDIT crée dans la fiche  "FCL"  et non Form1 
     
    ...
    on peut faire ceci

    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
     
    type
      TClavierEdit = class(TEdit)
        constructor Create(AOwner: TComponent); override;
        procedure Click; override;
      end;
     
    constructor TClavierEdit.Create(AOwner: TComponent);
    begin
      inherited;
      Align := alTop;
      Alignment := taCenter;
    end;
     
    procedure TClavierEdit.Click;
    begin
      // evement associé au TEDIT crée dans la fiche  "FCL"  
    end;
    je fais ça très souvent sur des dérivés de TMenuItem qui contient des informations supplémentaires pour gérer le clic au lieu d'avoir tout un tas de test dans le OnClick d'un TMenuItem...pareille pour TTreeNode

    mais dans le cas présent il est peut-être plus judicieux de le faire au niveau de la fiche (comme le propose Shai)

    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
     
    type
      TFicheClavier = class(TForm)
      private
       Edit: TEdit;
      public 
       constructor Create(AOwner: TComponent); override;
        procedure EditClick(Sender: TObject);
      end;
     
    constructor TFicheClavier.Create(AOwner: TComponent);
    begin
      inherited;
      Edit := TEdit.Create(Self);
       ...
       Edit.OnClick := EditClick;
    end;
     
    begin
      TFicheClavier.CreateNew(Application);
      ...
    end;

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    TTreeNode ... avec un gestionnaire fourni pour OnCreateNodeClass, on peut même pousser le vice à faire une classe différente par niveau/typologie du noeud pour ajouter les informations business nécessaire et simplifier grandement le code des OnExpand, OnClick ... en utilisant la classe du noeud comme contexte d'une stratégie pour différencier les actions à mener sur chaque typologie de noeud

  13. #13
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    749
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 749
    Points : 500
    Points
    500
    Par défaut
    bonjour

    Merci a vous deux pour votre aide... j'étais déjà passé sur autre chose, mais je vais y revenir dans quelque temps.

    Mais oui je confirme que j'ai encore a creuser au niveau, au niveau des "sender", "self", "owner"...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. evenement dynamique sur Document
    Par shabaninonda dans le forum ASP.NET
    Réponses: 5
    Dernier message: 25/08/2008, 18h08
  2. [Evenement Dynamique] Checkbox
    Par Vin_SuFu_R@T dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 06/02/2008, 10h56
  3. Réponses: 1
    Dernier message: 02/11/2007, 14h06
  4. gestion des evenements dynamique
    Par moniteur41 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/09/2007, 21h22
  5. [débutant] Evenement dynamique d'un champ
    Par tookaina dans le forum VB.NET
    Réponses: 3
    Dernier message: 05/02/2007, 14h31

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