Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Reihenfolge in Type-Deklaration (https://www.delphipraxis.net/179357-reihenfolge-type-deklaration.html)

MrMooed 2. Mär 2014 12:56

Delphi-Version: 7

Reihenfolge in Type-Deklaration
 
Hallo DP,

folgendes Problem:
Delphi-Quellcode:
type
  TNode = class( TObject )
  private
    Edges: TNodeList;
  [..]
  end;
 
  TNodeList = class( TObjectList )
  protected
    function getItem(index: Integer): TNode;
  [..]
  end;
Wie bewerkstellige ich so etwas ? Denn eigentlich müsste die Liste vor TNode deklariert werden damit TNode die Liste kennt, aber dann würde die Liste TNode noch nicht kennen :pale:
Vermutlich verkompliziere ich das wieder unnötig, vielleicht kann mir dennoch jemand auf die Sprünge helfen :roll:

MfG

silver-moon-2000 2. Mär 2014 13:00

AW: Reihenfolge in Type-Deklaration
 
Zitat:

Zitat von MrMooed (Beitrag 1250189)
Wie bewerkstellige ich so etwas ? Denn eigentlich müsste die Liste vor TNode deklariert werden damit TNode die Liste kennt, aber dann würde die Liste TNode noch nicht kennen

Hallo, probiers mal so, nennt sich forward declaration

Delphi-Quellcode:
type
  TNodeList = class; //<------------

  TNode = class( TObject )
  private
    Edges: TNodeList;
  [..]
  end;
 
  TNodeList = class( TObjectList )
  protected
    function getItem(index: Integer): TNode;
  [..]
  end;

MrMooed 2. Mär 2014 13:52

AW: Reihenfolge in Type-Deklaration
 
Zitat:

Zitat von silver-moon-2000 (Beitrag 1250191)
Hallo, probiers mal so, nennt sich forward declaration

Und wieder habe ich was neues gelernt :thumb: vielen Dank für die schnelle Hilfe

himitsu 2. Mär 2014 14:01

AW: Reihenfolge in Type-Deklaration
 
Man muß nur Einiges beachten.

Es geht nur mit Objekten, bzw. Zeigertypen (Interfaces, Pointer usw.)
Records gehen nicht, da dort deren Größe sonst noch nicht verfügbar ist.

Und das Ganze muß in einem Type-Block stehen, ohne Unterbrechung.

Delphi-Quellcode:
type
  TMyClass = class; // die Forwad-Deklaration

  PMyRecordForward = ^TMyRecord;

  TMyRecord = record // oder object;
    ...
    MyRec: TMyRecord; // geht nicht
    NextRec: PMyRecord; // geht
    PrevRec: ^TMyRecord; // geht auch
    MyObj: TMyClass; // geht, da per Forward deklariert
    ...
  end;

  PMyRecord = ^TMyRecord;

  TMyClass = class
    ...
    MyObj: TMyClass; // geht, selbst ohne Forward-Deklaration
    ...
  end;

Perlsau 2. Mär 2014 14:03

AW: Reihenfolge in Type-Deklaration
 
Wenn ich z.B. für den VirtualTreeView den NodeData-Record deklariere, ist das dann nicht auch eine Forward-Deklaration?
Delphi-Quellcode:
TYPE
    PNodeData = ^TNodeData;
    TNodeData = RECORD
                 Beschreibung : String;
                 Anzahl      : Integer;
                 ...
                END;

Puke 2. Mär 2014 14:04

AW: Reihenfolge in Type-Deklaration
 
In der Form eines Pointers, Ja!

himitsu 2. Mär 2014 14:10

AW: Reihenfolge in Type-Deklaration
 
Jupp, siehe mein Code-Beispiel.


Ach ja, wenn man zwischen Forwarddeklaration und eigentlicher Deklaration einen Compilerfehler hat, dann dreht schon seit immer der Compiler durch und zeigt auf die Stelle der Forwarddeklaration ... die wirkliche Fehlerstelle darf man dann brav selber suchen. :angel:

Jaaaa, es ist theoretsich auch wirklich der "erste" Fehler, da die Forwarddeklaration dann nicht vollständig ist, aber das hätte man natürlich auch abfangen können.
Genauso dreht der Compiler übrigens auch bei den generischen Typen durch, wenn er auf einen Fehler trifft.
(man landet da nicht an der Verwendungsposition oder in der Deklaration des Typen, sondern meistens bei "implementation" in der Unit, wo man den Typen verwenden wollte)

DeddyH 2. Mär 2014 14:40

AW: Reihenfolge in Type-Deklaration
 
Dass ein Record kein Feld seines eigenen Typs beinhalten kann, ist ja auch logisch, da es sich ja nicht um einen Nullable Type handelt. Also würde es einen Record im Record geben, der wieder einen Record hat, der wieder einen Record hat usw. Bis in alle Ewigkeit würde es weltweit nicht genügend Speicher geben, um das aufzunehmen, da der Verbrauch ja unendlich ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 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