Einzelnen Beitrag anzeigen

Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Feststellen ob VirtualTreeView gerade im "Drag-Mode" ist

  Alt 27. Sep 2016, 18:17
eine Möglichkeit schaffen, dass der Anwender die Nodes innerhalb des VST neu anordnen kann per Drag&Drop.
Ich hab das mal gemacht mithilfe der Beispiele, die im Internet im Umlauf sind.
Das waren damals zwei VSTs, die beide diese Methoden zugewiesen bekamen. Wenn von einem zum anderen gedraggt wurde, dann wurde der Node von einem Tree zum anderen kopiert; wenn innerhalb eines Trees gezogen wurde, dann dorthin verschoben.
Hoffe, das hilft.
PTreeNodeData ist ein Pointer auf eine eigene Struktur und für das Beispiel nicht wichtig.

Delphi-Quellcode:
procedure TfrmFavMan.FormCreate(Sender: TObject);
begin
  trvSources.DragMode := dmAutomatic;
  trvSources.OnDragOver := Tree1DragOver;
  trvSources.OnDragDrop := Tree1DragDrop;

  trvFavs.DragMode := dmAutomatic;
  trvFavs.OnDragOver := Tree1DragOver;
  trvFavs.OnDragDrop := Tree1DragDrop;
end;

procedure TfrmFavMan.Tree1DragOver(Sender: TBaseVirtualTree; Source: TObject;
  Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode;
  var Effect: Integer; var Accept: Boolean);
begin
  Accept := (Source is TVirtualStringTree);
end;

procedure TfrmFavMan.Tree1DragDrop(Sender: TBaseVirtualTree; Source: TObject;
  DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
  Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  Attachmode : TVTNodeAttachMode;
  Nodes : TNodeArray;
  I : Integer;
  DataOfSender : PTreeNodeData;
  DataOfSource : PTreeNodeData;
  DataOfParent : PTreeNodeData;
  NewNode : PVirtualNode;
  DrpTargetNode : PVirtualNode;
begin
  if (nil = Sender.DropTargetNode) then exit;
  if (Sender.GetFirst = Sender.DropTargetNode) and (Mode <> dmOnNode) then exit;

  if Source = Sender then
  begin
    Effect := DROPEFFECT_MOVE
  end
  else
  begin
    Effect := DROPEFFECT_COPY;
  end;

  // Translate the drop position into an node attach mode.
  case Mode of
    dmAbove : AttachMode := amInsertBefore;
    dmOnNode: AttachMode := amAddChildLast;
    dmBelow : AttachMode := amInsertAfter;
    else AttachMode := amNowhere;
  end;

  Nodes := TVirtualStringTree(Source).GetSortedSelection(True);

  if Effect = DROPEFFECT_COPY then
  begin
    DrpTargetNode := Sender.DropTargetNode;

    for I := 0 to High(Nodes) do
    begin
      NewNode := TVirtualStringTree(Sender).AddChild(DrpTargetNode);
      DataOfSource := TVirtualStringTree(Source).GetNodeData(Nodes[I]);
      DataOfSender := TVirtualStringTree(Sender).GetNodeData(NewNode);
      if (nil <> DataOfSource) then
      begin
        if (nil <> DataOfSender) then
        begin
          // Datenabgleich machen
        end;
      end;
    end;
    TVirtualStringTree(Sender).FullExpand(DrpTargetNode);

  end
  else
  begin
    DataOfParent := TVirtualStringTree(Source).GetNodeData(Sender.DropTargetNode);
    for I := 0 to High(Nodes) do
    begin
      TVirtualStringTree(Source).MoveTo(Nodes[I], Sender.DropTargetNode, AttachMode, False);
      DataOfSource := TVirtualStringTree(Source).GetNodeData(Nodes[I]);
      // Datenabgleich machen
    end;
  end;
end;
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat