Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - TObject.MethodAddress gibt immer nil zurück
Mitmischer 1703 - So 19.12.10 12:03
Titel: TObject.MethodAddress gibt immer nil zurück
Hi DF!
Ich habe folgende Klassen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| TLibrary = class(TObject) public function HasMethod(AFunc : String) : Boolean; end;
TStdLibrary = class(TLibrary) public function Rotate : Boolean; function Move : Boolean; end; |
Die Implementation der HasMethod-Methode sieht wie folgt aus:
Delphi-Quelltext
1: 2: 3: 4:
| function TLibrary.HasMethod(AFunc: String): Boolean; begin Result := (MethodAddress(AFunc) <> nil); end; |
Sie ergibt jedoch immer false! Sogar bei folgendem Aufruf:
Delphi-Quelltext
1: 2:
| Result := TStdLibrary.Create(Robot); Bla := Result.HasMethod('rotate'); |
Für mich ist das total unverständlich, da TStdLibrary die Methode ja besitzt! Aber HasMethod liefert false zurück...
Warum ergibt die Methode immer false?
jaenicke - So 19.12.10 12:06
Die Methoden stehen bei dir aber unter Public, daher werden keine RTTI Informationen in die Exe geschrieben. Du musst die unter published packen. Nur dann ist in der Exe zur Laufzeit der Methodennname noch bekannt (sonst ist die Methode nur noch eine Adresse).
Mitmischer 1703 - So 19.12.10 12:55
funktioniert, danke! :)
jaenicke - So 19.12.10 13:20
Nebenbei sieht das so aus als könnten Interfaces dir weiterhelfen. Denn die sind ideal, wenn du mehrere Klassen in der selben Hierarchie hast, die teilweise eine Funktionalität implementieren.
Dann kannst du ein Interface IRotateMe oder so erstellen und zur Laufzeit nett anfragen, ob dieses Interface implementiert ist.
Wenn du dann noch die Referenzzählung aushebelst, indem du _AddRef usw. entsprechend selbst überschreibst, kannst du damit wie bisher arbeiten, musst aber nicht über die RTTI gehen und mit Strings auf Methodennnamen testen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!