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 :

Affecter dynamiquement une procédure à un évènement d'un objet crée dynamiquement


Sujet :

Lazarus Pascal

  1. #1
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut Affecter dynamiquement une procédure à un évènement d'un objet crée dynamiquement
    Bonjour,

    Je souhaite affecter dynamiquement une procédure à un évènement d'un objet crée dynamiquement. La procédure devra avoir deux paramètres.

    J'ai regardé partout, tous les exemples, et aucun ne marche.
    Je vous mets le code source :
    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
     
    interface
     
    uses
    ...
     
    procedure liste_entrepriseDblClick(num_societe_temp,nom_societe_temp:string);
     
    type
     
    ...
     
    var 
    ...
    procedure remplir_liste_societe(list,code_list:Tlistbox); 
     
    implementation
     
    ...
    procedure remplir_liste_societe(list,code_list:Tlistbox);
    var Donnee,Donnee2,donnee3:string;
        ImageList:Array of string;
        ReferenceList:Array of string;
        image_temp:TImage;
        Libelle_temp:TLabel;
    begin
     
        ...
     
                   image_temp:=TImage.Create(demarrage_form);
                   image_temp.Parent := demarrage_form.affiche_liste_societe_scrollbox;    //.affiche_liste_societe_scrollbox
                   image_temp.picture.LoadFromFile(Donnee2);
                   image_temp.width:=140;
                   image_temp.proportional:=true;
                   image_temp.left:=nbre_entreprise*200+10;
                   image_temp.top:=40;
     
           ->        image_temp.OnDblClick:=liste_entrepriseDblClick(donnee,donnee2);   <- L'erreur est là, j'ai essayé avec sender:tobject mais pareil, en plus j'ai besoin de passer deux paramètres. Il me dit que les types sont différents.
     
        ...
    end;
    Quelqu'un a une idée ?
    Merci
    Darkyl, celui qui conduit quand il boit pas .(faudra penser passer le permis )

  2. #2
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Darkyl Voir le message
    Je souhaite affecter dynamiquement une procédure à un évènement d'un objet crée dynamiquement. La procédure devra avoir deux paramètres.

    J'ai regarder partout, tout les exemples et aucun ne marche.
    Bonsoir,

    Le code donné ne peut pas fonctionner pour plusieurs raisons :
    * OnDblClick est définie selon un modèle et on ne peut par conséquent que lui affecter une procédure d'un modèle identique. Ce modèle est le plus courant, à savoir TNotifyEvent : TNotifyEvent = procedure(Sender: TObject) of object;
    * l'affectation d'une procédure à une autre utilise (contrairement à Delphi) le @ : PremiereProc := @SecondeProc.

    En fait, pour régler le problème, je te suggère :
    * de placer les données dont vous avez besoin dans un emplacement publique (partie public de la fiche par exemple) ;
    * de créer une procédure liste_entreprise à allouer dynamiquement dont le modèle soit du type TNotifyEvent ;
    * de traiter les données de l'enregistrement dans cette procédure : c'est elle qui ira chercher les deux données dont elle a besoin ;
    * d'affecter cette procédure au gestionnaire d'événement OnDblClick lors de la création de la fiche : les données voulues seront alors traitées

    A bientôt,

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  3. #3
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    Je comprends pas, les deux procédures sont strictement équivalentes puisque ce sont deux doubles clicks...
    Darkyl, celui qui conduit quand il boit pas .(faudra penser passer le permis )

  4. #4
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    C'est bon :

    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
     
    procedure HandleTick (Sender : tObject);
    const HandleTickHack : tMethod = (code : @HandleTick; data : nil);
     
    ...
     
    procedure HandleTick (Sender : tObject);
     begin
       showmessage('ok');
     end;  
     
     
    ...
     
     
    image_temp.OnDblClick:=tNotifyEvent (HandleTickHack);
    3 heures que j'y suis dessus....
    Merci à tous.
    Darkyl, celui qui conduit quand il boit pas .(faudra penser passer le permis )

  5. #5
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Darkyl Voir le message
    Je comprends pas, les deux procédures sont strictement équivalentes puisque ce sont deux doubles clicks...
    Bonjour,

    Non
    Deux procédures sont équivalentes si elles ont la même signature, c'est-à-dire les mêmes arguments (nombre, ordre et type). Ce n'est jamais le nom qui importe : je pourrais en appeler une Jenairienafairedecetteprocedure, pour peu que je lui donne l'argument (Sender: TObject), elle conviendra.

    Quant à la méthode de résolution utilisée, elle est bien trop compliquée : s'il s'agit du schéma d'implémentation d'une méthode (voir TMethod), il existe beaucoup plus simple :

    * on définit un modèle de procédure à affecter à un événement : MyEventProc = TNotifyEvent
    * on l'affecte au gestionnaire de même signature : OnDblClick := @MyEventProc
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  6. #6
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    Bon ça fait deux jours que je patauge et j'arrive toujours pas à affecter une fonction ou procédure à un onclick d'une image créer dynamiquement...
    J'ai beau essayé de comprendre toutes les leçons sur le net, il me trouve toujours une erreur....

    Peut-être auras tu l'amabilité de m'aiguiller un peu plus.
    Darkyl, celui qui conduit quand il boit pas .(faudra penser passer le permis )

  7. #7
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    Dans le code que j'ai montré plus haut, si je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure HandleTick (Sender : tObject);
     var n:integer;
     begin
       with Sender as TImage do
         begin
         n:=Tag;
     
         showmessage('Vous avez cliquer sur '+inttostr(n));
         end;
     end;
    avec evidemment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image_temp.tag:=StrToInt(Copy(num_societe, 11, length(num_societe)-10));
    Il me compile bien mais me fait une erreur quand je doubleclick...
    Darkyl, celui qui conduit quand il boit pas .(faudra penser passer le permis )

  8. #8
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Darkyl Voir le message
    Bon ça fait deux jours que je patauge et j'arrive toujours pas à affecter une fonction ou procédure à un onclick d'une image créer dynamiquement...
    J'ai beau essayé de comprendre toutes les leçons sur le net, il me trouve toujours une erreur....

    Peut-être auras tu l'amabilité de m'aiguiller un peu plus.
    Les gestionnaires sont une mécanique assez avancée lorsqu'on sort de leur simple remplissage par un clic dans l'inspecteur d'objet

    Pour une exploitation de ces gestionnaires dans le cadre d'un projet réel, je me permets de te renvoyer au logiciel GVLOGO que j'ai écrit pour le site. Sa publication est presque terminée Je te conseille de te rendre à la partie II-B Le traitement des erreurs.
    Voici le lien pour accéder à ce qui pourrait t'aider je crois :
    GVLOGO

    Si ce n'est pas très clair car trop technique (ou mal formulé ), je prépare un petit condensé que je vais poster sous peu.

    Bon courage,

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  9. #9
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Voilà qui devrait être plus clair, je l'espère

    Le code suivant fonctionne avec un projet VIDE : il suffit de créer une nouvelle application et de cliquer sur OnCreate de la fiche dans le panneau événements de l'inspecteur d'objet pour créer le gestionnaire de départ.
    En fait, il pourrait s'agir de n'importe quelle procédure dans la mesure où l'image créée l'est avec un propriétaire déterminé (ici, Self, c'est-à-dire la fiche) : comme l'image a un propriétaire, c'est lui qui s'occupera de la libération des ressources mobilisées.

    J'ai commenté au maximum le code afin qu'il soit compréhensible.
    Voici le projet complet testé avec W8.1 dev.7z

    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 Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
      ExtCtrls; // cette unité contient le composant TImage
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { private declarations }
        LI: Integer; // variable de travail
        MyImage: TImage; // mon image
        procedure MyWork(Sender: TObject); // c'est le travail à effectuer en cas de clic
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    // *** création de la fiche ***
    begin
      // On crée l'image avec la fiche comme propriétaire
      // La fiche est indiquée par Self (fourni par l'application)
      MyImage := TImage.Create(Self);
      // Il lui faut des dimensions pour pouvoir exister
      MyImage.Height := 47; // sa hauteur
      MyImage.Width := 280; // sa largeur
      // je mets quelque chose dans l'image (pour la voir !)
      MyImage.Picture.LoadFromFile('dev.gif');
      // j'ajuste l'image
      MyImage.Stretch := True;
      // Il lui faut aussi un parent pour s'afficher
      MyImage.Parent := Self; // c'est la fiche
      // On indique quel est le gestionnaire OnClick de l'image
      MyImage.OnClick := @MyWork;
    end;
     
    procedure TForm1.MyWork(Sender: TObject);
    // *** en cas de clic sur l'image ***
    // L'en-tête de la procédure est EXACTEMENT celui de OnClick
    begin
      // Là, je fais mon travail : la couleur de la fiche change à chaque clic
      Inc(LI);
      LI := LI mod 3;
      case LI of
        0: Form1.Color := clRed;
        1: Form1.Color := clBlue;
        2: Form1.Color := clYellow;
      end;
    end;
     
    end.
    J'espère que ce code te sera utile.

    Gilles

    PS : attention de ne pas marquer prématurément la discussion comme close, car je risque d'être un des rares à me promener ici !
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  10. #10
    Membre averti
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Points : 352
    Points
    352
    Billets dans le blog
    1
    Par défaut
    roooo, dommage que je doive aller au boulot, je regarderai cela ce soir, j'ai hâte, merci beaucoup, tu m'enlève une poutre du pied.

    En fait, je reprogramme une sorte de composant TTreeView mais en mieux, évidemment Je te tiens au courant, encore merci, à première vu, je vais pouvoir faire ce qu'il me plait et mieux comprendre.
    Darkyl, celui qui conduit quand il boit pas .(faudra penser passer le permis )

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/01/2014, 17h30
  2. [Pro*C] Appel dynamique à une procédure stockée
    Par wedgeantilles dans le forum Interfaces de programmation
    Réponses: 3
    Dernier message: 22/10/2008, 09h19
  3. Attribuer une feuille de style CSS à un objet crée dynamiquement
    Par Sergejack dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/10/2007, 10h23
  4. Appeler dynamiquement une procédure stockée
    Par Mark531 dans le forum Access
    Réponses: 1
    Dernier message: 05/09/2006, 17h49
  5. Réponses: 11
    Dernier message: 03/06/2005, 15h38

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