如题,从一个TdxTreeList中的拖放到另外一个TdxTreeList中,或者同个TdxTreeList中的拖放,最好有给个例子,小弟是新人,分数不多。
解决方案 »
- stringrid中的数据如何导出成文件文件啊。。
- 检测出程序内存泄漏,出现下面的提示,请问一下该怎么解决呢
- TWordApplication调用WORD的问题?
- D5的ADO数据控件,为什么者查询的数据纪录为0的时候,关闭出错啊?
- 这是什么控件,到那里获得?
- 如何手工更新数据
- 想结合COM或Corba实现支持多线程的数据库系统,应注意什么
- 欢迎大家下载我的软件,下载者有分.
- 如何在两个mdb数据库间传递数据(高分酬谢)?
- 多层应用客户端的发布问题?
- 请教:quickreport 做成一个报表(横线和竖线都是用qrshape画的),但打印多页时,最后一页没有数据的空白处还是有横线和竖线,有什么办法消除掉。
- 寻找兼职DELPHI7+SQL2000,需时一个月左右时间!有兴趣请加我QQ联系:1934767
DragCursor 确定拖动时的鼠标指针
DragDrop 产生一个OnDragDrop事件
DragMode 确定拖放是自动控制还是由程序控制
Dragging 确定控件是否正在被拖动
onDragDrop 事件,当对象被Drop到某处时触发
OnDragOver 事件,当对象被拖动经过控件时触发
OnEndDrag 事件,拖动结束时触发,不论是Drop到某处还是取消拖放
OnStartDrag 事件,拖动开始时触发 提供一例程:(使用的控件为:1stClass4000中的TFcTreeView)procedure TChildDeptForm.tvDeptsDragDrop(Sender, Source: TObject; X,
Y: Integer);
Var
SourceNode,TargetNode:TfcTreeNode;
Dept: TDept;
begin
inherited;
//拖动停止
TargetNode := tvDepts.GetNodeAt(x,y);
if TargetNode <> nil then
Begin
SourceNode := tvDepts.Selected;
Dept := TDept.Create;
Try
Dept.UpdateParent(SourceNode,TargetNode);
finally
Dept.Free;
end;
SourceNode.MoveTo(TargetNode,tfcNodeAttachMode(2));
tvDepts.Selected :=TargetNode;
end;
end;procedure TChildDeptForm.tvDeptsDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
Var
TargetNode,SourceNode: TfcTreeNode;
begin
inherited;
//拖动经过
//目标节点
TargetNode := tvDepts.GetNodeAt(x,y);
if (Source=Sender) and (TargetNode <> nil) then
Begin
Accept := True;
SourceNode := tvDepts.Selected;
while (TargetNode.Parent <> nil ) and (TargetNode <> SourceNode ) do
TargetNode := TargetNode.Parent;
if TargetNode = SourceNode then
Accept := False;
end else
Accept := False;
end;
我改过后的代码如下:procedure TForm1.dxTreeListDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
inherited;
//拖动经过
//目标节点
if (SelectNode <> nil) AND ((Sender=Source) or (TdxTreeList(Source) = dxTreeList_1)) then
Accept := True
else
Accept := False;
end; procedure TForm1.dxTreeListDragDrop(Sender, Source: TObject; X,
Y: Integer);
var
CurMouseAtNode: TdxTreeListNode;
begin
inherited;
CurMouseAtNode:=dxTreeList.GetNodeAt(X,Y); //取得目标树中鼠标当前所在的节点,用以确定拖放节点插入的位置
//拖动停止
if SelectNode <> nil then
Begin
With dxTreeList.Insert(CurMouseAtNode) do //在CurMouseAtNode之前插入拖放的节点
begin
Values[0]:= SelectNode.Values[0];
end;
if Sender=Source then //如果源树=目标树,则在插入拖放节点后,需要将原来的节点删除
SelectNode.Free;
end;
end; procedure TForm1.dxTreeListMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SelectNode:=dxTreeList.GetNodeAt(X,Y); //取得目标树中选择的节点,并保存起来
end; procedure TForm1.dxTreeList_1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SelectNode:=dxTreeList_1.GetNodeAt(X,Y); //取得源树中选择的节点,并保存起来
end; 代码说明:1、SelectNode是一个全局变量,用来保存要拖放的节点,感觉这样做不是很好,有更好的办法来保存当前拖放的是哪个节点吗?
2、dxTreeList是目标树,dxTreeList_1是源树,在目标树dxTreeList内也要允许拖放(这样用户就能方便的调节各个节点的顺序了)因为第一次也这样的效果,所以对代码不是很有把握,希望下面的大侠能给点宝贵的意见。
1:源和目标中的selectNode应该分别定义两个节点,不然的话,在拖放结束后,源节点的值被目标节点改变.
2:在目标结节中没有考虑目标里面是空的情况.如果treelist2为空的话,上面的代码好像就形成了什么也没有拖进去.
3:选择源节点:在BeginDragNode(Sender: TObject; Node: TdxTreeListNode);中取值;SourceNode:=Node;
4:好像你拖完后还要比较目标节点与源结点.有一个问题没有确定,A:是要求目标节点跟源节点始终保持一致?即目标节点比源节点的项数多就删除?如果源节点比目标节点多就添加?这样子的话在拖放完成后还要对目标节点与源节点进行对比.感觉很麻烦.如果真的有这样的情况发生的话,在数据库中对添加的节点实时保存到数据库,存在时放弃,不存在就添加.然后再反高对比.
这站已经用了我很多钱买伺服器了,希望能够搞一个出名的编程资源网
谢谢
这站已经用了我很多钱买伺服器了,希望能够搞一个出名的编程资源网
谢谢