Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record ist nicht vollständig definiert (https://www.delphipraxis.net/77840-record-ist-nicht-vollstaendig-definiert.html)

gsh 25. Sep 2006 16:47


Record ist nicht vollständig definiert
 
Hi DPler

Ich habe ein Problem mit dem Code hier:
Delphi-Quellcode:
TAllClientsRecord = record
  NodeName : string;
  Childs : array of TAllClientsRecord; //<-- genau hier
end;
bekomm ich folgende Fehlermeldung:
Zitat:

[Pascal Fehler] U_Haupt.pas(104): E2086 Typ 'TAllClientsRecord' ist nicht vollständig definiert
und ja es ist mir klar das Childs auf sich selber weisst. Ich will nämlich so eine art TreeView system und somit das das Record Childs haben kann die wieder Childs haben können usw.

SirThornberry 25. Sep 2006 16:55

Re: Record ist nicht vollständig definiert
 
Dir ist aber schon klar das es eine Recursion wäre wenn das Ginge. Du würdest damit also unendlich viel Speicher benötigen.
Denn deine Struktur enthält sich selbst welche widerum sich selbst enhält welche widerum sich selbst enthält.... Da es sich um ein dynamischen Record handelt ist das natürlich nicht der Fall (aber so schlau scheint der Compiler bei Records nicht zu sein)
Du musst an der Stelle mit Pointern arbeiten (typisierte Pointer). Und wenn du dann wirklich ein Unteritem benötigst musst du den Speicher anfordern.

Delphi-Quellcode:
PAllClientsRecord = ^TAllClientsRecord;
TAllClientsRecord = record
  NodeName : string;
  Childs : array of PAllClientsRecord; //<-- genau hier
end;
Bei Klassen geht das mit dem verwenden in sich selbst weil KlassenInstanzen nur Pointer sind.

gsh 25. Sep 2006 17:05

Re: Record ist nicht vollständig definiert
 
oh danke des hab ich nicht bedacht
ich werds gleich mal ausprobieren :coder:

marabu 25. Sep 2006 18:34

Re: Record ist nicht vollständig definiert
 
Hi Alex,

wie wäre es mit Children anstatt von Childs?

Freundliche Grüße vom marabu

gsh 25. Sep 2006 21:12

Re: Record ist nicht vollständig definiert
 
ja ich weiss des die mehrzahl von child children ist aber es war am Anfang ein Child und wenn man andere Programier technische Probleme hat dann schreibt man einfach ein s dazu ohne nachzudenken. Aber egal

Dax 25. Sep 2006 21:13

Re: Record ist nicht vollständig definiert
 
Um mal SirTs "dreckige" Pointerlösung zu umgehen: wenn du sowieso einen Baum bastelst, warum nimmst du nicht gleich Klassen und Listen? :gruebel:

SirThornberry 25. Sep 2006 21:17

Re: Record ist nicht vollständig definiert
 
Zitat:

Zitat von Dax
Um mal SirTs "dreckige" Pointerlösung zu umgehen: wenn du sowieso einen Baum bastelst, warum nimmst du nicht gleich Klassen und Listen? :gruebel:

*zustimm* Ich wollte mit der Pointerlösung nur ausdrücken das es nicht anders geht als mit Pointern (Klassen machen das ja auch so). Bei klassen hat man den Vorteil das man Methoden ins Destroy etc. werfen kann welche dann für das aufräumen sorgen.

gsh 25. Sep 2006 21:32

Re: Record ist nicht vollständig definiert
 
hmmm ich hab nur noch nichts mit klassen gemacht.
Muss ich dann da für jeden Child eine eigene Klasse erstellen?

SirThornberry 25. Sep 2006 21:35

Re: Record ist nicht vollständig definiert
 
für jedes Child eine eigene Klasseninstanz. Bei einem Record würdest du es ja genau so machen. Für jedes Child ein Record in deinem Array. Vorteil bei der Klasse ist das du im Destroy einfach die Childs frei geben kannst, diese geben wiederum in ihrem destory ihre childs frei und so weiter. Es ist also bedeutend bequemer und vor allem übersichtlicher.

gsh 25. Sep 2006 21:48

Re: Record ist nicht vollständig definiert
 
hmm ja schon aber wie mach ich des am besten des es sozusagen unendlich tief hineingehen kann?

SirThornberry 25. Sep 2006 21:59

Re: Record ist nicht vollständig definiert
 
zum Beispiel so:
Delphi-Quellcode:
type
  TDPTreeItems = class(TObject)
  private
    fChilds : TList;
    fNodeName: String;
    function GetItem(AIndex: Integer): TDPTreeItems;
  public
    constructor Create();
    destructor Destroy(); override;

    function Add(): Integer;
    function Count(): Integer;
    procedure Clear();
    procedure Delete(AIndex: Integer);

    property Childs[AIndex: Integer]: TDPTreeItems read GetItem;
    property NodeName: String read fNodeName write fNodeName;
  end;
[...]

function TDPTreeItems.Add: Integer;
var
  lItem : TDPTreeItems;
begin
  lItem := TDPTreeItems.Create();
  result := fChilds.Add(lItem);
end;

procedure TDPTreeItems.Clear;
var
  lCount : Integer;
begin
  for lCount := Count - 1 downto 0 do
    TObject(Childs[lCount]).Free;
  fChilds.Clear;
end;

function TDPTreeItems.Count: Integer;
begin
  result := fChilds.Count;
end;

constructor TDPTreeItems.Create;
begin
  inherited Create;
  fChilds := TList.Create;
end;

procedure TDPTreeItems.Delete(AIndex: Integer);
begin
  Childs[AIndex].Free;
  fChilds.Delete(AIndex);
end;

destructor TDPTreeItems.Destroy;
begin
  Clear();
  fChilds.Free;
  inherited Destroy;
end;

function TDPTreeItems.GetItem(AIndex: Integer): TDPTreeItems;
begin
  result := TDPTreeItems(fChilds.Items[AIndex]);
end;
Eine Insert-Methode etc. hinzuzufügen dürfte nicht das Problem sein.
Vorteil: Wenn du zum setzen von "NodeName" eine SetMethode hinterlegst kannst du noch sicherstellen das es kein anderes Node mit gleichem Namen gibt etc.

gsh 25. Sep 2006 22:07

Re: Record ist nicht vollständig definiert
 
Danke für das Beispiel.
Ich werd dann morgen versuchen es einzubauen.

Michael Habbe 25. Sep 2006 22:12

Re: Record ist nicht vollständig definiert
 
Zitat:

Zitat von SirThornberry
zum Beispiel so:
Delphi-Quellcode:
... einiges an nützlichem Source
Eine Insert-Methode etc. hinzuzufügen dürfte nicht das Problem sein.
Vorteil: Wenn du zum setzen von "NodeName" eine SetMethode hinterlegst kannst du noch sicherstellen das es kein anderes Node mit gleichem Namen gibt etc.

Wäre das nicht auch was für die CodeLibrary?!?

SirThornberry 25. Sep 2006 22:13

Re: Record ist nicht vollständig definiert
 
ist eigentlich grundwissen der objectorientierten Programmierung.

Dax 25. Sep 2006 22:14

Re: Record ist nicht vollständig definiert
 
Imho nein. Dort steht schon die dpCollection, und, naja, wie man mit Listen arbeitet, Bäume usw sollte schon etwas sein, was jeder ohne nachzuschlagen beherrscht. Zumindest sehe ich das so ;)

Michael Habbe 25. Sep 2006 22:59

Re: Record ist nicht vollständig definiert
 
Zitat:

Zitat von SirThornberry
ist eigentlich grundwissen der objectorientierten Programmierung.

Demnach dürfte wohl einiges aus dem Raster fallen.....


Zitat:

Zitat von Dax
Imho nein. Dort steht schon die dpCollection, und, naja, wie man mit Listen arbeitet, Bäume usw sollte schon etwas sein, was jeder ohne nachzuschlagen beherrscht. Zumindest sehe ich das so ;)

Hm, meiner einer beherrscht schon viel, ohne es nachzuschlagen. Und wenn ich es schon einmal gebraucht habe, kann ichs natürlich in meinen Quellen nachschlagen.

Mag schon sein, dass man die dpCollection hierfür nutzen kann, nur stehen in der CodeLibrary nicht auch Dinge drin, um den Anfänger/Fortgeschrittenen/Profi auf den richtigen Weg zu bringen?

Geht es in der CodeLibrary nicht auch um grundlegende Dinge?

War aber auch nur ein Vorschlag.


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