Dynamische Ermittlung: Methodenname

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Lorca
Beiträge: 127
Registriert: Di 3. Nov 2020, 12:25

Dynamische Ermittlung: Methodenname

Beitrag von Lorca »

Hi,

während jede von TObject abgeleitete Klasse die Methoden: UnitName und Classname zur Verfügung stellt und diese auch korrekt liefert, ist das Handling mit "MethodName" nicht ganz so trivial.
Diese Methode erwartet eine Variable vom Typ: codepointer.
Wenn ich nun über die Methode: MethodAddress den Codepointer ermitteln lasse und diesen dann an MethodName übergebe, erhalte ich immer einen leeren String.
Also:
ShowMessage( Self.MethodName( Self.MethodAddress('TFORM1.Irgend_ein_MethodenName') );

Kann jemand sagen was hier falsch läuft? Muss eine bestimmte Unit dafür eingebunden werden?


Gruß
Lorca

Benutzeravatar
theo
Beiträge: 9312
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamische Ermittlung: Methodenname

Beitrag von theo »

Bei mir geht das so:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(MethodName(MethodAddress('Button1Click')));
end;  

PascalDragon
Beiträge: 574
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Dynamische Ermittlung: Methodenname

Beitrag von PascalDragon »

Lorca hat geschrieben:
Sa 19. Feb 2022, 10:42
ShowMessage( Self.MethodName( Self.MethodAddress('TFORM1.Irgend_ein_MethodenName') );

Kann jemand sagen was hier falsch läuft? Muss eine bestimmte Unit dafür eingebunden werden?
Du darfst nicht den Klassennamen mit angeben, der Methodenname allein reicht.
FPC Compiler Entwickler

Lorca
Beiträge: 127
Registriert: Di 3. Nov 2020, 12:25

Re: Dynamische Ermittlung: Methodenname

Beitrag von Lorca »

Hi,

ja, das stimmt zwar, aber wenn du eine eigene, normale Methode damit ermitteln willst, funktioniert es nicht.
Und ich frage mich warum das so ist? Geht das nur bei "TNotifyEvent's"?


procedure Tform1.Test_Methode; -->> Diese Methode funktioniert nicht:.
begin
ShowMessage(MethodName(MethodAddress('Test_Methode')));
end;


PROCEDURE Tform1.Button1click( Sender : Tobject) ;
BEGIN
ShowMessage(MethodName(MethodAddress('Button1click')));
Test_Methode;
End;

Benutzeravatar
theo
Beiträge: 9312
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamische Ermittlung: Methodenname

Beitrag von theo »


Lorca
Beiträge: 127
Registriert: Di 3. Nov 2020, 12:25

Re: Dynamische Ermittlung: Methodenname

Beitrag von Lorca »

Hi Theo,

danke schön für diese Info. :)


Gruß
Lorca

PascalDragon
Beiträge: 574
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Dynamische Ermittlung: Methodenname

Beitrag von PascalDragon »

Lorca hat geschrieben:
So 20. Feb 2022, 08:15
ja, das stimmt zwar, aber wenn du eine eigene, normale Methode damit ermitteln willst, funktioniert es nicht.
Und ich frage mich warum das so ist? Geht das nur bei "TNotifyEvent's"?
MethodAddress und MethodName funktionieren nur mit published-Methoden. Für alles andere kann in Zukunft die Extended RTTI eingesetzt werden, dann können aber auch nicht die beiden Methoden dafür genutzt werden, sondern die entsprechende Funktionalität aus der TypInfo und Rtti Unit.
FPC Compiler Entwickler

Antworten