zoukankan      html  css  js  c++  java
  • 先有Delphi内存对象,后有句柄(如果需要的话),最后再显示

    在设计期放上一个Panel1和Button1,然后设置Panel1.Visible:=False

    这时候执行:

    procedure TForm1.Button4Click(Sender: TObject);
    begin
      ShowMessage(IntToStr(panel1.InstanceSize));
    end;

    得到552,说明这个Panel1这个内存对象已经存在了。再把它的visible改成true,还是得到552。说明这个内存对象已经存在,且大小没区别(其内容可能会有所不同)。

    再重新把visible改成false,测试以下代码:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if (panel1.Handle=0) then
        ShowMessage('no handle')
      else
        ShowMessage('handled');
    end;

    结果总是显示已经有句柄了。这是为什么呢?明明还没有显示控件,理应执行HandleNeeded

    procedure TWinControl.HandleNeeded;
    begin
      if FHandle = 0 then
      begin
        if Parent <> nil then Parent.HandleNeeded;
        CreateHandle;
      end;
    end;
    
    function TWinControl.GetHandle: HWnd;
    begin
      HandleNeeded;
      Result := FHandle;
    end;

    这是因为使用Handle属性时,使用了GetHandle函数,瞬间就把句柄给创建了,所以怎么测试都是已经有句柄。

    所以要测,就应该测试FHandle。这就需要把FHandle从private改成public。然后测试:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      panel1 : TPanel;
    begin
      panel1:=TPanel.Create(nil);
      panel1.Left:=100;
      panel1.top:=100;
      if (panel1.FHandle=0) then
        ShowMessage('no handle')
      else
        ShowMessage('handled');
    end;

    这时候的结果就是no handle了。

    设计期把Panel1.visible改成false,再测试:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if (panel1.FHandle=0) then
        ShowMessage('no handle')
      else
        ShowMessage('handled');
    end;

    其结果也是no handle

    ------------------------------------------------------------------------------------------------------------------------------------------

    再来一个出错的代码:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      panel1 : TPanel;
    begin
      panel1:=TPanel.Create(nil);
      panel1.Left:=100;
      panel1.top:=100;
      if (panel1.Handle=0) then
        ShowMessage('no handle')
      else
        ShowMessage('handled');
    end;

    顿时出错。因为还没有指定父控件,却在执行Handle属性的GetHandle方法时出错。其实我是从这个错误的例子中,忽然明白,直接使用Panel1.handle=0还没那么简单,是有问题的,不可以使用这种方法来判断。

    ------------------------------------------------------------------------------------------------------------------------------------------

    再来一个问题,设计期放置Image1并载入图片,然而visible设为false,此时Image1在内存中的状态会怎么样呢?目前还不清楚。。。

  • 相关阅读:
    安装Python 3.6 在Ubuntu 16.04 LTS 版本
    [leetcode]447. Number of Boomerangs
    【leetcode】443. String Compression
    第7课 课堂学习小问答
    第11章 进程间通信(4)_进程信号量
    第11章 进程间通信(3)_共享内存
    第11章 进程间通信(2)_消息队列
    第11章 进程间通信(1)_管道
    第10章 线程控制(5)_多线程下的fork
    第10章 线程控制(4)_多线程下的信号
  • 原文地址:https://www.cnblogs.com/findumars/p/5185061.html
Copyright © 2011-2022 走看看