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 :

TNotifyEvent et String


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Points : 31
    Points
    31
    Par défaut TNotifyEvent et String
    Salut,

    Je souhaite attribuer dynamiquement un TNotifyEvent via un string

    par example:

    Panel1.OnClick := MyNewEvent;

    MyNewEvent étant un string contenant la procedure.

    Une idéée sur la façon de le réaliser ?

    Lio

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    ben t'as essaye ??

    non parce que si :
    1-tu declare et implemente une fonction de type TNotifyEvent, par example: procedure MaFonction(Sender: TObject);
    2-tu fais Button.OnClick:=MaFonction;
    ca va marcher, dynamiquement tu peux changer la fonction appellee lors de l'evenement.

    En fait je suis pas sur de bien comprendre la question car je vois pas ce que tu veux dire par
    un string contenant la procedure
    Pour moi un string ne peut contenir que des char...
    Explique plus generalement ton soucis stp...
    Desole pour les accents, y'a pas sur mon clavier.

  3. #3
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    D'après moi ce qu'il veut c'est pouvoir faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Button1.OnClick := 'MaFonction';
    Mais ça c'est pas possible dans les langages compilés, comme le Pascal Objet.

    Par contre voici peut-être une astuce, j'ai jamais essayé mais au fond pourquoi pas : tu exportes ta fonction comme tu le ferais pour une DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exports MaFonction name 'MaFonction';
    Après tu peux récupérer un pointeur vers la fonction avec GetProcAddress
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Button1.OnClick := GetProcAddress(0 {module courant il me semble}, 'MaFonction');
    A vérifier.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Ok merci sjrd j'essaye ça

  5. #5
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Si tu veux affecter une procedure à ton evenement en spécifiant son nom en clair, tu devrais procéder ainsi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Var
      MyNewEvent : procedure Of Object;
    begin
      @MyNewEvent := MethodAddress(Edit1.Text);
      If @MyNewEvent<>nil Then
        Panel1.OnClick := MyNewEvent; 
      Else
        Panel1.OnClick := nil;
    end;
    Par contre, une seule chose, il faut que toutes tes procedures aient la même forme, exemple:
    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
     
      TForm1 = class(TForm)
        Edit1: TEdit;
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      Published
        { Déclarations publiées }
        procedure essai;
        procedure essai2;
      end;
      ...
    Var
      MyNewEvent : procedure Of Object;
    begin
      @MyNewEvent := MethodAddress(Edit1.Text);
      If @MyNewEvent<>nil Then
        Panel1.OnClick := MyNewEvent; 
      Else
        Panel1.OnClick := nil;
    end;
      ...
    c'est à dire qu'il faut qu'elles accèptent le même nombre de paramètres ou alors aucun, ici Edit1.Text, n'accèpte que essai ou essai2, ce qui aura pour effets d'appleler la procedure correspondante.
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Attention lil_jam63. Etant donné que ces procédures sont destinées à être affectées à des événements, elles doivent être du même prototype que ceux-ci, donc TNotifyEvent.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  7. #7
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Exact, j'avais zappé ce passage, j'ai donné ça de tête, pas essayé, autant pout moi .
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Sjrd >> Simple precision, si c'est le handle du module courrant que tu veux, c'est HInstance non ?

    Enfin moi j'utilise ca pour chopper l'instance de l'exe ou la dll courrante (ie dans lequel je fait l'appel) pour en extraire les ressouces.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  9. #9
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Juste. Je me suis aussi rappelé que c'était pas 0 mais GetModuleHandle(0). Mais c'est vrai que HInstance est plus pratique et logique.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Merci pour tout

  11. #11
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Bsr,

    En bricolant à partir d'un TStringList tu peux obtenir une syntaxe du genre

    Button1.OnClick := MesMethodes.Methodes['ma fonction'];


    Mais c'est vraiment se prendre la tête pour rien

    Exemple :



    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
    unit Unit3;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm3 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Edit1Exit(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        procedure Essai(Sender: TObject);
        procedure Test(Sender: TObject);    
      end;
     
      TMethodeType = TNotifyEvent;
     
      TMesMethodes = class
      private
        FMethodesList : TStringList;
        procedure SetMethode(const Nom : String; Methode : TMethodeType);
        function  GetMethode(const Nom : String) : TMethodeType;
      public
        constructor Create; virtual;
        destructor Destroy; override;
        property Methodes[const Nom : string]: TMethodeType read GetMethode write SetMethode;
      end;
     
    var
      Form3: TForm3;
      MesMethodes : TMesMethodes;
     
    implementation
     
    {$R *.dfm}
     
    type
      PMethodeType = ^TMethodeType;
     
    constructor TMesMethodes.Create;
    begin
      FMethodesList := TStringList.Create;
    end;
     
    destructor TMesMethodes.Destroy;
    var
      i : Integer;
    begin
      for i:=0 to FMethodesList.Count-1 do
      begin
        if FMethodesList.Objects[i] <> nil then
           Dispose(Pointer(FMethodesList.Objects[i]));
      end;
      FMethodesList.Free;
    end;
     
    procedure TMesMethodes.SetMethode(const Nom : String; Methode : TMethodeType);
    var
      MethodePtr : PMethodeType;
      idx : Integer;
    begin
      idx := FMethodesList.IndexOf(Nom);
      if idx <> -1 then
      begin
        if FMethodesList.Objects[idx] <> nil then
           Dispose(Pointer(FMethodesList.Objects[idx]));
        FMethodesList.Delete(idx);
      end;
      New(MethodePtr);
      MethodePtr^ := Methode;
      FMethodesList.AddObject(Nom,TObject(MethodePtr));
    end;
     
     
    function TMesMethodes.GetMethode(const Nom : String) : TMethodeType;
    var
      idx : Integer;
    begin
      Result := nil;
      idx := FMethodesList.IndexOf(Nom);
      if idx <> -1 then
      begin
        Result := PMethodeType(FMethodesList.Objects[idx])^;
      end;
    end;
     
    procedure TForm3.Essai(Sender: TObject);
    begin
      ShowMessage('Essai');
    end;
     
    procedure TForm3.Test(Sender: TObject);
    begin
      ShowMessage('Test');
    end;
     
    procedure TForm3.FormCreate(Sender: TObject);
    begin
      MesMethodes := TMesMethodes.Create;
      MesMethodes.Methodes['essai'] := Essai;
      MesMethodes.Methodes['test'] := Test;
    end;
     
    procedure TForm3.FormDestroy(Sender: TObject);
    begin
      MesMethodes.Free;
    end;
     
    procedure TForm3.Edit1Exit(Sender: TObject);
    begin
      Button1.OnClick := MesMethodes.Methodes[Edit1.Text];
    end;
     
    end.

    @+
    Php
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

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

Discussions similaires

  1. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  2. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 20h22
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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