![]() |
Record ist nicht vollständig definiert
Hi DPler
Ich habe ein Problem mit dem Code hier:
Delphi-Quellcode:
bekomm ich folgende Fehlermeldung:
TAllClientsRecord = record
NodeName : string; Childs : array of TAllClientsRecord; //<-- genau hier end; Zitat:
|
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:
Bei Klassen geht das mit dem verwenden in sich selbst weil KlassenInstanzen nur Pointer sind.
PAllClientsRecord = ^TAllClientsRecord;
TAllClientsRecord = record NodeName : string; Childs : array of PAllClientsRecord; //<-- genau hier end; |
Re: Record ist nicht vollständig definiert
oh danke des hab ich nicht bedacht
ich werds gleich mal ausprobieren :coder: |
Re: Record ist nicht vollständig definiert
Hi Alex,
wie wäre es mit Children anstatt von Childs? Freundliche Grüße vom marabu |
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
|
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:
|
Re: Record ist nicht vollständig definiert
Zitat:
|
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? |
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.
|
Re: Record ist nicht vollständig definiert
hmm ja schon aber wie mach ich des am besten des es sozusagen unendlich tief hineingehen kann?
|
Re: Record ist nicht vollständig definiert
zum Beispiel so:
Delphi-Quellcode:
Eine Insert-Methode etc. hinzuzufügen dürfte nicht das Problem sein.
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; Vorteil: Wenn du zum setzen von "NodeName" eine SetMethode hinterlegst kannst du noch sicherstellen das es kein anderes Node mit gleichem Namen gibt etc. |
Re: Record ist nicht vollständig definiert
Danke für das Beispiel.
Ich werd dann morgen versuchen es einzubauen. |
Re: Record ist nicht vollständig definiert
Zitat:
|
Re: Record ist nicht vollständig definiert
ist eigentlich grundwissen der objectorientierten Programmierung.
|
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 ;)
|
Re: Record ist nicht vollständig definiert
Zitat:
Zitat:
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 16:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz