把TreeView上的一个节点拖下来,放到一个panel或别的容器中,如何实现?

wenkai 2004-03-18 01:34:34
在一个form里,左边是一个树型列表,右边是一个panel容器,我的想法是用户用鼠标选中树中的一个Item,拖动到panel中释放鼠标,然后panel中就有了这个Item的内容。主要是拖动过程怎么控制,怎么在panel中定位?在panel中鼠标放下来我想可以通过动态创建label等控件来显示拖过来的item的内容,可是拖动过程我不知道如何实现。恳请大侠帮忙!在线等,有源码最好,或者提供例子,分不够可以再加!
...全文
118 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenkai 2004-03-18
  • 打赏
  • 举报
回复
谢谢!很好用!我再学习一下你的代码,如果有不明白的还请指教!现在结贴!
zswangII 2004-03-18
  • 打赏
  • 举报
回复
//控制一下鼠标的区域,比较合理~~
procedure TForm1.LabelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
vRect: TRect;
begin
GetWindowRect(TLabel(Sender).Parent.Handle, vRect);
ClipCursor(@vRect);
FMouseDown := True;
FPoint := Point(X, Y);
end;

procedure TForm1.LabelMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FMouseDown := False;
ClipCursor(nil);
end;
wenkai 2004-03-18
  • 打赏
  • 举报
回复
谢谢!我试一下先:)
zswangII 2004-03-18
  • 打赏
  • 举报
回复
//参考如下代码~~

type
TForm1 = class(TForm)
Panel1: TPanel;
TreeView1: TTreeView;
procedure Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure LabelMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure LabelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure LabelMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
FPoint: TPoint;
FMouseDown: Boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if (Source is TTreeView) and Assigned(TTreeView(Source).Selected) then
with TLabel.Create(Self) do begin
Cursor := crHandPoint;
Parent := TWinControl(Sender);
Left := X;
Top := Y;
Caption := TTreeView(Source).Selected.Text;
OnMouseDown := LabelMouseDown;
OnMouseMove := LabelMouseMove;
OnMouseUp := LabelMouseUp;
end;
end;

procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (Source is TTreeView) and Assigned(TTreeView(Source).Selected);
end;

procedure TForm1.LabelMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FMouseDown then begin
TLabel(Sender).Left := TLabel(Sender).Left + (X - FPoint.X);
TLabel(Sender).Top := TLabel(Sender).Top + (Y - FPoint.Y);
end;
end;

procedure TForm1.LabelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FMouseDown := True;
FPoint := Point(X, Y);
end;

procedure TForm1.LabelMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FMouseDown := False;
end;


//上贴回的时候就想到要有这个功能,还以为你已经搞定了~~
wenkai 2004-03-18
  • 打赏
  • 举报
回复
还想再问一下,创建出来的label如何控制它在panel中移动?
wenkai 2004-03-18
  • 打赏
  • 举报
回复
haha,谢谢zswangII(伴水清清)(职业清洁工),初步可以用了,我再改进一下,很快就结贴了:)
zswangII 2004-03-18
  • 打赏
  • 举报
回复
object TreeView1: TTreeView
DragMode = dmAutomatic
end

object Panel1: TPanel
OnDragDrop = Panel1DragDrop
OnDragOver = Panel1DragOver
end


procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (Source is TTreeView) and Assigned(TTreeView(Source).Selected);
end;

procedure TForm1.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if (Source is TTreeView) and Assigned(TTreeView(Source).Selected) then
with TLabel.Create(Self) do begin
Parent := TWinControl(Sender);
Left := X;
Top := Y;
Caption := TTreeView(Source).Selected.Text;
end;
end;

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧