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 :

Problème avec événement pour composant créé dynamiquement


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Points : 96
    Points
    96
    Par défaut Problème avec événement pour composant créé dynamiquement
    Bonjour,

    Je crée des tlabel dynamiquement selon les enregistrements de ma bdd et le problème est que je veux affecter un événement onClick à chaque label. Je me suis documenté sur google et j'ai trouvé qu'il faut ajouter l'événement dans la déclaration publique mais ça ne marche pas. Voici mon code :
    jai declarer la procedure dans la classe de la forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type
      TForm5 = class(TForm)
        ComboBox1: TComboBox;
        ADOTable1: TADOTable;
        DataSource1: TDataSource;
        ADOQuery1: TADOQuery;
        DataSource2: TDataSource;
        ADOTable2: TADOTable;
        procedure FormCreate(Sender: TObject);
        procedure ComboBox1Change(Sender: TObject);
        Procedure clicktitre  (Sender: TObject);{mon evenement onclick}

    et la création des composants dynamiquement avec l'événement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    xx:=85   ;
    for  i:=1 to self.ADOTable1.RecordCount do
       begin
      with tlabel.Create(self)do
          begin
            parent:=self;
            caption:=self.ADOTable1.FieldValues['titre']  ;
            top:=xx;
            left:=32;
            onclick:=pclicktitre ;{l'evenement}
          end;
         self.ADOTable1.Next;
         xx:=xx+10;
        end;

    et quand j'utilise la procédure comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure tform5.clicktitre(sender:tobject);
      begin
        form4.showmodal;
      end;
    j'ai une erreur qui me dit :

    [dcc32 Erreur] Unit5.pas(108): E2070 Directive inconnue : 'tform5'


    merci de vos réponse.

  2. #2
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    Je dirais qu'il manque probablement une partie des infos ou du code pour détecter l'erreur ...

    Voici un exemple très simple (pour Free Pascal/Lazarus) - cf. fichier attaché pour le projet :
    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
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure LabelClick(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.Terminate;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var T: TLabel;
    var i: integer;
    begin
      for i:=1 to 9 do
        begin
          T := TLabel.Create(self);
          T.Caption := 'Label ' + IntToStr(i);
          T.Left := 10;
          T.Top := 10 + (20*i);
          T.OnClick := @LabelClick;     // without '@' for Delphi, or FPC in Delphi mode
          T.Parent := self;
        end;
      Button2.Enabled := false;         // to not create labels twice
    end;
     
    procedure TForm1.LabelClick(Sender: TObject);
    begin
      ShowMessage(TLabel(Sender).Caption + ' clicked');
    end;
     
    end.

    *** Edit ***

    Après relecture, il semble que vous utilisiez plutôt Delphi. Voici donc également le même projet exemple en Delphi 7.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre régulier Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Points : 96
    Points
    96
    Par défaut
    ya quelque probleme dans l'ouverture du projet car je suis sous delphi xe3 mais apres lecture du code plusieurs fois c'est identique la declaration , les parametres
    je vois pas d'ou vien l'erreur du tform5

  4. #4
    Membre confirmé

    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 145
    Points : 625
    Points
    625
    Par défaut
    Essayez déjà par changer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         onclick:=pclicktitre ;{l'evenement}
    en ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         onclick:=clicktitre ;{l'evenement}
    Si cela ne fonctionne toujours pas après correction de cette erreur, c'est probablement qu'il y a une autre erreur ailleurs: "end" ou "forward" manquant, directive incomplète, ponctuation incorrecte (';' manquant par exemple), etc. ...

    Enfin bref, quelque chose d'autre qui "perturbe" le compilateur.

  5. #5
    Membre régulier Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Points : 96
    Points
    96
    Par défaut
    jai verefier le code plusieurs fois il est juste mais cette erreur sort de nulpar, voici tout le code j'espere que vous m'aideriai
    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
     
    unit Unit5;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Data.DB, Data.Win.ADODB;
     
    type
      TForm5 = class(TForm)
        ComboBox1: TComboBox;
        ADOTable1: TADOTable;
        DataSource1: TDataSource;
        ADOQuery1: TADOQuery;
        DataSource2: TDataSource;
        ADOTable2: TADOTable;
        Procedure clicktitre(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure ComboBox1Change(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
     
      end;
     
    var
      Form5: TForm5;
     
    implementation
     
    {$R *.dfm}
     
    uses Unit4;
     
    procedure TForm5.ComboBox1Change(Sender: TObject);
    var
    cat,tit:string;
    i,xxx,n,y:integer;
    lst_lab :array of tlabel;
    begin
     if y<>0 then
         begin
    for i := 0 to y do
      begin
        lst_lab[y].Destroy;
        lst_lab[y].Free;
      end;
          end;
    xxx:=85;
    n:=1;
    y:=0;
     cat:=combobox1.Items.Text;
     self.ADOQuery1.Prepared:=true;
    self.ADOQuery1.SQL.Text:='select title from discution d inner join cathegorie '+
    'c on d.id_cat=c.id_cat where'+cat+'=nom_cat';
    self.ADOQuery1.ExecSQL;
     
    for i:=0 to self.ADOQuery1.DataSetField.FieldCount-1  do
    begin
     inc(y);
     setlength (lst_lab,y+1);
     lst_lab[y]:=   tlabel.Create(self)   ;
      with lst_lab[y]  do
        begin
          Parent :=self;
          caption:=self.ADOQuery1.Fields.DataSet.Fields.ToString;
          top:=  xxx;
          left:=32;
          name:='lab'+ inttostr(n);
          tag:=y;
        end;
        self.ADOQuery1.Next;
        xxx:=xxx+10;
        n:=n+1;
    end;
     
     
     
    end;
     
    procedure TForm5.FormCreate(Sender: TObject);
    var i,xx:integer;
    begin
     
    if self.ADOTable2.RecordCount <>0 then
    for i := 1 to self.ADOTable2.RecordCount -1 do
      begin
        self.ComboBox1.Items.add(self.ADOTable2.FieldValues['nom_cat'] ) ;
        self.ADOTable2.Next;
     
      end;
    xx:=85   ;
    for  i:=1 to self.ADOTable1.RecordCount do
       begin
      with tlabel.Create(self)do
          begin
            parent:=self;
            caption:=self.ADOTable1.FieldValues['titre']  ;
            top:=xx;
            left:=32;
            onclick:=clicktitre ;
          end;
         self.ADOTable1.Next;
         xx:=xx+10;
        end;
     
      procedure TForm5.clicktitre(sender:tobject);
      begin
        form4.showmodal;
     
      end;
     
     
    end;
     
    end.

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 437
    Points : 3 072
    Points
    3 072
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      procedure TForm5.clicktitre(sender:tobject);
      begin
        form4.showmodal;
     
      end;
    qu'est-ce que ce bout de code fait dans le formcreate ??
    J-L aka Papy pour les amis

  7. #7
    Membre régulier Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Points : 96
    Points
    96
    Par défaut
    vraiment c'est une erreure bete car je suis nouveau sur delphi ,je l'ai sortie de la procedure formcreate et ca marche merci de votre aide

  8. #8
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 437
    Points : 3 072
    Points
    3 072
    Par défaut
    ça arrive même aux meilleurs
    J-L aka Papy pour les amis

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 740
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 285
    Points
    13 285
    Par défaut
    Si ton code était mieux indenté, ça te sauterait au yeux

    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
          left := 32;
          onclick := clicktitre;
        end;
        self.ADOTable1.Next;
        xx := xx + 10;
      end;
    end;
    
      procedure TForm5.clicktitre(Sender: TObject);
      begin
        form4.showmodal;
    
      end;
    
    end;
    
    end.
    EDIT: Oups ! Déjà réglé ! C'est ça d'ouvrir une discussion et de vaquer à d'autres occupations

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/06/2012, 10h40
  2. Probleme avec DateDiff pour les années....
    Par angelevil dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 27/03/2006, 09h19
  3. probleme avec evenements mouseover et mouseout - propriété
    Par polluxArgo dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 21/09/2005, 18h31
  4. Probleme avec ODBC pour la V8.
    Par chad33 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 04/03/2005, 23h57
  5. Réponses: 3
    Dernier message: 24/02/2005, 15h48

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