AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Allgem. Typ für prozedurale Typen, wie TClass für Klassen

Allgem. Typ für prozedurale Typen, wie TClass für Klassen

Ein Thema von s.h.a.r.k · begonnen am 2. Jan 2010 · letzter Beitrag vom 3. Jan 2010
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Allgem. Typ für prozedurale Typen, wie TClass für Klassen

  Alt 2. Jan 2010, 11:45
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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 2. Jan 2010, 11:53
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.

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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

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

  Alt 2. Jan 2010, 12:25
Oh, das klingt klasse! Vielen herzlichen Dank!

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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 2. Jan 2010, 12:33
Überladene Funktionen sind aber effektiver.

Ich hatte das nur mal entwickelt, da es gewisse Probleme beim Überladen von Properties gibt.
(vorallem in älteren Delphiversionen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

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

  Alt 2. Jan 2010, 13:03
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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 2. Jan 2010, 13:20
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

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

  Alt 2. Jan 2010, 14:13
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 2. Jan 2010, 14:45
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"
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

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

  Alt 2. Jan 2010, 16:47
Wenn du dich auf neues Terrain wagen willst, versuch doch mal TRttiMethod.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#10

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

  Alt 3. Jan 2010, 17:26
Zitat von himitsu:
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 aber somit auch weniger Arbeit, da ich in nächster Zeit weniger probieren muss.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 10:42 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