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 : 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
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.