Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Eigenen Typ in Klasse verwenden


K_wave - Do 08.05.08 12:24
Titel: Eigenen Typ in Klasse verwenden
Hallo zusammen!

ich habe eine Frage zum Deklarieren von Typen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
   TCustomTreeObjectArray=array of TCustomTreeObject;
    TCustomTreeObject=class(TObject)
        private
               myParent:TCustomTreeObject;
        public
               function GetChilds:TCustomTreeObjectArray;
    end;


Definiere ich TCustomTreeObjectArray NACH TCustomTreeObject dann kennt die Klasse TCustomTreeObject den Typen TCustomTreeObjectArray nicht.
Definiere ich TCustomTreeObjectArray VOR TCustomTreeObject dann kennt die Definition von TCustomTreeObjectArray den Typen TCustomTreeObject nicht.

Ich könnte z.B. TCustomTreeObjectArray als array of TObject deklarieren, ist aber unschön da ich dann jedes mal wieder auf TCustomTreeObject casten müsste.

Wie kann ich dieses Problem Lösen? Gibt es in Delphi eine Möglichkeit erweiterte Prototypen zu definieren?

Vielen Dank
Grüsse


JayEff - Do 08.05.08 12:29

Dazu gibts die Foreward deklaration. In Ada gehts so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type X; //in delphi schreibt man hier irgendwie das Schlüsselwort 'forward' hin.
type Y is record
  a : Integer;
  b : X;
end record;

type X is access Y; //wobei access heißt: X ist pointer auf Y, nur ein beispiel.


Aber das is nich so einfach in delphi portierbar, such einfach mal nach "Forward deklaration" oder nur "forward"
;)

Der Sinn dahinter ist, dem Compiler erstmal zu sagen: "Hier, den typen X, den gibt's. Wie der aussieht sag ich dir später."

Edit: Habe was gefunden: Schreib mal folgendes:


Delphi-Quelltext
1:
2:
3:
4:
5:
   Type TMyArray; forward;
   Type TMyClass=class(TObject)
     x : TMyArray;
   end;     
   Type TMyArray = array of TMyClass


...oder sowas. Verdammt! Ich bin durch ada voll aus der Delphi Syndax :motz:


mkinzler - Do 08.05.08 12:32


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
    TCustomTreeObject=class;

    TCustomTreeObjectArray=array of TCustomTreeObject;

    TCustomTreeObject=class(TObject)
        private
               myParent:TCustomTreeObject;
        public
               function GetChilds:TCustomTreeObjectArray;
    end;


JayEff - Do 08.05.08 12:36

Ok, so wirds klappen, schön copy&paste fähig, prima, muss man garnich mehr denken :motz:


Lossy eX - Do 08.05.08 13:33

Manchmal wären 1-2 Zeilen Erklärung gar nicht mal so schlecht. Dann hätte man velleicht sogar die Möglichkeit es zu verstehen und beim nächsten Mal nicht wieder fragen zu müssen....

Wie JayEff aber schon sagte schimpft sich das Forwarddeklarationen und die sagen Delphi lediglich da gibt es eine Klasse und die hat folgenden Namen. ABER so wie JayEff das geschrieben hat geht es leider nicht. Die Forwarddeklarationen sind nur innerhalb EINES Typeblockes gültig. Das heißt diese Typen die du deklarierst dürfen nicht alle ein neues type haben sondern müssen alle unterhalb eines Types befinden.

geht
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TClass1 = class;

  TClass2 = class
    C: TClass1;
  end;

  TClass1 = class
    C: TClass2;
  end;



geht nicht
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  TClass1 = class;

type
  TClass2 = class
    C: TClass1;
  end;

type
  TClass1 = class
    C: TClass2;
  end;


K_wave - Do 08.05.08 13:39

Vielen Dank für die zahlreichen Antworten! so funtktioniert es ;-)