![]() |
Delphi-Version: 10 Seattle
Wie vergleiche ich zwei Prozedurtypen?
An einer Stelle im Code caste ich eine
Delphi-Quellcode:
auf eine
System.SysUtils.TProc
Delphi-Quellcode:
, beispielsweise:
System.Classes.TThreadProcedure
Delphi-Quellcode:
Ich finde dass ich das darf denn
var
proc: TProc; begin TThread.Queue(nil, TThreadProcedure(proc)); end;
Delphi-Quellcode:
und
TProc = reference to procedure;
Delphi-Quellcode:
TThreadProcedure = reference to procedure;
Trotzdem bin ich ein vorsichtiger Mensch und möchte in meinen Tests prüfen ob diese Annahme in der jeweiligen Delphi-Version noch stimmt. Frage: Wie prüfe ich ob
Delphi-Quellcode:
und
TThreadProcedure
Delphi-Quellcode:
kompatibel sind?
TProc
Bislang schaffe ich nur zu prüfen ob beides Typen sind die sich von
Delphi-Quellcode:
ableiten (Compiler-Magic und so). Aber dann?
IInterface
Delphi-Quellcode:
uses
System.SysUtils, System.Classes, System.Rtti; var rttiContext: TRttiContext; a, b: TRttiType; intf: TRttiType; begin rttiContext := TRttiContext.Create(); a := rttiContext.GetType( TypeInfo(TThreadProcedure) ); b := rttiContext.GetType( TypeInfo(TProc) ); // check if both descend from IInterface intf := rttiContext.GetType( TypeInfo(IInterface) ); Assert( a.BaseType = intf ); Assert( b.BaseType = intf ); // what else? // a.GetMethods() = empty array :-( end. |
AW: Wie vergleiche ich zwei Prozedurtypen?
Man müsste prüfen ob die ggf. zusätzliche Argumente dazubekommen haben und von welchem Typ die sind und ob die Parameter-Dingsdabums haben (ohne, var, out, const).
Aber wie mit der RTTI machen? Hm... |
AW: Wie vergleiche ich zwei Prozedurtypen?
Zitat:
![]() Man kommt über RTTI eigentlich schon seit Delphigenerationen an (fast) alles ran. Frage: Wenn das geht
Delphi-Quellcode:
was kommt denn dann bei
intf := rttiContext.GetType( TypeInfo(IInterface) );
Assert( a.BaseType = intf ); Assert( b.BaseType = intf );
Delphi-Quellcode:
raus?
Assert( a.BaseType = b.BaseType );
|
AW: Wie vergleiche ich zwei Prozedurtypen?
Zitat:
Hast du geguckt? |
AW: Wie vergleiche ich zwei Prozedurtypen?
Ja und wenn man weiterguckt, dann findet man mit dem Ansatz auch die Logik um an die Methoden, Proceduren und deren Parameter zu kommen.
In älteren Delphis findet man die Grundlagen in der Unit TypInfo, heute dürfte es ![]() |
AW: Wie vergleiche ich zwei Prozedurtypen?
Zitat:
|
AW: Wie vergleiche ich zwei Prozedurtypen?
Also, ich weiß nicht ob du weiterhin auf Delphi 7 hängst, aber es geht hier um zwei Typinformationen für anonyme Methoden, die zwar gleich definiert sind (reference of procedure), aber nicht zuweisungskompatibel.
Das ist jetzt keine Methode, die an einem Objekt/Klasse dran hängt und sich mit GetMethods oder ähnlichen holen lässt. Intern sind oben genannte nämlich Interfaces. |
AW: Wie vergleiche ich zwei Prozedurtypen?
Laut dieser Seite kommt man an Informationen zu allen Typen innerhalb eines Programmes:
![]() Funktioniert eventuell dashier mit TProc bzw. TThreadProcedure? ![]() Sind die Ergebnisse vergleichbar oder geben einen Ansatz zum Weiterforschen? |
AW: Wie vergleiche ich zwei Prozedurtypen?
Zitat:
Für
Delphi-Quellcode:
Erhält man
Writeln(DumpTypeDefinition(TypeInfo(TThreadProcedure)));
Writeln(DumpTypeDefinition(TypeInfo(TProc)));
Code:
Damit hat man aber nichts gewonnen. Und nein, die GUIDs der Inferfaces sind beide gleich und leer (0000...).
type
TThreadProcedure=Interface(IInterface) end; type TProc=Interface(IInterface) end; |
AW: Wie vergleiche ich zwei Prozedurtypen?
Danke fürs Mitfiebern.
Wie gesagt, ich finde nur heraus dass sich beide von
Delphi-Quellcode:
ableiten. Die RTTI-Methoden spucken für "welche Methoden hat das Teil" und ähnliches rein gar nichts aus.
IInterface
Etwas ganz dummes ist mir noch eingefallen: Solange folgendes noch kompiliert kann ich mir doch eigentlich sicher sein dass alles in Butter ist, oder?
Delphi-Quellcode:
var
proc: TProc; threadProc: TThreadProcedure; begin proc := procedure() begin end; threadProc := procedure() begin end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 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