Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Objekte verschieben (https://www.delphipraxis.net/119952-objekte-verschieben.html)

Yheeky 3. Sep 2008 15:54


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).

_frank_ 3. Sep 2008 16:31

Re: Objekte verschieben
 
wenn ich dich richtig verstehe kannst du das data-Objekt einfach dem zweiten Knoten zuweisen:

Delphi-Quellcode:
  secondnode.data:=firstnode.data;
  firstnode.data:=nil;
Gruß Frank

Yheeky 3. Sep 2008 16:35

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.

_frank_ 3. Sep 2008 16:41

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

Yheeky 3. Sep 2008 17:33

Re: Objekte verschieben
 
Hier sind die Strukturen:

Delphi-Quellcode:
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;
Und hier wird ein Auto der TreeView hinzugefügt (carSammlung ist als private deklariert und ein TreeNode mit dem Caption "AutoSammlung" ist bereits vorhanden:

Delphi-Quellcode:
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;
Wie weise ich nun z.B. dem Eintrag von "Auto3" das Auto2 (den Opel) zu?

_frank_ 3. Sep 2008 18:25

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

Yheeky 4. Sep 2008 23:12

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:
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);
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)?
Inwiefern hilft hier die ebenfalls für TObjectList zu Verfügung stehende Methode "Extract"?

_frank_ 4. Sep 2008 23:24

Re: Objekte verschieben
 
Zitat:

Zitat von Yheeky
Delphi-Quellcode:
auto:=src.getItem(i); // FRAGE 1
Delphi-Quellcode:
src.Delete(src.indexof(auto)); // FRAGE 2
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)?

richtig, ich lösche nur den Pointer (nach dem sichern in der variable) aus der alten Liste und füge diesen in die neue ein :) das Objekt bleibt wie es ist (kein freigeben/neuerstellen)

Zitat:

Zitat von Yheeky
Inwiefern hilft hier die ebenfalls für TObjectList zu Verfügung stehende Methode "Extract"?

kann ich dir leider nicht sicher beantworten, da D3 keine Objectlist hat und ich damit keine Erfahrung habe. aber laut D7-Hilfe sollte das funktionieren.

Zitat:

Zitat von Delphi 7 Hilfe
Extract (Methode von TObjectList)
Die Methode Extract entfernt das angebene Objekt ohne es freizugeben aus der Liste.

Gruß Frank

Yheeky 4. Sep 2008 23:39

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 :-/

_frank_ 4. Sep 2008 23:46

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 21:37 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