在设计期放上一个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=) then
ShowMessage('no handle')
else
ShowMessage('handled');
end;

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

procedure TWinControl.HandleNeeded;
begin
if FHandle = 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:=;
panel1.top:=;
if (panel1.FHandle=) then
ShowMessage('no handle')
else
ShowMessage('handled');
end;

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

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

procedure TForm1.Button1Click(Sender: TObject);
begin
if (panel1.FHandle=) 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:=;
panel1.top:=;
if (panel1.Handle=) then
ShowMessage('no handle')
else
ShowMessage('handled');
end;

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

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

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

先有Delphi内存对象,后有句柄(如果需要的话),最后再显示的更多相关文章

  1. delphi 内存映射

    使用内存映射文件读写大文件 使用内存映射文件读写大文件 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类.一般来说,这些函数可以满足大多数场合的要求,但是 ...

  2. 多线程的基本概念和Delphi线程对象Tthread介绍

    多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru    WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行 ...

  3. windows核心编程---第三章 内核对象及句柄本质

      本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一块内存 ...

  4. 关于Delphi内存表的使用说明

    关于Delphi内存表的使用说明: 1.建立临时表  数据输入是开发数据库程序的必然环节.在Client/Server结构中,客户端可能要输入一批数据后,再向服务器的后台数据库提交,这就需要在本地(客 ...

  5. C++——内存对象 禁止产生堆对象 禁止产生栈对象

    用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内 ...

  6. Windows对象、句柄与MFC对象

    windowsmfc编程c 目录(?)[-] Windows对象句柄与MFC对象 windows对象 句柄 mfc对象 杂谈 Windows对象.句柄与MFC对象 (2009-04-28 22:11: ...

  7. 《windows核心编程系列》三谈谈内核对象及句柄的本质

    内核对象 本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一 ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (24) ------ 第五章 加载实体和导航属性之查询内存对象

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-4  查询内存对象 问题 你想使用模型中的实体对象,如果他们已经加载到上下文中, ...

  9. powershell中使用超大内存对象

    powershell中使用超大内存对象 简单介绍了powershell中超大内存对象的用途,开启powershell超大内存对象的办法. powershell 传教士 原创文章 2016-12-31 ...

随机推荐

  1. ubuntu下vpn无反应的解决办法

    mv ~/.gconf  ~/.gcongbk0 sudo reboot

  2. 部署一个class文件

    只发布一个class文件找到项目工作空间/target/class..根据项目结构找到修改的java文件编译的class文件比如RegexUtils.class使用SecureFXPortable将文 ...

  3. BZOJ 1610: [Usaco2008 Feb]Line连线游戏

    1610: [Usaco2008 Feb]Line连线游戏 Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 &l ...

  4. linux grep详解

    Table of Contents 1. grep简介 2. grep正则表达式元字符集(基本集) 3. 用于egrep和 grep -E的元字符扩展集 4. POSIX字符类 5. Grep命令选项 ...

  5. 设计模式(一)工厂模式Factory(创建型)

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...

  6. Oracle执行计划——处理一种并行hint不生效的情况

    刚刚在itpub上看到有人在问并行hint不生效的一个问题.我做了实验也出现一样的问题,如下: 原因在这是小表,在联合时走索引了,加上full的hint,就可以启动并行的执行计划. 当然也可以采用pa ...

  7. 代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]

    函数代码://demo.c #include<stdio.h> #include<stdlib.h> , global2 = , global3 = ; void functi ...

  8. postgresql文档生成注意事项

    如果要生成中文版的postgresql,目前我所知道的方法见我的一篇博客http://www.cnblogs.com/codeblock/p/4812445.html 里面有详细的介绍,但是生成的文档 ...

  9. BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )

    做一次MST, 枚举不在最小生成树上的每一条边(u,v), 然后加上这条边, 删掉(u,v)上的最大边(或严格次大边), 更新答案. 树链剖分然后ST维护最大值和严格次大值..倍增也是可以的... - ...

  10. javascript面向对象——tabs实例

    面向过程—>面向对象 之前在未学习面向对象时,我们都是面向过程编程的.它的优点就是简单,明了,下面就来把面向过程的tabs切换改写成面向对象的方式. html: <div class=&q ...