关于控件释放的问题。(100分)

  • 主题发起人 主题发起人 FreeBit
  • 开始时间 开始时间
F

FreeBit

Unregistered / Unconfirmed
GUEST, unregistred user!
要删除一个窗体中某些的控件,
用下面的遍历方法当然可以通过,
i:=0;
while i<=self.ComponentCount-1 do
begin
if self.Components.Tag<>0 then
begin
self.Components.Destroy;
IntHandle:=i-1;
end;
i:=i+1;
end;
但是窗体控件很多恐怕会影响速度,
我就想用发送消息的办法删除指定控件(句柄已知),
SendMessage(IntHandle,WM_Close,0,0);//这样好象没有真正删除
但是一直试不成功
各位高手,有没有好的办法?

 
这一句self.Components.Destroy;是删除不干净的,应改为以下两句:
self.Components.free;
self.Components := nil ;


 
to HunterTeam
谢谢你,发现了这个问题。
但现在它并不是问题的关键,关于释放你有什么好的方法吗?
 
分数太少了吗?
好吧,如果谁能解决问题,
另外增加200分。
 
销毁的消息是WM_DESTROY吧,楼主!
这样试试:SendMessage(IntHandle,WM_DESTROY,0,0);
我没用过。(:
 
就算你可以发送消息销毁控件,但对于一些没有窗口句柄的控件比如TImage,TSpeedButton等你是没有办法发消息给他们的。
 
to 网事如风, TYZhang
我忘记告诉大家了,SendMessage(IntHandle,WM_DESTROY,0,0);
方法我也试过了,没有反应。
关于TImage的问题,我也考虑过了
我写了一个简单的控件就是 TImage+TPanel来解决这个问题
注:TPanel是有句柄的。
大家还有什么好的办法吗?
 
DestroyWindow(IntHandle);
一定行的,给分吧 :)
 
你可以自己拦消息然后自己处理。
在你的控件(这里取名为TSelf)中的private段加入
private WMClose(var msg: TMessage); message WM_CLOSE;
然后在代码中加入
private TSelf.WMClose(var msg: TMessage);
begin
Msg.Result:= 1;
FreeAndNil(Self);
end;
FreeAndNil是一个释放函数,它相当于
Self.Free;
Self:= nil;
不过它好像是同时执行Free和Nil。
注:拦WM_CLOSE可能有问题你可以试一下其它消息。
 

Similar threads

S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
S
回复
0
查看
894
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
922
SUNSTONE的Delphi笔记
S
后退
顶部