tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
0
ZUGRIFFE
2863
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Mar 2004
    Beiträge
    441
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    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.
    Geändert von CSANecromancer (30.08.06 um 11:55 Uhr)
     

Ähnliche Themen

  1. SetViewportOrg und MoveTo undeclared
    Von silvanm im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 27.01.08, 12:11
  2. Mit TTreeView einen Zweig per Code markieren
    Von Scrapy im Forum Borland CBuilder und VCL
    Antworten: 0
    Letzter Beitrag: 27.03.06, 12:16
  3. TTreeView verwenend
    Von alixander im Forum Borland CBuilder und VCL
    Antworten: 1
    Letzter Beitrag: 05.01.05, 12:48
  4. MoveTo undefined!
    Von Harrier im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 14.01.04, 16:47
  5. self.moveTo
    Von Bäte im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 09.07.03, 15:12