Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie vergleiche ich zwei Prozedurtypen? (https://www.delphipraxis.net/198728-wie-vergleiche-ich-zwei-prozedurtypen.html)

Der schöne Günther 26. Nov 2018 19:32

Delphi-Version: 10 Seattle

Wie vergleiche ich zwei Prozedurtypen?
 
An einer Stelle im Code caste ich eine
Delphi-Quellcode:
System.SysUtils.TProc
auf eine
Delphi-Quellcode:
System.Classes.TThreadProcedure
, beispielsweise:
Delphi-Quellcode:
var
   proc: TProc;
begin
   TThread.Queue(nil, TThreadProcedure(proc));
end;
Ich finde dass ich das darf denn
Delphi-Quellcode:
TProc = reference to procedure;
und
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:
TThreadProcedure
und
Delphi-Quellcode:
TProc
kompatibel sind?

Bislang schaffe ich nur zu prüfen ob beides Typen sind die sich von
Delphi-Quellcode:
IInterface
ableiten (Compiler-Magic und so). Aber dann?


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.

TiGü 27. Nov 2018 11:04

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...

Delphi.Narium 27. Nov 2018 12:14

AW: Wie vergleiche ich zwei Prozedurtypen?
 
Zitat:

Zitat von TiGü (Beitrag 1419341)
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...

Guckstdu u. a. hier: https://www.delphipraxis.net/194103-...-via-rtti.html
Man kommt über RTTI eigentlich schon seit Delphigenerationen an (fast) alles ran.

Frage:

Wenn das geht
Delphi-Quellcode:
intf := rttiContext.GetType( TypeInfo(IInterface) );
Assert( a.BaseType = intf );
Assert( b.BaseType = intf );
was kommt denn dann bei
Delphi-Quellcode:
Assert( a.BaseType = b.BaseType );
raus?

TiGü 27. Nov 2018 12:27

AW: Wie vergleiche ich zwei Prozedurtypen?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1419354)
Zitat:

Zitat von TiGü (Beitrag 1419341)
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...

Guckstdu u. a. hier: https://www.delphipraxis.net/194103-...-via-rtti.html
Man kommt über RTTI eigentlich schon seit Delphigenerationen an (fast) alles ran.

Hab ich geguckt, habe gesehen das es da nicht um procedure/function Argumente bzw. Parameter ging, sondern um Enum zu String und/oder zurück.
Hast du geguckt?

Delphi.Narium 27. Nov 2018 12:42

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 System.TypInfo sein.

TiGü 27. Nov 2018 13:23

AW: Wie vergleiche ich zwei Prozedurtypen?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1419357)
Ja und wenn man weiterguckt, dann findet man mit dem Ansatz auch die Logik um an die Methoden, Proceduren und deren Parameter zu kommen.

Welche Beitragsnummer soll das sein?

TiGü 27. Nov 2018 13:26

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.

Delphi.Narium 27. Nov 2018 13:54

AW: Wie vergleiche ich zwei Prozedurtypen?
 
Laut dieser Seite kommt man an Informationen zu allen Typen innerhalb eines Programmes:
http://docwiki.embarcadero.com/RADSt...pinformationen

Funktioniert eventuell dashier mit TProc bzw. TThreadProcedure?

https://theroadtodelphi.com/2010/10/...pe-definition/

Sind die Ergebnisse vergleichbar oder geben einen Ansatz zum Weiterforschen?

TiGü 27. Nov 2018 14:25

AW: Wie vergleiche ich zwei Prozedurtypen?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1419371)
Laut dieser Seite kommt man an Informationen zu allen Typen innerhalb eines Programmes:
http://docwiki.embarcadero.com/RADSt...pinformationen

Funktioniert eventuell dashier mit TProc bzw. TThreadProcedure?

https://theroadtodelphi.com/2010/10/...pe-definition/

Sind die Ergebnisse vergleichbar oder geben einen Ansatz zum Weiterforschen?

Nicht so wirklich.
Für
Delphi-Quellcode:
  Writeln(DumpTypeDefinition(TypeInfo(TThreadProcedure)));
  Writeln(DumpTypeDefinition(TypeInfo(TProc)));
Erhält man
Code:
type
  TThreadProcedure=Interface(IInterface)
  end;

type
  TProc=Interface(IInterface)
  end;
Damit hat man aber nichts gewonnen. Und nein, die GUIDs der Inferfaces sind beide gleich und leer (0000...).

Der schöne Günther 27. Nov 2018 16:04

AW: Wie vergleiche ich zwei Prozedurtypen?
 
Danke fürs Mitfiebern.

Wie gesagt, ich finde nur heraus dass sich beide von
Delphi-Quellcode:
IInterface
ableiten. Die RTTI-Methoden spucken für "welche Methoden hat das Teil" und ähnliches rein gar nichts aus.


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 02:12 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