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
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...un string contenant la procedure
Explique plus generalement ton soucis stp...
Desole pour les accents, y'a pas sur mon clavier.
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 GetProcAddress
Code : Sélectionner tout - Visualiser dans une fenêtre à part exports MaFonction name 'MaFonction';
A vérifier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Button1.OnClick := GetProcAddress(0 {module courant il me semble}, 'MaFonction');
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.
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 : 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;
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 : 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; ...
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.
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
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.
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager