![]() |
Delphi-Version: XE6
Klassen zur Laufzeit auf abstrakte Methoden überprüfen
Hallo Leute,
ich möchte gerne zur Laufzeit eine Liste aller Klassen erstellen, welche von einer bestimmten abstrakten Basisklasse ableiten. Das kann ich bereits mithilfe der RTTI tun. Nun möchte ich aus dieser Liste später aber dynamisch eine Instanz erzeugen. Deshalb sollten die Klassen in dieser Liste also nicht abstrakt sein, bzw. keine abstrakten Methoden haben. Hier auf Stackoverflow habe ich schon eine Lösung dazu gefunden: ![]() Leider scheitert es bei mir an der Zeile
Code:
Denn dazu heißt es
if GetVirtualMethod(c, i) = @_AbstractError then
Code:
Obwohl ich klar und deutlich in der Datei System.pas die Deklaration und Definition von _AbstractError sehe.
Unknown identifier _AbstractError
Hat jemand eine Idee wieso? Denn es wundert mich schon, dass auf Stackoverflow niemand dieses Problem damit hatte. btw: Ich habe die Frage auch hier gestellt: ![]() |
AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen
Die System-Unit ist so ein bissl Eigen.
|
AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen
Hey Himitsu,
die Methode mit System.AbstractErrorProc funktioniert nicht, da diese natürlich eine andere Adresse liefert. Über eine andere bekannte abstrakte Klasse an die Adresse zu kommen, würde zwar funktionieren ist aber m.M.n. nicht schönste Lösung. Lieber wäre mir schon, wenn ich zuverlässig an die Adresse kommen könnte. Zumal die Lösung ja irgendwie funktionieren müsste, da Sie bereits auf Stackoverflow so veröffentlicht wurde. Da hat sich ja keiner beschwert, dass er nicht über _AbstractError an die Adresse kommt :| . Was genau meinst du denn mit " mit diesen Bezeichner kommst du im Assembler an jene Adresse " ? Grüße |
AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen
Zitat:
|
AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen
Zitat:
Du hast doch aber nicht etwa auch dort ein @ davor gemacht? :stupid: |
AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen
Zitat:
Die unterschiedlichen Adressen machen ja auch Sinn, denn die unter AdressErrorProc angegebene Funktion wird ja in _AbstractError aufgerufen. |
AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen
Das ist bereits eine Adresse
und mit @ bekommst dann die Adresse von der Stelle, wo die Adresse steht, anstatt der Adresse selber. :stupid: |
AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen
Ich stehe wohl etwas auf dem Schlauch.
Aber ich bekomme von
Code:
einen Pointer zurück.
GetVirtualMethod(c, i)
Wenn ich Versuche das mit AbstractErrorProc zu vergleichen, also
Code:
bekomme ich den Fehler: Incompatible Types
if GetVirtualMethod(c, i) = AbstractErrorProc
Mit @ davor kann ich es zwar kompilieren, aber bekomme wie gesagt eine andere Adresse. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz