Bonjour à tous
Dans le code suivant, j'ai une classe avec deux fonctions : UN utilise une variable globale (cc) et DEUX utilise une variable (dd) de la classe.
L'appel aux fonctions directes ne pose pas de problème.
J'ai un tableau fct: array[1..2] of function : byte; que j'ai affecté dans le create fct[1]:=@TMaclasse.UN; fct[2]:=@TMaclasse.DEUX;.
L'idée étant d'appeler des fonctions avec un indice (lui même calculé).
L'appel aux fonctions indirectes ne pose pas de problème pour fct[1] mais j'ai une violation d'accès pour fct[2].
Pistes de résolution explorées :
- dans la fonction DEUX, c'est bien l'utilisation de la variable dd qui pose problème (problème de portée)
- dans la fonction UN si j'enlève le résultat // result:=0; je n'ai plus d'erreur non plus ... curieux.
Si dd est une variable globale ça marche, mais sans mon appli, il s'agit bien d'une variable de la classe.
Voici le code :
J'avoue malgré la simplicité du code (réduit pour mettre le problème en évidence).
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 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMaclasse = class dd:integer; fct: array[1..2] of function : byte; function UN : byte; function DEUX : byte; constructor create; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; cc:integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var mc:TMaclasse; b:byte; begin mc:=TMaclasse.create; b:=mc.UN; // ok b:=mc.DEUX; // ok b:=mc.fct[1]; // ok b:=mc.fct[2]; // provoque une violation d'accès mc.free; end; { TMaclasse } constructor TMaclasse.create; begin fct[1]:=@TMaclasse.UN; fct[2]:=@TMaclasse.DEUX; end; function TMaclasse.UN: byte; begin inc(cc); showmessage('fonction UN '+inttostr(cc)); result:=0; // pas d'erreur en supprimant cette ligne end; function TMaclasse.DEUX: byte; begin inc(dd); showmessage('fonction DEUX '+inttostr(dd)); result:=0; end; end.
Si vous avez une idée de solution, je suis preneur ... et également l'explication qu'en supprimant le résultat de la fonction UN, ça ne fait plus l'erreur.
Je vous remercie d'avance pour vos retours.
Jean-Michel
Partager