现在回答你的第一个问题: 你所要做的有两件事,一:在treeview中实现拖拽功能,很简单: procedure TForm1.treeview1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept:=sender=source; if y<10 then postmessage(treeview1.handle,WM_VScroll,SB_LINEUp,0) else if treeview1.Height-y<10 then postmessage(treeview1.handle,WM_VScroll,SB_LINEDOWN ,0) end; procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);var AnItem: TTreeNode; AttachMode: TNodeAttachMode; HT: THitTests; begin if TreeView1.Selected = nil then Exit; HT := TreeView1.GetHitTestInfoAt(X, Y); AnItem := TreeView1.GetNodeAt(X, Y); if (HT - [htOnItem, htOnIcon, htNowhere, htOnIndent] <> HT) then begin if (htOnItem in HT) or (htOnIcon in HT) then AttachMode := naAddChild else if htNowhere in HT then AttachMode := naAdd else if htOnIndent in HT then AttachMode := naInsert; TreeView1.Selected.MoveTo(AnItem, AttachMode); end; end; 有一个问题是:有些节点不能移动,这就需要你自己根据需要控制了; 二:你要在改变树型结构同时改变员工的所属部门; 在上面的TreeView1.Selected.MoveTo(AnItem, AttachMode); 语句下写上: with query1 do begin colse; sql.clear; sql.add('update ‘表2’'); sql.add('set '员工名字段'='''+anitem.text+''''); sql.add('where '员工名字段'='''+TreeView1.Selected.text+''''); end;
你所要做的有两件事,一:在treeview中实现拖拽功能,很简单:
procedure TForm1.treeview1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept:=sender=source;
if y<10 then
postmessage(treeview1.handle,WM_VScroll,SB_LINEUp,0)
else if treeview1.Height-y<10 then
postmessage(treeview1.handle,WM_VScroll,SB_LINEDOWN ,0)
end;
procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);var
AnItem: TTreeNode;
AttachMode: TNodeAttachMode;
HT: THitTests;
begin
if TreeView1.Selected = nil then Exit;
HT := TreeView1.GetHitTestInfoAt(X, Y);
AnItem := TreeView1.GetNodeAt(X, Y);
if (HT - [htOnItem, htOnIcon, htNowhere, htOnIndent] <> HT) then
begin
if (htOnItem in HT) or (htOnIcon in HT) then AttachMode := naAddChild
else if htNowhere in HT then AttachMode := naAdd else if htOnIndent in HT then AttachMode := naInsert;
TreeView1.Selected.MoveTo(AnItem, AttachMode);
end;
end;
有一个问题是:有些节点不能移动,这就需要你自己根据需要控制了;
二:你要在改变树型结构同时改变员工的所属部门;
在上面的TreeView1.Selected.MoveTo(AnItem, AttachMode); 语句下写上:
with query1 do
begin
colse;
sql.clear;
sql.add('update ‘表2’');
sql.add('set '员工名字段'='''+anitem.text+'''');
sql.add('where '员工名字段'='''+TreeView1.Selected.text+'''');
end;
2。基本同意 wanwangzhiwang(万王之王),若公司部门(第一级节点)不需要移动,在
Accept:=sender=source 前加上一句: Accept:=Not (Source.Lever=0);
3。当你修改了一个结点,要及时对数据库做相应的修改。
4。本来删除、增加比较简单。但要考虑到员工的名字可能相同,所以不能以名字来检索,
要利用TTreeNode.Data 属性。你的问题其实比较简单,就是很繁。所以我也只能说这么多了。
1.无法修改dbgrid中的数据的问题:你可以查看一下你的dbgrid中的属性设置,比如Options中的dgEditing属性,ReadOnly属性,若这些属性设为只读,则将不能修改dbgrid中的数据。具体设置可以查一下参考资料。另外,你连接数据库的用户是否有对数据库写的权限(请说明一下无法修改的原因)。
2.自动存盘及自动更改的问题:这个主要是选择触发事件,你可以在dbgrid中数据发生或焦点改变时(事件中)执行存盘操作(提交)。但这样做我觉得并不很好,当一个数据库很大,而在输入时就出错了,想修改一下,将会浪费时间。在treeview中动态调整某人所属部门也是同样的道理。
就如wanwangzhiwang(万王之王)兄所说的,这个实现很繁,慢慢做吧!呵呵。
说得不对,请各路高手指正,希望能共同提高。
如果你真的想在dbgrid中修改的话,建议你加一个TDBNavigator控件,使用起来很简单!
如果相同时修改treeview中的数据就有点繁,这样吧,你干脆重新构建一次!
至于其他问题,我现在很忙,等我有时间帮你解决吧!