treeview同级节点托动怎么实现阿?谢谢
解决方案 »
- 在dbgrid中查询到了一组数据想把其中在另一表中没有的数据去到怎么做?
- 如何将listview中的内容从服务器端发送给客户端,并显示在客户端的LISTVIEW中?
- 怎样将两个时间类型相减最后得到的结果还是时间型?请教!
- 如何判断指定文件夹是否存在
- ●●●●哪有可打印的李维的《Delphl5.x ADO/MTS/CoM+高级程序设计篇》●●●●
- 一个form调用的问题
- 请进........
- 老千,偶在win31组件版里找到几个drive组件,可以备份了,但是怎么恢复数据库呢?这个问题偶还没研究,偶先问问,过一会该没人了
- 如何知道我按的是OK按钮,还是Cancel按钮
- 如何给Treeview添加背景
- 使用fastreport的问题,需要限制可用表的选择
- 问一个菜的问题
Shift: TShiftState; X, Y: Integer);
begin
with Sender as TTreeView do
begin
if (Button = mbLeft) and (htOnItem in GetHitTestInfoAt(X,Y)) then
BeginDrag(false);
end;
end;
procedure TForm1.TreeViewDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
aNode : TTreeNode;
ks: TkeyBoardState;
begin
Accept := (Source is TTreeView);
with Sender as TTreeView do
begin
aNode := GetNodeAt(X, Y);
if aNode <> nil then
begin
//Accept := true; // 允许拖动
FMoveAsChild := false;
GetKeyboardState(ks);
if ks[VK_CONTROL] and $80 <> 0 then
FMoveAsChild := true;
// Items.BeginUpdate;
// 控制向上滚动
if Y <= 15 then
SendMessage(Handle, WM_VSCROLL, SB_LINEUP, 0)
else // 控制向下滚动
if (Height-Y <= 25) then
SendMessage(Handle, WM_VSCROLL, SB_LINEDOWN, 0);
//Refresh;
// Items.EndUpdate;
end;
end;
end;procedure TForm1.myMoveNodes(tv: TTreeView; dNode, NeedMoveNodes: TTreeNode; MoveAsChild: boolean);
var
aNode: TTreeNode;
i: integer;
begin
if MoveAsChild then
aNode := tv.Items.AddChild(dNode, NeedMoveNodes.Text)
else
aNode := tv.Items.Insert(dNode, NeedMoveNodes.Text); for i:= 0 to NeedMoveNodes.Count-1 do
begin
myMoveNodes(tv, aNode, NeedMoveNodes.Item[i], true);
end;
end;procedure TForm1.TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer);
var
sNode, dNode, aNode: TTreeNode;
begin
sNode := (Source as TTreeView).Selected;
if sNode = nil then exit; dNode := (Sender as TTreeView).GetNodeAt(X, Y);
if dNode = nil then exit; (Sender as TTreeView).Items.BeginUpdate;
if FMoveAsChild then // 作为孩子, 这段代码不够优化,为的是更好地移动对应节点内容
begin
aNode := dNode.GetNextSibling;
if aNode = nil then
begin
if Sender = Source then
begin
aNode := (Sender as TTreeView).Items.AddChild(dNode, 'Temp');
sNode.MoveTo(aNode, naInsert);
aNode.Delete;
end
else begin
myMoveNodes(Sender as TTreeView, dNode, sNode, true);
(Sender as TTreeView).Selected := dNode;
end;
end
else begin
if Sender = Source then
(Sender as TTreeView).Selected.MoveTo(dNode, naAddChild)
else begin
myMoveNodes(Sender as TTreeView, dNode, sNode, true);
(Sender as TTreeView).Selected := dNode;
end;
end;
end
else begin // 移到前面
if Sender = Source then
(Sender as TTreeView).Selected.MoveTo(dNode, naInsert)
else begin
myMoveNodes(Sender as TTreeView, dNode, sNode, false);
(Sender as TTreeView).Selected := dNode;
end;
end;
(Sender as TTreeView).Items.EndUpdate; FMoveAsChild := false;
end;
Y: Integer);
var targetnode,sourcenode:TTreenode;
MyHitTest : THitTests;
begin
targetnode:=ClassTree.getnodeat(x,y); //获得源节点
sourcenode:=ClassTree.selected; //获得目标节点
MyHitTest := ClassTree.GetHitTestInfoAt(X,Y);
if htOnIcon in MyHitTest then begin
SwapNode(targetnode,sourcenode);
if (Fini.LogSet>0) then
RecordLog('拖动频道['+sourcenode.Text+']改变顺序');
end else begin
//修改数据库中当前节点的父节点号parent_id,使其等目标节点标识号;
ClassTree.items.beginupdate; //禁用TreeView重绘操作
try
copynodeunder(ClassTree,sourcenode,targetnode); //启动移动过程
ClassTree.selected:=targetnode;
finally
ClassTree.items.endupdate; //重新设置
end;
end;
end;
procedure CopyNodeUnder(treeview:TTreeview;sourcenode,targetnode:ttreenode);
var newnode:ttreenode;
i:integer;
begin
newnode:=TreeView.items.addchildfirst(targetnode,''); //建立目标项
newnode.assign(sourcenode); //复制源项属性
// pMyid(newnode.Data)^.nodeParent:=pMyid(targetnode.Data)^.nodeid;
for i:=sourcenode.count-1 downto 0 do //递归调用,按倒序移动其所有子项
CopyNodeUnder (treeview,sourcenode.item[i],newnode);
treeview.items.delete(sourcenode); //删除源项
end;procedure SwapNode(targetnode,sourcenode:TTreeNode);
begin
Sourcenode.MoveTo(targetnode,naInsert);
end;