读书人

delphi自个儿写的控件用free和freeAnd

发布时间: 2012-12-29 10:28:09 作者: rapoo

delphi自己写的控件用free和freeAndNil释放效果为什么不一样呢
今天写了个类似改变窗体皮肤的小控件,但是在窗体删除控件的时候出现了奇怪的现象,部分代码如下:

控件paint消息处理中创建的组件(菜单栏和上面的最小化、最大化、关闭按钮)
if not Assigned(FMenu) then
begin
FMenu:=TImage.Create(FParentWin);
FMenu.Parent:=FParentWin;
FMenu.Stretch:=true;
FMenu.Picture.LoadFromFile('D:\pic\zyz_out.jpg');
FMenu.OnMouseDown:=MyOnMouseDown;
end;
FMenu.SetBounds(0,0,FParentWin.Width,30);

if not Assigned(FMin) then
begin
FMin:=TBitBtn.Create(FParentWin);
FMin.Glyph.LoadFromFile('D:\pic\减号.bmp');
FMin.Parent:=TWinControl(FParentWin);
FMin.OnClick:=MyMinClick;
end;
FMin.SetBounds(FParentWin.Width-60,5,15,15);
if not Assigned(FMax) then
begin
FMax:=TBitBtn.Create(FParentWin);
FMax.Glyph.LoadFromFile('D:\pic\加号.bmp');
FMax.Parent:=TWinControl(FParentWin);
FMax.OnClick:=MyMaxClick;
end;
FMax.SetBounds(FParentWin.Width-40,5,15,15);
if not Assigned(FClose) then
begin
FClose:=TBitBtn.Create(FParentWin);
FClose.Glyph.LoadFromFile('D:\pic\attention.bmp');
FClose.Parent:=TWinControl(FParentWin);
FClose.OnClick:=MyCloseClick;
end;
FClose.SetBounds(FParentWin.Width-20,5,15,15);

这是控件的destroy方法
方法一:
destructor TSkinTest.Destroy;
begin
FMin.Free;
FMax.Free;
FClose.Free;
FMenu.Free;

Fmin:=nil;
FMax:=nil;
FClose:=nil;
FMenu:=nil;
FParentWin.BorderStyle:=bsSizeable;
FParentWin.WindowProc:=FoldWinProc;
inherited Destroy;
end;

方法二:
destructor TSkinTest.Destroy;
begin
FreeAndNil(FMin);
FreeAndNil(FMax);
FreeAndNil(FClose);
FreeAndNil(FMenu);

FParentWin.BorderStyle:=bsSizeable;
FParentWin.WindowProc:=FoldWinProc;
inherited Destroy;
end;

方法三:
destructor TSkinTest.Destroy;
begin
FMin.Free;
FMax.Free;
FClose.Free;
FMenu.Free;

FParentWin.BorderStyle:=bsSizeable;
FParentWin.WindowProc:=FoldWinProc;
inherited Destroy;
end;

第一种方法,控件本身是删掉了,但是控件中创建的FMin FMax FClose FMenu还在界面上
方法二同方法一
方法三 可以达到效果。
忘高人讲解。。。。。。。


[解决办法]
FMin:=TBitBtn.Create(FParentWin);
说明应该由父form释放的
[解决办法]
这是比较奇怪的。。

读书人网 >.NET

热点推荐