TTreeView und MoveTo

CSANecromancer

Erfahrenes Mitglied
Hallo miteinander.
Ich habe hier ein Problem im Delphi Studio 2006, bei dem ich nicht mehr weiter weiss.
In meinem Projekt verwende ich eine TTreeView-Komponente, deren einzelnen Knoten Integerwerte in den jeweiligen Data-Feldern zugewiesen sind. Jetzt sollte innerhalb dieses TTreeViews auch Drag & Drop ermöglicht werden. Schön und gut, nur leider spinnt mir anscheinend die MoveTo-Methode gewaltig herum.
Der Code dazu sieht folgendermaßen aus:

tvBrowser: TTreeView;

Code:
procedure TfmBrowser.tvBrowserDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
var tSource, tDest: TTreeNode;
begin
  Accept := false;
  if Sender is TTreeView then
  begin
    Accept := true;
    tSource := tvBrowser.Selected;
    tDest := tvBrowser.GetNodeAt(X, Y);

    if tSource = nil then Accept := false;
    if tDest = nil then Accept := false;
    if tSource = tDest then Accept := false;
    if tDest = tSource.Parent then Accept := false;
  end;
end;



procedure TfmBrowser.tvBrowserDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  i: Integer;
begin
  if((Sender <> nil) and
     (tvBrowser.DropTarget <> nil) and
     (Source <> nil) and
     (tvBrowser.Selected <> nil)) then
  begin
    tvBrowser.Selected.MoveTo(tvBrowser.DropTarget, naAddChild);
    tvBrowser.Items[0].Selected := true;
  end;
end;

Das funktioniert auch wunderbar, solange ich nur einen einzigen Drag & Drop mache. Ich kann also einen Knoten oder einen ganzen Zweig mittels Drag & Drop im Baum verschieben wie ich will. Aber wehe, ich will eine zweite Drag & Drop-Aktion ausführen, dann bekomme ich ständig um die Ohren gehauen:

"Das Element wurde bereits hinzugefügt. Schlüssel im Wörterbuch: "1429112" Hinzuzufügender Schlüssel: "1429112". Der Zahlenwert ändert sich dabei immer wieder.

Hat irgend jemand einen Lösungsvorschlag außer dem obligatorischen "nimm Virtual TreeView"?

Nachtrag:
Also ich habe es bisher so weit eingrenzen können:
Offenbar funktioniert die MoveTo-Routine des TTreeView nicht sauber innerhalb von .net. Die intern vergebenen Indizes der einzelnen Nodes (TTreeNode.getIndex, nur Lesezugriff (war ja klar...) ), werden nicht sauber aufgelöst. Sobald dann also die Methode versucht, die kopierten Nodes an der neuen Position in den Tree einzufügen, hustet die .net-Umgebung ohne Ende.
Wenn ich mal etwas mehr Zeit habe, werde ich vielleicht versuchen, eine eigene Methode für den MoveTo zu implementieren und mir dabei das Index-Verhalten der Nodes genauer anschauen, ob ein TTreeNode.Delete denn wenigstens die nicht mehr gültigen Indizes auflöst.
 
Zuletzt bearbeitet:
Zurück