控件的SetParent的问题!在线等待,解决问题,再送200分!(100分)

  • 主题发起人 主题发起人 desertsmoke
  • 开始时间 开始时间
D

desertsmoke

Unregistered / Unconfirmed
GUEST, unregistred user!
在写控件时遇到一个SetParent的问题!让两个对象以第三个对象为父对象。
代码如下:
——————————————————————————————————————————————————————————————
procedure TNewRoundLed.SetParent(Aparent:TWinControl);
begin
inherited Setparent(Aparent);
if NRoundLed <> nil then
begin
NRoundLed.Parent := AParent;
NRoundLed.Visible := True;
end;
if ShowLabel <> nil then
begin
ShowLabel.Parent := AParent;
ShowLabel.Visible := True;
end;
end;
————————————————————————————————————————————————————————————————

当把控件放到窗体上,然后关闭工程时提示下面的错误。
---------------------------
Error
---------------------------
Access violation at address 00000000. Read of address 00000000.
---------------------------
OK
---------------------------
确定,然后关闭Delphi,则提示下面的错误,Delphi就无法正常关闭了(只能从任务管理器中
结束任务了)!
---------------------------
Error
---------------------------
Access violation at address 4001D0A2 in module 'rtl60.bpl'. Read of address 00000001.
---------------------------
OK
---------------------------
************************************************************************************
问题的原因已经确定,就是SetParent的原因(因为我屏闭掉所有其他代码不能解决问题,屏蔽
掉SetParent后就一切OK了!)。而在另外一个控件中用法完全相同却没有这个问题,不知道是
哪里又产生了冲突?希望各位大虾不吝赐教!
 
cAkk, amo 来帮忙啊!
 
发生这种现象通常是试图访问不存在或者已经被释放的控件,你查查你的代码.最好释放后主动
加一句附为空的语句,系统的有时不可靠.
 
可是我代码里有判断的啊
 
一个TWinControl控件(这里是TNewRoundLed)有两个途径会被迫释放。
1、它所附着的Parent释放了
2、它所属于的Owner释放了
你的情况很显然就是因为用了SetParent,人为设置成跟VCL架构不一致,造成它被释放了两次。
解决办法是,在它的Parent释放前,把它的Parent属性设为nil,具体代码就要你自己调整罗。
另外, if AObject<>nil 这种判断还是少用,当你写程序写得经常连一个对象是不是存在都
不知道的话,你程序上的设计就很有问题了。
还有,当AObject生成实例后再Free掉,AObject<>nil仍然为真,但这时对AObject操作就会非法访问。
 
试用memproof跟踪一下。
另外,你的代码部分开不出来,我觉得你的判断有些问题,<> nil 不一定就是实例,你可以试试,声明一个对象的变量,然后不Create就访问,一般都不是nil
 
首先谢谢各位!
——————————————————————————————————————
procedure TNewRoundLed.SetParent(Aparent:TWinControl);
begin
//*************************************************
if Aparent=nil then exit;
//加这一句就好了,不知道为什么?!
//*************************************************
inherited Setparent(Aparent);
if NRoundLed <> nil then
begin
NRoundLed.Parent := AParent;
NRoundLed.Visible := True;
end;
if ShowLabel <> nil then
begin
ShowLabel.Parent := AParent;
ShowLabel.Visible := True;
end;
end;
应该是控件释放时出了问题!我在另一个控件中测试就没有这个问题。
 
你已经解决问题了,还想问什么呢?如果你想问在另一个控件中不出错的原因,我建议你能贴
出源码。
 
该回家了,散分
 
多人接受答案了。
 
后退
顶部