在设计期放上一个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. Introduction to REST #Reprinted#

    from http://www.cnblogs.com/shanyou/archive/2012/05/12/2496959.html dudu的 HttpClient + ASP.NET Web A ...

  2. C语言之辗转相除法

    最大公约数和最小公倍数 从键盘输入两个正整数,求出其最大公约数和最小公倍数.代码如下: #include<stdio.h>int ss(int);int main(void){ int a ...

  3. 让我们共同构筑物联网起飞的平台:物联网操作系统Hello China寻求应用合作伙伴

    经过几天的努力,终于把Hello China V1.76版的内核移植到基于Cortex-M3内核的STM32 chipset上.因为还希望进一步写一个USART驱动程序,因此详细的移植文档,预计一周之 ...

  4. ARPU_百度百科

    ARPU_百度百科 ARPU

  5. hdu 4679 (树形DP)

    题意:给一棵树,边的权值都是1,摧毁每条边是有代价的,选择摧毁一条边,把一棵树分成两部分,求出两部分中距离最大的两点的距离,求出距离*代价最小的边,多条的话输出序号最小的. 刚开始理解错题意了,wro ...

  6. (step5.1.3)hdu 1213( How Many Tables——1213)

    题目大意:输入两个整数n,m.分别表示点数.对点的操作的次数.在接下来的m行中,每行有两个整数a,b.表示a和b是好朋友.(不是好朋友的不能坐在同一个桌子上) .求需要多少张桌子 解题思路:并查集 1 ...

  7. Android 使用动态载入框架DL进行插件化开发

    如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456    (来自时之沙的csdn博客) 概述: 随着应用的不断迭代.应用的体积不断增大,项目越来越臃肿,冗余添 ...

  8. STL之优先级队列priority_queue

    摘要: priority_queue,自适应容器(即容器适配器):不能由list来组建: 最大值优先级队列(最大值始终在对首,push进去时候) 最小值优先级队列: 优先级队列适配器 STL  pri ...

  9. ThinkPHP - 常用的配置项

    <?php return array( // 设置禁止访问的模块列表 // 'MODULE_DENY_LIST' => array('Common','Runtime','Api'), / ...

  10. C#_会员管理系统:开发三(修改密码)

    为以后多个功能界面考虑,新增一个主界面: 主界面如下: 主界面(VIPMain.cs)详细代码如下: using System; using System.Collections.Generic; u ...