Aucun résultat avec MethodAddress et MethodName
Bonjour.
J'essaye d'utiliser les méthodes MethodAddress et MethodName mais je n'obtiens rien, la première me retournant systématiquement une valeur nil et la seconde une chaîne vide. Et je ne trouve pour ainsi dire aucune information sur ces méthodes. La seule référence, trouvée sur ce site, m'a permis de corriger la façon de récupérer l'adresse de la méthode et la transférer à MéthodName, mais rien.
J'ai essayé depuis TObject, pour me familiariser avec ses méthodes, et comme ça ne marchait pas, avec d'autres classes, TStringList puis une classe faite pour test : mêmes résultats : nil retourné par MethodeAddress et chaîne vide pour l'autre. D'autres méthodes semblent me jouer le même tour.
Un bug d'une vieille version ?
Version : 1.6-dfsg-1 (2016)
FPC : 3.0.0
Le bout de code à intégrer à une application (la TStringList est renvoyée pour afficher dans un TMemo).
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
| type
TClasseA = class(Tobject)
constructor Create;
destructor Destroy;override;
private
Param1 : Single;
Param2 : Integer;
public
function test(ParamArray : array of single): boolean;
end;
var
obj:TObject;
constructor TClasseA.Create;
begin
Param1 := 0;
Param2 := 0;
end;
destructor TClasseA.Destroy;
begin
inherited Destroy;
end;
function TClasseA.test(ParamArray: array of single): boolean;
begin
Param1:=1;
end;
function test_TObject:Tstrings;
var
chn:TStringList;
p:pointer;
s:string;
met:TMethod;
test:TClasseA;
begin
obj:=TObject.Create();
chn:=TStringlist.Create();
chn.Add('affichage l''adresse d''une méthode de l''objet par MethodAddress()');
s:='test';
test:=TClasseA.Create;
p:=test.MethodAddress(s);
if (p=nil) then
chn.Add(' La méthode "'+s+'" n''existe pas')
else
begin
s:=format(' %s situé à %p',[s,p]);
chn.Add(s);
end;
chn.Add('affichage du nom d''une méthode de l''objet dont l''adresse est connue par MethodName()');
met:=TMethod(@test.test);
if (met.Code=nil) then
chn.Add(' La méthode "test" n''existe pas.')
else
chn.Add(' '+obj.MethodName(met.Code));
obj.Free;
result:=chn;
end; |
Merci.