首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi自个儿写的控件用free和freeAndNil释放效果为什么不一样呢

2012-12-29 
delphi自己写的控件用free和freeAndNil释放效果为什么不一样呢今天写了个类似改变窗体皮肤的小控件,但是在

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释放的
[解决办法]
这是比较奇怪的。。

热点排行