Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Allgem. Typ für prozedurale Typen, wie TClass für Klassen (https://www.delphipraxis.net/145475-allgem-typ-fuer-prozedurale-typen-wie-tclass-fuer-klassen.html)

s.h.a.r.k 2. Jan 2010 12:45


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:
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;
mfg
Armin

himitsu 2. Jan 2010 12:53

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:
Procedure Test(Const Proc: TMyMultiProc);
  Begin
    Case Proc.ProcType of
      ptProcA: Proc.ProcA({Parameter});
      ptProcB: Proc.ProcB({Parameter});
    End;
  End;
Test und TMyMultiProc müssen in der selben Unit deklariert sein,
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;

s.h.a.r.k 2. Jan 2010 13:25

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:

himitsu 2. Jan 2010 13:33

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)

s.h.a.r.k 2. Jan 2010 14:03

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:

himitsu 2. Jan 2010 14:20

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.

s.h.a.r.k 2. Jan 2010 15:13

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 diese Lösung hier umgesetzt, wobei ich halt immer noch nicht so richtig glücklich damit bin.

himitsu 2. Jan 2010 15:45

Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
 
Zitat:

Zitat von s.h.a.r.k
Allgem. Typ für prozedurale Typen, wie TClass für Klassen

PS: Alle Klassen sind von TObject abgeleitet oder von irgendeiner Klasse, welche auch irgendwie von TObject abgeleitet wurde.

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"

Uwe Raabe 2. Jan 2010 17:47

Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
 
Wenn du dich auf neues Terrain wagen willst, versuch doch mal TRttiMethod.

s.h.a.r.k 3. Jan 2010 18:26

Re: Allgem. Typ für prozedurale Typen, wie TClass für Klasse
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von s.h.a.r.k
Allgem. Typ für prozedurale Typen, wie TClass für Klassen

PS: Alle Klassen sind von TObject abgeleitet oder von irgendeiner Klasse, welche auch irgendwie von TObject abgeleitet wurde.

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"

Das macht meinen Plan zunichte :mrgreen: aber somit auch weniger Arbeit, da ich in nächster Zeit weniger probieren muss.


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