![]() |
Objekte verschieben
Hi,
ich habe eine TreeView, in der ich den Einträgen über AddChildObject Objekte hinzugefügt. Ich habe dem ersten Eintrag ein Objekt vom Typ TAuto zugewiesen und möchte das jetzt von ersten zum zweiten Eintrag verschieben. Wie kann ich das machen? Ich arbeite hauptsächlich mit TAuto(SelectedNode.Data). |
Re: Objekte verschieben
wenn ich dich richtig verstehe kannst du das data-Objekt einfach dem zweiten Knoten zuweisen:
Delphi-Quellcode:
Gruß Frank
secondnode.data:=firstnode.data;
firstnode.data:=nil; |
Re: Objekte verschieben
Okay, kleiner Fehler von mir ;-)
Ich übergebe ein Objekt von TAutos nicht TAuto. Ich habe also eine Liste von Autos in den Daten des TreeNodes. Ich möchte jetzt ein einzelnes TAuto-Objekt verschieben. Sorry für die unglückliche Fragestellung meinerseits. |
Re: Objekte verschieben
gut, ich kenne die struktur von TAutos nicht (gehe einfach mal von einer TList aus).
im Prinzip sollte dies aber ähnlich sein. das objekt in die neue struktur kopieren (TList_New.Add(TList_old.Items[idx])) und in der alten löschen (TList_Old.delete(idx)). es wäre sicherlich hilfreich für uns, wenn du uns ein bisschen Code deiner struktur mitgibst. HTH Frank |
Re: Objekte verschieben
Hier sind die Strukturen:
Delphi-Quellcode:
Und hier wird ein Auto der TreeView hinzugefügt (carSammlung ist als private deklariert und ein TreeNode mit dem Caption "AutoSammlung" ist bereits vorhanden:
type
TAuto = Class(TObject) Modell, Hersteller : String; end; TAutos = Class(TObjectList) private function getItem(Index: Cardinal): TAuto; virtual; procedure setItem(Index: Cardinal; Auto: TAuto); virtual; public property Items[index: Cardinal]: TAuto read getItem write setItem; default; end;
Delphi-Quellcode:
Wie weise ich nun z.B. dem Eintrag von "Auto3" das Auto2 (den Opel) zu?
procedure TForm1.Button1Click(Sender: TObject);
var newCar : TAuto; begin // Auto 1 newCar := TAuto.Create; newCar.Hersteller := 'VW'; newCar.Modell := 'Golf'; carSammlung.Add(newCar); // Auto 2 newCar := TAuto.Create; newCar.Hersteller := 'Opel'; newCar.Modell := 'Astra'; carSammlung.Add(newCar); TreeView1.Items.AddChildObject(TreeView1.Items[0], 'Auto1', carSammlung); TreeView1.Items.AddChildObject(TreeView1.Items[0], 'Auto2', nil); TreeView1.Items.AddChildObject(TreeView1.Items[0], 'Auto3', nil); end; |
Re: Objekte verschieben
Liste der Anhänge anzeigen (Anzahl: 1)
als erstes solltest du jedem treenode (welches Autos halten darf) eine TAutos-Klasse spendieren, auch wenn die erstmal leer ist.
zum verschieben kannst du die bei T(Object)List vorhandene Delete-Procedure und Add-Procedure nutzen. wie willst du die zwei knoten (ziel,Quelle) und das TAuto-Objekt auswählen? ich hab da mal was zusammengebastelt...ich hoffe, du hast das so etwa gemeint... HTH Frank |
Re: Objekte verschieben
Hallo _frank_!
Danke erstmal für die Mühe! Habe mir deinen Code mal angeschaut. Ich hatte mich in der Zwischenzeit auch ein wenig informiert und habe eine Frage zu deinem Code:
Delphi-Quellcode:
Mit "auto:=src.getItem(i);" holst du dir doch nur den Zeiger auf das Objekt, oder? Deswegen ist mir nicht ganz klar, wieso bei "src.Delete(src.indexof(auto));" dieser nicht verworfen wird. Hat das vielleicht was damit zu tun, weil du das Objekt nicht freigibst (weil es ja weiterleben soll)?
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var auto:TAuto; i:integer; begin ListBox1.Items.clear; if assigned(node.data) then begin src:=TAutos(node.data); for i:=0 to src.count-1 do begin auto:=src.getItem(i); // FRAGE 1 listbox1.items.AddObject(auto.Hersteller+' '+auto.Modell,auto); end; end; end; procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer); var node:TTreeNode; autos:TAutos; auto:TAuto; begin node:=(sender as TTreeview).GetNodeAt(x,y); autos:=TAutos(node.data); auto:=(Source as TListbox).Items.Objects[(Source as TListbox).Itemindex] as TAuto; src.Delete(src.indexof(auto)); // FRAGE 2 autos.Add(auto); Inwiefern hilft hier die ebenfalls für TObjectList zu Verfügung stehende Methode "Extract"? |
Re: Objekte verschieben
Zitat:
Zitat:
Zitat:
|
Re: Objekte verschieben
Ich habe es jetzt mit Hilfe von Extract hinbekommen. Ansonsten bekomme ich immer irgendwie eine Zugriffsverletzung oder ich bekomme Datengulasch angezeigt :-(
Da kommt man irgendwie durcheinander mit Objekten und Pointer :-/ |
Re: Objekte verschieben
Zugriffsverletzung mit Lesen von Adresse 0x00000000? dann greifst du auf einen nil-Pointer zu. prüfe vor dem zugriff per assigned() ob der pointer gesetzt ist. siehe mein code :)
ansonste musst du uns wohl deinen jetzigen Code und die Fehlerstelle posten Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 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 by Thomas Breitkreuz