Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi pointer auf TList (https://www.delphipraxis.net/2953-pointer-auf-tlist.html)

theomega 15. Feb 2003 19:37


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:

PList = ^TList;

var
list:PList;

.
.
.
new(list);
list^.add(objekt);
schon da stürzt mein Programm ab. Es scheitert am list^.add. warum geht das nicht, und was muß ich ändern?

Grüße

TO

jbg 15. Feb 2003 19:40

Da bastelst dir da einen Zeiger auf eine Zeiger. TList ist bereits ein Zeiger.

Delphi-Quellcode:
var List: TList;
begin
  ...
  TreeItem.Data := List;
end;

theomega 15. Feb 2003 19:43

aber dann kann ich nicht mit
new(list) eine neue Liste erstellen. Ich brauche nämlich für jedes TreeItem eins.

jbg 15. Feb 2003 19:46

Wie wäre es mit TList.Create. :wink:

d3g 15. Feb 2003 19:47

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:
var
  List: TList;
  Obj: TObject;

// ...

List := TList.Create();
Obj := TObject.Create();
List.Add(@Obj);
TreeNode.Data := @List;
MfG,
d3g

[edit]Mal wieder ein paar Beiträge verpennt ...:mrgreen:[/edit]

theomega 15. Feb 2003 19:48

Das kann doch garnicht gehen. Wie erstelle ich jetzt eine zweite Liste? Ohne eine zweite Variable zu nehmen?

d3g 15. Feb 2003 19:53

Hi theomega,

das geht so und nur so. Wenn du mehrere Listen ohne Variablen erstellen willst, mache es doch so:
Delphi-Quellcode:
for i := 0 to TreeView.Items.Count do begin
  List := TList.Create();
  List.Add(@MyObject);
  TreeView.Items.Item[i].Data := @List;
end;
Vergiss nicht, die Items hinterher alle mit TList.Free() freizugeben!

MfG,
d3g

theomega 15. Feb 2003 20:05

Geht leider immer noch nicht:

Delphi-Quellcode:

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;
warum geht das nicht?
Gibt einen Absturz.

jbg 15. Feb 2003 20:08

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.

theomega 15. Feb 2003 20:10

Ä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 22:27 Uhr.
Seite 1 von 2  1 2      

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