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

Delphi Discussion :

[D5] accès aux évènements de composants créés dynamiquement


Sujet :

Delphi

  1. #1
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut [D5] accès aux évènements de composants créés dynamiquement
    Bonsoir!
    J'ai trouvé ce post de Malatar en réponse à une question de arkzor le 18/02/2007 22h07.
    Pour en comprendre le fonctionnement, je l'ai modifié et ajouté un TrackBar créé dynamiquement (en utilisant le même modèle).
    ça fonctionne correctement.

    Peut-on accéder aux évènements (OnChange par exemple) de ces objets?

    Comment?

    Citation Envoyé par Malatar
    Voici un exemple de création dynamique de composants :

    - 1 JvCaptionPanel (que tu pourras remplacer par un panel
    - 3 label créé dynmiquement dans le JvCaptionPanel

    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
     
    procedure CreateItems(sName : string);
    var
      jvcnPanel : TjvCaptionPanel;
      lblSource : TLabel;
      lblDest   : TLabel;
      lblEtat   : TLabel;
      Compo : TComponent;
    begin
      jvcnPanel := TJvCaptionPanel.Create(frmMain.ScrollBox1);
      With jvcnPanel do
      begin
        Align := alTop;
        CaptionPosition := dpTop;
        Name := 'jvcn' + sName;
        OutlookLook := true;
        Height := 80;
        Parent := frmMain.ScrollBox1;
        Caption := '';
        Resizable := False;
        Locked := True;
        Visible := True;
      end;
     
      Compo := TJvCaptionPanel(frmMain.ScrollBox1.findComponent('jvcn' + sName));
      lblSource := TLabel.Create(Compo);
      With lblSource do
      begin
        Left := 8;
        Top := 24;
        Name := 'ES' + sName;
        Parent := TJvCaptionPanel(Compo);
        Caption := '';
        Visible := True;
      end;
     
      lblDest := TLabel.Create(Compo);
      With lblDest do
      begin
        Top := 40;
        Left := 8;
        Name := 'ED' + sName;
        Parent := TJvCaptionPanel(Compo);
        Caption := '';
        Visible := True;
      end;
     
      lblEtat := TLabel.Create(Compo);
      With lblEtat do
      begin
        Top := 56;
        Left := 8;
        Name := 'ET' + sName;
        Parent := TJvCaptionPanel(Compo);
        Caption := '';
        Visible := True;
      end;
      Application.ProcessMessages;
     
    end;
    Merci.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 454
    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 454
    Points : 24 866
    Points
    24 866
    Par défaut
    Les Gestionnaires d'Evènements sont des propriétés comme les autres ... à part que stocker un type simple ou objet, c'est un pointeur de procédure ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With ... do
      begin
        OnBidule := Self.MaFonctionPourBidule;
      end;
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          BtnMouse := TMouseButton.Create(Self);
       BtnMouse.Parent := GrpDynControl;
       BtnMouse.Left := BtnColor.Width;
       BtnMouse.Top := 1;
       BtnMouse.Caption := 'Go';
       BtnMouse.OnClick := BtnMouseClick;
       BtnMouse.OnMouseLeave := BtnMouseMouseLeave;
       BtnMouse.OnMouseEnter := BtnMouseMouseEnter;
    ayant dans un objet (dans notre cas la fenêtre qui crée le bouton, donc Self)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          procedure BtnMouseClick(Sender: TObject);
          procedure BtnMouseMouseLeave(Sender: TObject);
          procedure BtnMouseMouseEnter(Sender: TObject);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut
    Bonsoir,
    Citation Envoyé par ShaiLeTroll
    Les Gestionnaires d'Evènements sont des propriétés comme les autres ... à part que stocker un type simple ou objet, c'est un pointeur de procédure ...
    Je ne voudrais pas mettre un troll trop en colère,
    mais "il me manque un truc" ligne en rouge.
    Comme il y a 3 paramètres dans ma déclaration, il m'en faut 3 dans l'appel et je ne sais pas quoi mettre pour figurer le sender de la déclaration.
    Je tourne dessus depuis hier et rien à faire.
    ( j'ai cru bon de déclarer var TrB: TTrackBar; var Lbl :TLabel comme paramètres variables afin de pouvoir "faire suivre" les modifications. Est-ce utile?)
    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
    unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls, ComCtrls ;
    type
      TfrmMain = class(TForm)
        Button1: TButton;
        ScrollBox1: TScrollBox;
        procedure Button1Click(Sender: TObject);
        procedure FormActivate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        procedure CreateItems(sName : string);
        procedure MaJTB(Sender: TObject; var TrB: TTrackBar; var Lbl :TLabel);
      end;
    var
      frmMain: TfrmMain;
      I : Byte;
    implementation
    
    {$R *.DFM}
    
    procedure TfrmMain.MaJTB(Sender: TObject; var TrB: TTrackBar; var Lbl :TLabel);
    begin
      Lbl.Caption := IntToStr(TrB.Position);
    end;
    
    procedure TfrmMain.CreateItems(sName : string);
    var
      MonPanel  : TPanel;
      lblEtat   : TLabel;
      TB        : TTrackBar;
      Compo     : TComponent;
      CompoTB   : TComponent;
    begin
      MonPanel := TPanel.Create(frmMain.ScrollBox1);
      With MonPanel do
      begin
        Align := alTop;
        Name := 'Mon' + sName;
        Height := 260;
        Parent := frmMain.ScrollBox1;
        //Caption := '';
        Caption := Name;
        Locked := True;
        Visible := True;
      end;
    
    
      Compo := TPanel(frmMain.ScrollBox1.findComponent('Mon' + sName));
    
      lblEtat := TLabel.Create(Compo);
      With lblEtat do
      begin
        Top := 44;
        Left := 8;
        Name := 'ET' + sName;
        Parent := TPanel(Compo);
        Caption := '0';
        Visible := True;
      end;
    
      CompoTB := TTrackBar(frmMain.ScrollBox1.findComponent('Mon' + sName));
      TB := TTrackBar.Create(CompoTB);
      With TB do
      begin
        Left := 8;
        Top := 64;
        Max := 12;
        Name := 'TB' + sName;
        Parent :=  TTrackBar(CompoTB);
        Visible := True;
        OnChange := Self.MaJTB(Il_Manque_un_truc,TB,lblEtat);
      end;
      Application.ProcessMessages;
    end;
    
    procedure TfrmMain.Button1Click(Sender: TObject);
    begin
      Inc(I);
      CreateItems('Conteneur' + IntToStr(I))
    end;
    
    procedure TfrmMain.FormActivate(Sender: TObject);
    begin
     I := 0;
    end;
    end.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    MelkInarian a écrit:
    OnChange := Self.MaJTB(Il_Manque_un_truc,TB,lblEtat);
    Ce n'est pas un appel c'est une affectation!
    Donc tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OnChange := Self.MaJTB;
    MajTB doit être de type TnotifyEvent.
    L'evenement OnChange appelera la procedure MaJTB;

  5. #5
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Fabrice ROUXEL 1
    MelkInarian a écrit:
    Ce n'est pas un appel c'est une affectation!
    Donc tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OnChange := Self.MaJTB;
    L'evenement OnChange appelera la procedure MaJTB;
    Il n'y a donc pas moyen de passer, en tant que variables, les objets créés dans cette procédure pour les utiliser dans la procédure gestionnaire d'évènement?
    Merci,

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Il faut respecter les prototypes. OnChange est de type TNotityEvent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type TNotifyEvent = procedure (Sender: TObject) of object;

  7. #7
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Fabrice ROUXEL 1
    Il faut respecter les prototypes. OnChange est de type TNotityEvent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type TNotifyEvent = procedure (Sender: TObject) of object;
    Merci pour ces explications.
    Je me coucherai moins bète ce soir!

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

Discussions similaires

  1. Accès aux éléments du DOM chargés dynamiquement
    Par baldeadama dans le forum jQuery
    Réponses: 1
    Dernier message: 27/09/2014, 15h26
  2. [SimpleXML] soucis accès aux données enfants d'enfants dynamique
    Par jerome572 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 17/01/2011, 15h44
  3. Événements sur composants créés dynamiquement
    Par systeme1 dans le forum Delphi
    Réponses: 4
    Dernier message: 11/02/2007, 16h08
  4. parent/owner et composants créés dynamiquement
    Par OutOfRange dans le forum Delphi
    Réponses: 2
    Dernier message: 26/09/2006, 15h46
  5. Gestion séparée de composants créés dynamiquement
    Par anarpunk dans le forum Composants VCL
    Réponses: 8
    Dernier message: 15/06/2005, 10h57

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