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
Dynamische Ermittlung: Methodenname
Re: Dynamische Ermittlung: Methodenname
Bei mir geht das so:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(MethodName(MethodAddress('Button1Click')));
end;
-
- Beiträge: 955
- 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
Du darfst nicht den Klassennamen mit angeben, der Methodenname allein reicht.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?
FPC Compiler Entwickler
Re: Dynamische Ermittlung: Methodenname
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;
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;
Re: Dynamische Ermittlung: Methodenname
Die müssen wohl "published" sein:
https://forum.lazarus.freepascal.org/in ... #msg363911
https://forum.lazarus.freepascal.org/in ... #msg363911
Re: Dynamische Ermittlung: Methodenname
Hi Theo,
danke schön für diese Info.
Gruß
Lorca
danke schön für diese Info.

Gruß
Lorca
-
- Beiträge: 955
- 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
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.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"?
FPC Compiler Entwickler