A
atoi
Unregistered / Unconfirmed
GUEST, unregistred user!
(请关注问题本身,不要建议我用现成的TDBTreeview等等)
我自己制作了一个TDBTreeview控件,在模式对话框中使用完全达到了设计目标。我从TTreeView和TTreeNode派生了TDBTreeView和TDBTreeNode,TDBTreeNode只是增加了几个属性,其他没变化。
现在的问题是,当我在一个TFrame中使用这个控件,则在TFrame加载的时候,我调用如下所示的TDBTreeview.Load方法添加TDBTreeNode到TDBTreeView,当Load方法结束的时候,TDBTreeNode的Destroy方法立刻就会被调用了,也就是说添加的节点被过早的释放了。在使用的时候TDBTreeView所扩充的几个属性的值全部丢失了。请问我的代码存在什么问题吗?或者该如何避免TDBTreeNode被释放这一点?
procedure TDBTreeview.Load(DataSet: TDataSet);
var
AddingNode: TDBTreeNode;
CurrentNode: TDBTreeNode;
AddingParent: Integer;
AddingTitle: string;
begin
if Assigned(DataSet) then
FdataSet := DataSet;
if not Assigned(FDataSet) then
Exit;
if (Length(FDepthField) = 0) or (Length(FTitleField) = 0) or (Length(FParentIdField) = 0) then
Exit;
Items.Clear;
CurrentNode := nil;
with FDataSet do
try
while not EOF do
begin
// ÅжÏÒªÌí¼ÓµÄ½ÚµãÓ뵱ǰ½ÚµãµÄÏà¶Ô¹Øϵ
AddingParent := FieldByName(FParentIdField).AsInteger;
AddingTitle := FieldByName(FTitleField).AsString;
CurrentNode := FindNode(CurrentNode, AddingParent);
AddingNode := TDBTreeNode.Create(Items);
AddingNode.FDBTreeView := self;
if nil = inherited Items.AddNode(AddingNode, CurrentNode, AddingTitle, nil, naAddChild) then
Exit;
AddingNode.NodeID := FieldByName(FIdField).AsInteger;
AddingNode.OrderInBrothers := FieldByName(FOrderInBrothersField).AsInteger;
AddingNode.Depth := FieldByName(FDepthField).AsInteger;
AddingNode.ParentID := FieldByName(FParentIDField).AsInteger;
CurrentNode := AddingNode;
Next;
end;
except
end;
end;
我自己制作了一个TDBTreeview控件,在模式对话框中使用完全达到了设计目标。我从TTreeView和TTreeNode派生了TDBTreeView和TDBTreeNode,TDBTreeNode只是增加了几个属性,其他没变化。
现在的问题是,当我在一个TFrame中使用这个控件,则在TFrame加载的时候,我调用如下所示的TDBTreeview.Load方法添加TDBTreeNode到TDBTreeView,当Load方法结束的时候,TDBTreeNode的Destroy方法立刻就会被调用了,也就是说添加的节点被过早的释放了。在使用的时候TDBTreeView所扩充的几个属性的值全部丢失了。请问我的代码存在什么问题吗?或者该如何避免TDBTreeNode被释放这一点?
procedure TDBTreeview.Load(DataSet: TDataSet);
var
AddingNode: TDBTreeNode;
CurrentNode: TDBTreeNode;
AddingParent: Integer;
AddingTitle: string;
begin
if Assigned(DataSet) then
FdataSet := DataSet;
if not Assigned(FDataSet) then
Exit;
if (Length(FDepthField) = 0) or (Length(FTitleField) = 0) or (Length(FParentIdField) = 0) then
Exit;
Items.Clear;
CurrentNode := nil;
with FDataSet do
try
while not EOF do
begin
// ÅжÏÒªÌí¼ÓµÄ½ÚµãÓ뵱ǰ½ÚµãµÄÏà¶Ô¹Øϵ
AddingParent := FieldByName(FParentIdField).AsInteger;
AddingTitle := FieldByName(FTitleField).AsString;
CurrentNode := FindNode(CurrentNode, AddingParent);
AddingNode := TDBTreeNode.Create(Items);
AddingNode.FDBTreeView := self;
if nil = inherited Items.AddNode(AddingNode, CurrentNode, AddingTitle, nil, naAddChild) then
Exit;
AddingNode.NodeID := FieldByName(FIdField).AsInteger;
AddingNode.OrderInBrothers := FieldByName(FOrderInBrothersField).AsInteger;
AddingNode.Depth := FieldByName(FDepthField).AsInteger;
AddingNode.ParentID := FieldByName(FParentIDField).AsInteger;
CurrentNode := AddingNode;
Next;
end;
except
end;
end;