![]() |
Allgem. Typ für prozedurale Typen, wie TClass für Klassen
Hallo zusammen,
gibt es eigentlich einen Typen, unter dem alle prozeduralen Typen laufen? So wie TClass für alle möglichen Klassen. Ich würde einen Parameter für eine Methode definieren, dem ich einfach so einen Typ, wie z.B. TNotifyEvent übergeben kann. Hier das ganze als Code, wie ich mir das Vorstelle:
Delphi-Quellcode:
mfg
type
// Prozedurale Definition TMyProcA: procedure({Parameter}); TMyProcB: procedure({Parameter}) of object; // ... irgendwo im Quelltext procedure blub(const ATypeRef: TProcedureType); // <-- TProcedureType: Imaginärer Typ begin if (ATypeRef = TMyProcA) then begin { ... } else if (ATypeRef = TMyProcB) then begin { ... } end { etc. } end; Armin |
Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
Sowas gib es nicht,
aber warte mal 'nen Sekündchen, es gibt da eventuell einen Trick. > praktisch wie bei TIndex aus meinem himXML ... muß aber mal probieren ob's wirklich so klappt [add]
Delphi-Quellcode:
Type TMyProcA = Procedure({Parameter});
TMyProcB = Procedure({Parameter}) of Object; TMyMultiProc = Record Class Operator Implicit(Const Value: TMyProcA): TMyMultiProc; Class Operator Implicit(Const Value: TMyProcB): TMyMultiProc; Private Type TProcType = (ptProcA, ptProcB); Case ProcType: TProcType of ptProcA: (ProcA: TMyProcA); ptProcB: (ProcB: TMyProcB); End; Class Operator TMyMultiProc.Implicit(Const Value: TMyProcA): TMyMultiProc; Begin Result.ProcType := ptProcA; Result.ProcA := Value; End; Class Operator TMyMultiProc.Implicit(Const Value: TMyProcB): TMyMultiProc; Begin Result.ProcType := ptProcB; Result.ProcB := Value; End;
Delphi-Quellcode:
Test und TMyMultiProc müssen in der selben Unit deklariert sein,
Procedure Test(Const Proc: TMyMultiProc);
Begin Case Proc.ProcType of ptProcA: Proc.ProcA({Parameter}); ptProcB: Proc.ProcB({Parameter}); End; End; aber notfalls kann man auch einfach das Private weglassen. :angel: So müßte es möglich sein Test Prozeduren von beiden Typen zu übergeben. Wobei man dieses Beispiel auch ganz einfach per Overloading hätte lösen können, welches auch schon vor Delphi 2006 funktioniert.
Delphi-Quellcode:
Procedure Test(Const Proc: TMyProcA); Overload;
Procedure Test(Const Proc: TMyProcB); Overload; |
Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
Oh, das klingt klasse! Vielen herzlichen Dank! :thumb:
Das mit dem Überladen wollte ich eben verhindern und eben eine Methode schreiben, die mit so ziemlich allem umgehen kann. Mal schauen, was ich draus machen kann und ob das alles funktioniert was ich haben will :zwinker: |
Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
Überladene Funktionen sind aber effektiver.
Ich hatte das nur mal entwickelt, da es gewisse Probleme beim Überladen von Properties gibt. (vorallem in älteren Delphiversionen) |
Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
Ich will einer Klasse ja Multicast-Events beibringen, dafür aber nicht beliebig Methoden schreiben müssen, um dieses zu gewährleisten. Am einfachsten wäre eben eine Liste, die alle Methoden kennt, die aufgerufen werden sollen und zudem die Information bei welchen Event denn die Methode aufgerufen werden soll. Die AddEventListener-Methode sollte daher einer Referenz auf eine beliebige Methode erhalten (unabhängig von deren Signatur) und eben den Event-Typ. Da ich nicht einen extra Enum-Typ angeben wollte, wäre es ganz geschickt gewesen, wenn man TNotifyEvent oder dergleichen übergeben könnte. Das Ganze würde halt Schreibarbeit sparen :mrgreen:
|
Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
OK, ein bissl Arbeit macht es ja so oder so.
- entweder den Transferrecord erstellen und diesen in einer Prozedur auswerten, - oder mehrere überladene Prozeduren TMyMultiProc könnte man dann aber auch gleich als Speichervariable verwenden und notfalls auch noch mit in einem Array oder einer Liste, falls man diese Event-Zeiger speichern möchte. |
Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
Genau das habe ich mir auch gedacht, als ich deinen Code gesehen habe. Ich muss nur gerade unbedingt ein Projekt fertig bekommen, danach habe ich Zeit das mal ausgiebig zu testen.
Habe im Moment ![]() |
Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
Zitat:
TClass ist praktisch ein Zeiger auf diese und abgeleitete Klassen. Prozeduren und Methoden haben aber keine Vererbungshirachien und demnach auch keinen gemeinsamen Vorfahren, welchen man verwenden könnte. Das Einzige was ginge wären Typcasts Prozeduren/Funktionen > Pointer oder Procedure und Methoden nach TMethod (oder so) oder halt "Procedure of Object" |
Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
Wenn du dich auf neues Terrain wagen willst, versuch doch mal TRttiMethod.
|
Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 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 by Thomas Breitkreuz