2011-12-13 7 views
5

ノードのリストがあります。私は、ドラッグ&ドロップの並べ替え機能を追加したいと思いますが、私はこれを行う方法を知りません。VirtualTreeviewドラッグアンドドロップでリスト内のノードを整理する

私はTVirtualStringTreeのOnDragDropイベントを使用しようとしましたが、わかりませんでした。私はドキュメントを見て、悲しいことに単純なノードのドラッグ・ドロップのためのサンプル・コードはありません。

単なるレベルリストです。 hierachyはありません。 :)

+0

それはあなたのツリーを構築した方法によって異なります。それに関するさらに詳しい情報を提供してください。 – Linas

+0

すべてがPVirtualNodeのデータに格納されています。それは実際にはリストビューのようなものです。 – Jeff

答えて

11

あなたはドラッグ&ドロップよりも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を設定することを忘れないでください。

+0

ありがとう!完璧に動作します! :) – Jeff

+0

複数のノードを移動する方法に関するアイデア(単一レベルのリスト内)?選択されたすべてのノードを取得しようとしました.FocusedNodeだけでなく、ほとんど成功しませんでした。 SelectedCountは1より大きく、 'GetFirstSelected'は' FocusedNode'を返しますが、 'GetNextSelected'はnilを返します。 – DarkByte

+0

@Linas - これはあなたのsvTreesコードと一緒にどのように動作するのですか?これを「Tree-like Datastructure(VirtualTreeviewで使用する)」の下に投稿したソリューションで使用すると、VSTreeを更新するだけで、基礎となるデータ構造ではないようです – TheSteven

0

複数のノードのドラッグ&ドロップ:

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; 
関連する問題