« ■Delphi7のアップデート | トップページ | ■Delphi7 Updateは失敗? »

☆TreeViewのDrag&Drop

[Windowsフォームアプリケーション]
HELPや[HOW TO] Visual C# .NET アプリケーションにツリー ビューのドラッグ アンド ドロップ機能を追加する方法を参考にTreeViewのDrag&Dropを試してみました。HELPでは、ListBoxでの参考例がありますが、Clickで移動、CTRL+Clickでコピーという動作を実装しています。

フォームにTreeView1を配置して、下記のプログラムを記述します。
procedure TWinForm1.TWinForm1_Load(sender: System.Object;
 e: System.EventArgs);
begin
 TreeView1.AllowDrop := True;

 TreeView1.Nodes.Add('Item1');
 TreeView1.Nodes.Add('Item2');
 TreeView1.Nodes.Add('Item3');
end;

procedure TWinForm1.TreeView1_ItemDrag(sender: System.Object;
 e: System.Windows.Forms.ItemDragEventArgs);
var
 DDE : DragDropEffects;
begin
 //ドラッグ開始
 DDE := TreeView1.DoDragDrop(e.Item, DragDropEffects.All);
 //動作の結果表示
 if ((DDE and DragDropEffects.Move) = DragDropEffects.Move) then
  Self.Text := '移動しました。'
 else if ((DDE and DragDropEffects.Copy) = DragDropEffects.Copy) then
  Self.Text := 'コピーしました。'
 else
  Self.Text := '処理しませんでした。';
end;

procedure TWinForm1.TreeView1_DragOver(sender: System.Object;
 e: System.Windows.Forms.DragEventArgs);

 function IsChild(Item1, Item2: TreeNode): Boolean;
 begin
  if (Item2.Parent = Item1)  then
   Result := True
  else if (Item2.Parent <> nil) then
   Result :=  IsChild(Item1, Item2.Parent)
  else
   Result := False;
 end;

var
 Target, Source: TreeNode;
begin
 //データ形式のチェック
 if not e.Data.GetDataPresent(TypeOf(TreeNode)) then
 begin
  e.Effect := DragDropEffects.None;
  Exit;
 end;

 //ドロップできるかどうか
 Target := TreeView1.GetNodeAt(
       TreeView1.PointToClient(Point.Create(e.X, e.Y)));
 Source := TreeNode(e.Data.GetData(TypeOf(TreeNode)));

 if ((Target <> nil) and (Target <> Source) and 
   (not IsChild(Source, Target))) then begin
  TreeView1.SelectedNode := Target;
  if ((e.KeyState and 8) = 8) and 
   ((e.AllowedEffect and DragDropEffects.Copy) = DragDropEffects.Copy) then
   e.Effect := DragDropEffects.Copy //CTRL + Left Click
  else if ((e.AllowedEffect and DragDropEffects.Move) = DragDropEffects.Move) then
   e.Effect := DragDropEffects.Move
  else
   e.Effect := DragDropEffects.None;
 end else
  e.Effect := DragDropEffects.None;
end;

procedure TWinForm1.TreeView1_DragDrop(sender: System.Object;
 e: System.Windows.Forms.DragEventArgs);
var
 Target, Source, NewNode: TreeNode;
begin
 if (e.Effect = DragDropEffects.None) then Exit;

 Source := TreeNode(e.Data.GetData(TypeOf(TreeNode)));
 Target := TreeView1.GetNodeAt(TreeView1.PointToClient(Point.Create(e.X, e.Y)));

 NewNode := TreeNode(Source.Clone);
 Target.Nodes.Add(NewNode);
 TreeView1.SelectedNode :=NewNode;

 if (e.Effect = DragDropEffects.Move) then
  Source.Remove;
end;

|

« ■Delphi7のアップデート | トップページ | ■Delphi7 Updateは失敗? »