![]() |
pointer auf TList
Hallo
ich muß an eine TTreeNode eine TList binden. Das geht ja über die Data-Eingenschaft Der TTreeNode. Der muß man ja einen Pointer zuweisen auf eine Struktur, die man daran binden will. Ich will jetzt also eine TList an die Treenode binden. Allerdings bekomme ich das nicht gebaken:
Delphi-Quellcode:
schon da stürzt mein Programm ab. Es scheitert am list^.add. warum geht das nicht, und was muß ich ändern?PList = ^TList; var list:PList; . . . new(list); list^.add(objekt); Grüße TO |
Da bastelst dir da einen Zeiger auf eine Zeiger. TList ist bereits ein Zeiger.
Delphi-Quellcode:
var List: TList;
begin ... TreeItem.Data := List; end; |
aber dann kann ich nicht mit
new(list) eine neue Liste erstellen. Ich brauche nämlich für jedes TreeItem eins. |
Wie wäre es mit TList.Create. :wink:
|
Sorry, der Weg, mit dem du die Liste erstellst, ekelt mich an :mrgreen:.
Das Problem bei der Sache ist, dass du Delphi-Klassen nicht mehr wie in Pascal mit New() erstellst und mit Dispose() freigibst (das geht nur mit objects), sondern man benutzt Kon- und Destruktor, sodass die Objekte dynamisch auf dem Heap abgelegt werden.
Delphi-Quellcode:
MfG,
var
List: TList; Obj: TObject; // ... List := TList.Create(); Obj := TObject.Create(); List.Add(@Obj); TreeNode.Data := @List; d3g [edit]Mal wieder ein paar Beiträge verpennt ...:mrgreen:[/edit] |
Das kann doch garnicht gehen. Wie erstelle ich jetzt eine zweite Liste? Ohne eine zweite Variable zu nehmen?
|
Hi theomega,
das geht so und nur so. Wenn du mehrere Listen ohne Variablen erstellen willst, mache es doch so:
Delphi-Quellcode:
Vergiss nicht, die Items hinterher alle mit TList.Free() freizugeben!
for i := 0 to TreeView.Items.Count do begin
List := TList.Create(); List.Add(@MyObject); TreeView.Items.Item[i].Data := @List; end; MfG, d3g |
Geht leider immer noch nicht:
Delphi-Quellcode:
warum geht das nicht?type TBeleg=record belegdatum: TDateTime; betrag: double; spendenbescheinigungsnr: string; ausgestelltam: TDateTime; sachlicherichtigkeit:string; rechnericherichtigkeit:string; einnahme:boolean; //nextbeleg:pointer; index:integer; text1:string; text2:string; end; PBeleg=^TBeleg; . . . var liste:TList; kontodata:PBeleg; . . . for i:= 1 to counter do begin; List.Create; for j:= 1 to 10 do begin; new(belegdata); belegdata^.betrag := j; liste.Add(belegdata); end; treeview.items[j].data := @ liste; Liste.free; end; Gibt einen Absturz. |
Ersten lass das @ bei "treeview.items[j].data := @ liste;". Damit weist du .data die Adresse, an der die Variable liste steht zu und nicht die Adresse der Liste. TList.Create liefert bereits einen Pointer.
Zweitens entferne das liste.Free. Damit gibst du die Liste frei und .data zeigt ins Nirvana. |
Ändert nichts, Fehler bleibt.
Und selbst wenn da funktionieren würde: hätten dann nicht alle Treenodes die gleiche Liste dahinter? Es sollen ja verschiedene sein! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 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