AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Klassen zur Laufzeit auf abstrakte Methoden überprüfen
Thema durchsuchen
Ansicht
Themen-Optionen

Klassen zur Laufzeit auf abstrakte Methoden überprüfen

Ein Thema von Sc0rpe · begonnen am 8. Nov 2021 · letzter Beitrag vom 8. Nov 2021
Antwort Antwort
Sc0rpe

Registriert seit: 3. Mai 2021
7 Beiträge
 
Delphi XE6 Professional
 
#1

Klassen zur Laufzeit auf abstrakte Methoden überprüfen

  Alt 8. Nov 2021, 07:47
Delphi-Version: XE6
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:
How to check if a Delphi class is declared abstract

Leider scheitert es bei mir an der Zeile
Code:
if GetVirtualMethod(c, i) = @_AbstractError then
Denn dazu heißt es
Code:
Unknown identifier _AbstractError
Obwohl ich klar und deutlich in der Datei System.pas die Deklaration und Definition von _AbstractError sehe.

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: Check if a class has abstract functions

Geändert von Sc0rpe ( 8. Nov 2021 um 08:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#2

AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen

  Alt 8. Nov 2021, 09:38
Die System-Unit ist so ein bissl Eigen.
  • mit diesen Bezeichner kommst du im Assembler an jene Adresse
  • oder nimm dir eine Klasse, wo du weißt, dass sie es hat (TStrings), und hol dir die Adresse dort raus
  • oder System.AbstractErrorProc
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Sc0rpe

Registriert seit: 3. Mai 2021
7 Beiträge
 
Delphi XE6 Professional
 
#3

AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen

  Alt 8. Nov 2021, 14:20
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#4

AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen

  Alt 8. Nov 2021, 14:38
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 .
Das könnte ja auch für eine ältere Delphi Version gelten, muss aber in neueren nicht zwingend auch so funktionieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#5

AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen

  Alt 8. Nov 2021, 14:58
die Methode mit System.AbstractErrorProc funktioniert nicht, da diese natürlich eine andere Adresse liefert.
Sollte aber nicht.

Du hast doch aber nicht etwa auch dort ein @ davor gemacht?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Sc0rpe

Registriert seit: 3. Mai 2021
7 Beiträge
 
Delphi XE6 Professional
 
#6

AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen

  Alt 8. Nov 2021, 15:08
Du hast doch aber nicht etwa auch dort ein @ davor gemacht?
Doch natürlich. Wie sollte ich denn sonst die Adresse bekommen, um sie zu vergleichen?

Die unterschiedlichen Adressen machen ja auch Sinn, denn die unter AdressErrorProc angegebene Funktion wird ja in _AbstractError aufgerufen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#7

AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen

  Alt 8. Nov 2021, 15:48
Das ist bereits eine Adresse

und mit @ bekommst dann die Adresse von der Stelle, wo die Adresse steht, anstatt der Adresse selber.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Sc0rpe

Registriert seit: 3. Mai 2021
7 Beiträge
 
Delphi XE6 Professional
 
#8

AW: Klassen zur Laufzeit auf abstrakte Methoden überprüfen

  Alt 8. Nov 2021, 16:16
Ich stehe wohl etwas auf dem Schlauch.

Aber ich bekomme von
Code:
GetVirtualMethod(c, i)
einen Pointer zurück.
Wenn ich Versuche das mit AbstractErrorProc zu vergleichen, also
Code:
if GetVirtualMethod(c, i) = AbstractErrorProc
bekomme ich den Fehler: Incompatible Types
Mit @ davor kann ich es zwar kompilieren, aber bekomme wie gesagt eine andere Adresse.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz