求简单的实现方法!关于treeview类的!(200分)

  • 主题发起人 主题发起人 gophie
  • 开始时间 开始时间
G

gophie

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库关联树,line字段10位编码,22222形式,
如0100000000为第一个子节点!0101000000为二层节点。
生成树语句:
qrySelect.Open;
treeviewClassify.Items.Clear;
arrDCNode[0] := treeviewClassify.Items.Add(nil,'分类表');
preLevel:=0;
while not qrySelect.Eofdo
begin
if qrySelect.FieldByName('nlevel').AsInteger>preLevel then
begin
arrDCNode[qrySelect.FieldByName('nlevel').AsInteger] := treeviewClassify.Items.AddChild(arrDCNode[preLevel],
qrySelect.FieldByName('line').AsString+' '+qrySelect.FieldByName('code').AsString+' '+qrySelect.FieldByName('name').AsString);
preLevel:=qrySelect.FieldByName('nlevel').AsInteger;
end
else
begin
if qrySelect.FieldByName('nlevel').AsInteger=preLevel then
begin
arrDCNode[qrySelect.FieldByName('nlevel').AsInteger] := treeviewClassify.Items.AddChild(arrDCNode[qrySelect.FieldByName('nlevel').AsInteger-1],
qrySelect.FieldByName('line').AsString+' '+qrySelect.FieldByName('code').AsString+' '+qrySelect.FieldByName('name').AsString);
end
else
begin
arrDCNode[qrySelect.FieldByName('nlevel').AsInteger] := treeviewClassify.Items.AddChild(arrDCNode[qrySelect.FieldByName('nlevel').AsInteger-1],
qrySelect.FieldByName('line').AsString+' '+qrySelect.FieldByName('code').AsString+' '+qrySelect.FieldByName('name').AsString);
preLevel:=qrySelect.FieldByName('nlevel').AsInteger;
end;
end;
qrySelect.Next;
end;
问,要实现树节点之间的任意拖放操作。不但要快捷,而且力求防止五操作。
我能实现,但实现方法自己觉得不够有效!
希望熟手指点。不胜感谢。不过希望尽快!
 
有现成的控件
 
??
dbtreeview,还是tdctree?
还是自己写好玩!
 
随便点啦!拷一段你自己写的程序上去大家交流交流啦!
我只是想看看别人如何写的!
分数多多啦!
大家快来啦!
 
procedure TMainaaWin.TVDragOver(Sender, Source: TObject;
X, Y: Integer;
State:
TDragState;
var Accept: Boolean);
var CheckedNode: TTreeNode;
begin
SourceNode := TV.Selected;
TargetNode := TV.GetNodeAt(X, Y);
Accept := False;
CanDrop := False;

if (TargetNode = nil) and (Xmmain.State = dsBrowse) then
begin
if SourceNode.Level = 0 then

begin

Accept := False;
CanDrop:= False;
end;
if SourceNode.Level > 0 then

begin

Accept := True ;
CanDrop:= True ;
end;
end;

if (TargetNode <>nil) and (Xmmain.State = dsBrowse) then
begin
Accept := True;
CanDrop := True;
CheckedNode := TargetNode;
While CheckedNode <> nildo

begin

if CheckedNode.Parent = SourceNode then

begin

Accept := False;
CanDrop := False;
Break;
end;

CheckedNode := CheckedNode.Parent;
end;
if SourceNode = TargetNode then
begin
Accept := False;
CanDrop := False;
end;
if SourceNode.Parent = TargetNode then
begin
Accept := False;
CanDrop := False;
end;
end;
该函数决定是否可以拖动节点。
几年前做的,没加注释,没有优化,但是很有效,可以防止错误拖动!
 
网上有例子
 
多人接受答案了。
 

Similar threads

后退
顶部