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
Version imprimable
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
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 parPour moi un string ne peut contenir que des char...Citation:
un string contenant la procedure
Explique plus generalement ton soucis stp...
D'après moi ce qu'il veut c'est pouvoir faire ceci :
Mais ça c'est pas possible dans les langages compilés, comme le Pascal Objet.Code:Button1.OnClick := 'MaFonction';
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 :
Après tu peux récupérer un pointeur vers la fonction avec GetProcAddressCode:exports MaFonction name 'MaFonction';
A vérifier.Code:Button1.OnClick := GetProcAddress(0 {module courant il me semble}, 'MaFonction');
Ok merci sjrd j'essaye ça
Si tu veux affecter une procedure à ton evenement en spécifiant son nom en clair, tu devrais procéder ainsi.
Par contre, une seule chose, il faut que toutes tes procedures aient la même forme, exemple:Code:
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;
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.Code:
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; ...
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.
Exact, j'avais zappé ce passage, j'ai donné ça de tête, pas essayé, autant pout moi :oops: .
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.
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.
Merci pour tout ;)
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 :lol:
Exemple :
Code:
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