Drag and drop w TreeView

Ustawiamy właściwość TreeView dragMode na dmAutomatic.

Następnie:

procedure TForm1.TreeView1DragOver(Sender, Source: TObject;
             X, Y: Integer; State: TDragState; var Accept: Boolean);
var
  TargetNode, SourceNode: TTreeNode;
begin
  TargetNode := TreeView1.GetNodeAt (X, Y);
   if (Source = Sender) and (TargetNode <> nil) then
    begin
       Accept := True;
      SourceNode := TreeView1.Selected;
      
      while (TargetNode.Parent <> nil) and (TargetNode <> SourceNode) do
            TargetNode := TargetNode.Parent;

   if TargetNode = SourceNode then
     Accept := False;
   end
   else
      Accept := False;
end;

procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  TargetNode, SourceNode: TTreeNode;
begin
  TargetNode := TreeView1.GetNodeAt (X, Y);
    if TargetNode <> nil then
    begin
       SourceNode := TreeView1.Selected;
       SourceNode.MoveTo (TargetNode, naAddChildFirst);
       TargetNode.Expand (False);
       TreeView1.Selected := TargetNode;
   end;
end;


3 komentarzy

mozna tez inaczej, w OnDragOver komponentu nad ktorym przeciagasz masz wspolrzedne X i Y no i jak sa one blisko ktorejs krawedzi to mozesz przesunac ten komponent w odpowiednia strone tak zeby pokazalo sie to co Cie interesuje

ustaw 2 komponenty niewidoczne na koncówkach TreeView np.: Timage i zaprogramój odpowiednio zdarzenie "OnMouseMove" dla nich.............kombinatoryka...hehehe...

Robię właśnie drag 'n' drop w TreeView. Mam jednak problem. Drzewo nie mieści mi się w widocznym obszarze. Jak zrobić, by podczas przeciągania gałęzi, przy dojechaniu do górnej lub dolnej krawędzi widocznego obszaru, zawartość przesuwała się tak, aby można było dotrzeć do gałęzi docelowej ?