Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Typen-Deklarationen


HelgeLange - Mo 27.10.08 18:59
Titel: Typen-Deklarationen
Sorry wegen Titel, aber keine AHnung, wie man das Problem mit ein paar Worten beschreiben kann :(

Ich habe eine Deklaration für einen Funktionstype (Event für Delphi-Komponente)Type TMyEvent = procedure(Sender: TObject; aRec: Pointer) of object;

Dieses Event gebe ich auch in aRec innerhalb einer Struktur mit, das Rekord deklariert sich ungefähr so :

Delphi-Quelltext
1:
2:
3:
4:
5:
Type RMyRec = packed record
       nID : Integer;
       ...
       aEvent : TMyEvent;
     end;


Nun würde ich aber gern im Event das aRec nicht als Pointer übergeben, sondern typisiert, allerdings geht das nicht so einfach, da

a) beide im Interface-Teil stehen müssen (wegen Sichtbarkeit) und
b) offensichtlich sich beide kennen müssen

hat einer 'ne Idee, wie man das lösen kann ?


delfiphan - Mo 27.10.08 20:57

Obwohl technisch nichts dagegen spricht lässt der Compiler dies nicht zu. Eine Forward-Deklaration bei Records gibt es nicht. Du müsstest mit Pointers arbeiten, mit Klassen oder mit Casts (im Record TMethod angeben und vor dem Aufruf auf TMyEvent casten).

Delphi lässt Forwarddeklarationen bei records nicht zu, weil bei rekursiven Recorddeklarationen die Grösse der Records nicht definiert wäre. In diesem Fall wird diese zu restriktive Einschränkung zum Verhängnis.

Gewisse rekursive Definitionen (Stichwort Units) lassen sich in Delphi leider nicht lösen. Ein häufiger Kritikpunkt.


HelgeLange - Mo 27.10.08 23:16

Naja, werd ich wohl weiterhin damit leben müssen, im Event immer auf den Type zu casten :(
Dachte nur, dass wenn ich eh schon am Aufräumen bin (muss alles etwas umbauen für Delphi2009 mit seinen neuen UnicodeStrings), dann kann ich das auch gleich in Angriff nehmen...

Danke für die Antwort..


BenBE - Di 28.10.08 14:17

Delphi sollte bedingt "Forward"-Deklarationen zulassen, wenn beide Typ-Deklarationen im gleichen Type-Block definiert sind. Hab das aber grad nicht getestet.