关于使用Frame的问题(100分)

阿韬

Unregistered / Unconfirmed
GUEST, unregistred user!
关于使用Frame的问题。

我定义了一个Frame:TfraAllList;

在一个工程中如下调用了这个Frame

var
uFraAllList: TfraAllList;
begin
...

if (uFraAllList = nil) then
begin
uFraAllList := TfraAllList.Create(nil);
end;
uFraAllList.Parent := SBoxBasic;
//SBoxBasic是Panel上的一个TScrollBox控件
uFraAllList.proInit(TVCustTree);
//TVCustTree是一个TTreeView控件,proInit是TfraAllList中定义在publish中的方法

...
end;

TfraAllList中的程序如下:
在private中
TVCustTree: TTreeView;

在public中
procedure proInit(tv: TTreeView);


procedure TfraAllList.proInit(tv: TTreeView);
begin
...
TVCustTree := tv;
...
end;

然后在这个Frame的一个按钮的onclick事件中有如下代码:
TVCustTree.Selected := TVCustTree.Selected.Item[0];

在程序的运行过程中,如果点击这个Frame里按钮,就报出内存错误:
'Access violation at address 00403846 in module 'MCM.exe'. Read of address
FFFFFFD0'. Process stopped. Use Step or Run to continue.


请问各位怎么解决呀。谢谢!

 
procedure TfraAllList.proInit(tv: TTreeView);
begin
...
TVCustTree := tv;
...
end;
改为
TVCustTree.assign(tv);看看
 
玄成,这样搞不定。运行到TVCustTree.assign(tv)就报错。也是内存错误。
 
期待回答。。。。
 

可改为:
TVCustTree.Items.Assign(tv.Items);
还有你的
if (uFraAllList = nil) then
begin
uFraAllList := TfraAllList.Create(nil);
end;
if 语句有问题,这样判断一般不会执行create语句
应改为 if Assigned(uFraAllList) then 可判断控件是否已被创建
这也是一个原因,因为没创建,你初始化时,内存访问当然错误
 
我用TfraAllList.Create(nil)创建了uFraAllList后该怎么来释放这个内存。

我的意思是如果我这个时候需要创建另外一个Frame,比如
uFra1 := TFra1.Create(nil);这个时候我原来创建的TfraAllList该怎么来释放?
 
这样就行了吧
if assigned(uFraAllList) then
begin
uFraAllList.free;
uFraAllList:=nil;
end;
还是我理解错了你的意思?
 
玄成,我也是这样做的,我在任务管理器中看内存,好像没有减少什么,所以我觉得奇怪。
 
一个简单的frame应该占不了多少内存吧,就像一个控件,窗口上多一个和少一个应该也
不太明显.不过,你还真认真,我还没这么看过它到底耗多少呢,哈哈
 
问题是我的这个Frame上面有很多控件,而且我有很多Frame,占内存多呢。有时候一个就增加了100K。
 
问题的关键在都这些文字里。
然后在这个Frame的一个按钮的onclick事件中有如下代码:
TVCustTree.Selected := TVCustTree.Selected.Item[0];

在程序的运行过程中,如果点击这个Frame里按钮,就报出内存错误:
'Access violation at address 00403846 in module 'MCM.exe'. Read of address
FFFFFFD0'. Process stopped. Use Step or Run to continue.
----
我不明白你这段代码想做什么?让一个已经选择的节点跟到它的下一个子节点?
这里有一个致命的错误,就是如果你的TreeView没有选中任何一个节点就会报内存错,即是
你现在这种问题。如果你选中的节点没有子节点,就报越界错。
可以用Assigned(TreeView.Selected)来判断是不是已经选中了一个节点
可以用TreeView.Selected.Count来计算这个节点下面有多少个直接子节点。
另外,这个TVCustTree是引用另一个TreeView实例的,所以你对它操作其实就是对另一个
TreeView操作。
 
szf, 你说的这些判断是否选择了节点,是否有子节点我当然都作了判断,只是这里代码
没有写出来。我的意思是让这个树的当前节点变成选择的节点的某一个孩子节点。
 
如你所说的,你贴出来的代码已经可以了。
除非TVCustTree是个动态创建的TreeView,而调用时它还没有生成出来。
或者你把Frame外的TreeView和里面的私有定义不要使用相同的名称。
 
多人接受答案了。
 
顶部