AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte verschieben

Ein Thema von Yheeky · begonnen am 3. Sep 2008 · letzter Beitrag vom 5. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

Objekte verschieben

  Alt 3. Sep 2008, 15:54
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).
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#2

Re: Objekte verschieben

  Alt 3. Sep 2008, 16:31
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
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#3

Re: Objekte verschieben

  Alt 3. Sep 2008, 16:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#4

Re: Objekte verschieben

  Alt 3. Sep 2008, 16:41
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
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#5

Re: Objekte verschieben

  Alt 3. Sep 2008, 17:33
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?
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#6

Re: Objekte verschieben

  Alt 3. Sep 2008, 18:25
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
Angehängte Dateien
Dateityp: zip autotest_135.zip (119,4 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#7

Re: Objekte verschieben

  Alt 4. Sep 2008, 23:12
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"?
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#8

Re: Objekte verschieben

  Alt 4. Sep 2008, 23:24
Zitat von Yheeky:
auto:=src.getItem(i); // FRAGE 1 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 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 von Delphi 7 Hilfe:
Extract (Methode von TObjectList)
Die Methode Extract entfernt das angebene Objekt ohne es freizugeben aus der Liste.
Gruß Frank
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#9

Re: Objekte verschieben

  Alt 4. Sep 2008, 23:39
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 :-/
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#10

Re: Objekte verschieben

  Alt 4. Sep 2008, 23:46
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 Uhr.
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