Delphi-PRAXiS

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 Treeview Dragdrop Listview Problem :-( (https://www.delphipraxis.net/82656-treeview-dragdrop-listview-problem.html)

Bernd29bln 17. Dez 2006 14:34


Treeview Dragdrop Listview Problem :-(
 
Hallo,

Folgendes Problem:

Delphi-Quellcode:
Function GetNodeText(Node: TTreeNode): String;
var I: Integer;
begin
if Node.Count>0 then //Untereintrag vorhanden
begin
Result:=Node.Text+#13#10; //Node hinzufügen

For I:=0 to Node.Count-1 do //Untereinträge auslesen
Result:=Result+Node[i].text+#13#10; //Untereinträge hinzufügen
end
else //Nur Node vorhanden
Result:=Node.Text; //Node hinzufügen
end;

procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
if (Sender = Playview) then //Von TreeView1
Accept := True; //Drag&Drop erlauben/aktivieren
end;

procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
with listview1 do
 begin
  if (TargetNode = nil) then
   begin
    EndDrag(False);
    Exit;
 end;
caption := GetNodeText(TargetNode); //Eintrag/Einträge in ListView hinzufügen

end;

end;

procedure TForm1.TreeViewMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 TargetNode:= TreeView.GetNodeAt(X,Y); //Node ermitteln per X,Y Koordinaten

end;
Problem in Listview wird nichts eingefügt. :gruebel:

Gruss Bernd

marabu 17. Dez 2006 18:17

Re: Treeview Dragdrop Listview Problem :-(
 
Hallo Bernd,

klar dass da nichts in die ListView eingefügt wird. Mit "caption := GetNodeText(TargetNode)" wird lediglich der Text in der Titelzeile von Form1 verändert. Ist aber für mich auch schwer zu verstehen, was du da wo einfügen willst. Du holst dir aus einer TreeView den Text eines Knoten und aller seiner direkten Nachfolger - ich habe deinen Code mal um eine Prüfung erweitert und leicht umgestellt:

Delphi-Quellcode:
function GetNodeText(Node: TTreeNode): String;
var
  i: Integer;
begin
  if Assigned(Node) then
  begin
    Result := Node.Text;
    for i := 0 to Pred(Node.Count) do
      Result := Result + sLineBreak + Node[i].Text;
  end else Result := '';
end;
Wenn du den Knoten beim Ereignis OnMouseMove() festlegst, dann brauchst du eine ruhige Hand um die Maus nicht an der falschen Stelle aus der TreeView zu ziehen. Und eine optische Kennzeichnung des festgelegten Knotens hast du dann auch nicht. Warum verwendest du nicht einfach den angeklickten Knoten TreeView.Selected für deine Zwecke?

Beim Ereignis OnDragOver() kannst du deinen Code vereinfachen:

Delphi-Quellcode:
procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := (Sender = Playview);
end;
Wenn eine Drag-Operation unzulässig ist, solltest du das nicht erst beim Ereignis OnDragDrop() erkennen. Du könntest die Operation bereits beim Ereignis OnStartDrag() unterbinden. Zum Beispiel muss sich der ausgewählte Knoten sicherlich auf einer ganz bestimmten Ebene befinden, da eine Ebene tiefer keine Unterknoten mehr anzutreffen sein könnten.

Ein neues Item fügst du mit ListView.Add() in die Liste ein:

Delphi-Quellcode:
var
  s: TStrings;
begin
  s := TStringList.Create;
  s.Text := GetNodeText(TreeView.Selected);
  with ListView.Add do
  begin
    Caption := s[0];
    s.Delete(0);
    SubItems.Assign(s);
  end;
  s.Free;
end;
Getippt und nicht getestet.

Grüße vom marabu

Bernd29bln 17. Dez 2006 22:16

Re: Treeview Dragdrop Listview Problem :-(
 
Hallo,

Danke für die Antword. Hab den Code mal ausprobiert ,er funktioniert nicht.

gruss bernd

Bernd29bln 17. Dez 2006 22:20

Re: Treeview Dragdrop Listview Problem :-(
 
Hallo,

geht jetzt und anke für den denk anstoss. :thumb:

gruss bernd


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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