ノードのリストがあります。私は、ドラッグ&ドロップの並べ替え機能を追加したいと思いますが、私はこれを行う方法を知りません。VirtualTreeviewドラッグアンドドロップでリスト内のノードを整理する
私はTVirtualStringTreeのOnDragDropイベントを使用しようとしましたが、わかりませんでした。私はドキュメントを見て、悲しいことに単純なノードのドラッグ・ドロップのためのサンプル・コードはありません。
単なるレベルリストです。 hierachyはありません。 :)
ノードのリストがあります。私は、ドラッグ&ドロップの並べ替え機能を追加したいと思いますが、私はこれを行う方法を知りません。VirtualTreeviewドラッグアンドドロップでリスト内のノードを整理する
私はTVirtualStringTreeのOnDragDropイベントを使用しようとしましたが、わかりませんでした。私はドキュメントを見て、悲しいことに単純なノードのドラッグ・ドロップのためのサンプル・コードはありません。
単なるレベルリストです。 hierachyはありません。 :)
あなたはドラッグ&ドロップよりもGetNodeDataを介してデータを取得している場合は、次のように実装することができます。
uses
ActiveX;
割り当てドラッグイベントをツリーに:をOnDragAllowed
:
procedure TForm1.vt1DragAllowed(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
var Allowed: Boolean);
begin
Allowed := True;
end;
オンドラフト:
procedure TForm1.vt1DragOver(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState;
State: TDragState; Pt: TPoint; Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
begin
Accept := (Source = Sender);
end;
OnDragDrop:
procedure TForm1.vt1DragDrop(Sender: TBaseVirtualTree; Source: TObject; DataObject: IDataObject;
Formats: TFormatArray; Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
pSource, pTarget: PVirtualNode;
attMode: TVTNodeAttachMode;
begin
pSource := TVirtualStringTree(Source).FocusedNode;
pTarget := Sender.DropTargetNode;
case Mode of
dmNowhere: attMode := amNoWhere;
dmAbove: attMode := amInsertBefore;
dmOnNode, dmBelow: attMode := amInsertAfter;
end;
Sender.MoveTo(pSource, pTarget, attMode, False);
end;
もTreeOptions.AutoOptions
にFalseにtoAutoDeleteMoveNodes
を設定することを忘れないでください。
ありがとう!完璧に動作します! :) – Jeff
複数のノードを移動する方法に関するアイデア(単一レベルのリスト内)?選択されたすべてのノードを取得しようとしました.FocusedNodeだけでなく、ほとんど成功しませんでした。 SelectedCountは1より大きく、 'GetFirstSelected'は' FocusedNode'を返しますが、 'GetNextSelected'はnilを返します。 – DarkByte
@Linas - これはあなたのsvTreesコードと一緒にどのように動作するのですか?これを「Tree-like Datastructure(VirtualTreeviewで使用する)」の下に投稿したソリューションで使用すると、VSTreeを更新するだけで、基礎となるデータ構造ではないようです – TheSteven
複数のノードのドラッグ&ドロップ:
procedure TForm1.vst(Sender: TBaseVirtualTree;
Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
pSource, pTarget: PVirtualNode;
attMode: TVTNodeAttachMode;
List: TList<PVirtualNode>;
begin
pTarget := Sender.DropTargetNode;
case Sender.GetNodeLevel(pTarget) of
0:
case Mode of
dmNowhere:
attMode := amNoWhere;
else
attMode := amAddChildLast;
end;
1:
case Mode of
dmNowhere:
attMode := amNoWhere;
dmAbove:
attMode := amInsertBefore;
dmOnNode, dmBelow:
attMode := amInsertAfter;
end;
end;
List:= TList<PVirtualNode>.create();
pSource := Sender.GetFirstSelected();
while Assigned(pSource) do
begin
List.Add(pSource);
pSource := Sender.GetNextSelected(pSource);
end;
for pSource in List do
Sender.MoveTo(pSource, pTarget, attMode, False);
List.Free;
end;
それはあなたのツリーを構築した方法によって異なります。それに関するさらに詳しい情報を提供してください。 – Linas
すべてがPVirtualNodeのデータに格納されています。それは実際にはリストビューのようなものです。 – Jeff