《Mastering Delphi 6》学习笔记之七

原创 2001年11月25日 00:51:00

《Mastering Delphi 6》 学习笔记之七

 

TObject中的ClassParent是一个很让人感兴趣的方法。通过这个方法,你可以从某个类开始,层层上溯,一直到整个VCL的根TObject为止,描述出一个完整的层次列表。可以用下面的例子来检查类继承关系:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

procedure TForm1.Button1Click(Sender: TObject);

var

  CurrObject : TObject;

  CurrClass : TClass;

begin

  CurrObject := Sender;

  while CurrObject<>nil do begin

    Memo1.Lines.Add( 'Class name is ' + CurrObject.ClassName );

    Memo1.Lines.Add( 'Instance Size is ' + IntToStr(CurrObject.InstanceSize) );

    Memo1.Lines.Add( '' );

    CurrClass := CurrObject.ClassParent;

    if CurrClass<>nil then

       CurrObject := CurrClass.NewInstance

    Else

       CurrObject := nil;

  end;

end;

注意上面的代码实际上是有问题的---用了NewInstance而没有释放。不过作为示例就不必再复杂化了,了解用法即可。

 

上面例子的输出:

ClassName is TButton

Instance Size is 536

 

Class name is TButtonControl

Instance Size is 524

 

Class name is TWinControl

Instance Size is 516

 

Class name is TControl

Instance Size is 348

 

Class name is TComponent

Instance Size is 48

 

Class name is TPersistent

Instance Size is 4

 

Class name is TObject

Instance Size is 4

可以看到,TObject和TPersistent都是不包含任何成员变量的(4个字节用于VTbl)。同时可以看到,TControl和TWinControl都是相当大的类,其中一定增加了不少成员变量。而一个TButton占用的内存多达536个字节,也就是说,2个按钮就要超过1K,这多少让人有点吃惊。(如果你想用SizeOf的话,不会得到正确的结果:所有的对象用Sizeof得到的结果都是4,这说明所谓的对象其实都是指针而已。)看来虽说现在内存越来越大,但是一个窗体上的构件还是不要太多的为好。

 

由于TButton占用的内存之大出乎意外,所以我又作了个程序,把常用的几十种构件都放了进去,看看占用的内存大小如何。代码很简单:

procedure TForm1.FormCreate(Sender: TObject);

var

  i : integer;

  Item : TListItem;

  Size : integer;

begin

  for i:=0 to ComponentCount-1 do begin

    Item := ListView1.Items.Add;

    Item.Caption := Components[i].ClassName;

    Size := Components[i].InstanceSize;

    Item.SubItems.Add( IntToStr(Size) );

  end;

end;

从结果来看,大致可以得出如下的结论:

1.非窗口构件(如TShape,TBevel)的InstanceSize大多在300多个字节;

2.基本的窗口化构件(如TButton,TEdit,TListBox)的InstanceSize大多在500到600多个字节,属于Common Control的占用量还要更多一些;

3.各种各样的网格构件(TStringGrid,TDrawGrid)占用空间都比较大(700多个字节),TDBGrid甚至达到了800个字节。

4.各种和数据库相关的构件都比较大,一般在700多到900字节不等,只有TDataSource出乎意料的小—88个字节。

5.包括上面说到的TDataSource在内,还有几个构件也非常之小,它们是TMainMenu, TActionList,TCustomizeDlg,TTimer和TDataSource,只有80-90多个字节,而其他构件最少也有300多个字节。我没有找到哪个构件的大小在100-300字节这个区间。

6.在我测试到所有构件中,其InstanceSize最大的是TChart,达到了1024个字节。

7.新增的ShellListView和ShellTreeView也是消耗内存的大户,ShellTreeView消耗的字节数达到968字节,仅次于TChart而位居亚军。

不知道你看了这个结果有何感想,我想Delphi之所以这么消耗内存和启动速度比较慢大概也是因为这个原因吧,总之构件虽好,也不可以滥用就是了。

 

台湾大学林轩田机器学习基石课程学习笔记7 -- The VC Dimension

前几节课着重介绍了机器能够学习的条件并做了详细的推导和解释。机器能够学习必须满足两个条件: 假设空间H的Size M是有限的,即当N足够大的时候,那么对于假设空间中任意一个假设g,Eout≈EinE_...
  • red_stone1
  • red_stone1
  • 2017年05月05日 09:38
  • 2456

七月算法机器学习笔记1--机器学习中的数学之数理统计和参数估计

数理统计和参数估计 首先,看一下概率与统计的关注点 概率论问问题的方式: 已知总体的可能性,求某种事件发生的概率,如图所示:...
  • thystar
  • thystar
  • 2016年04月25日 18:06
  • 1541

windows下《七天学会NodeJS》学习笔记之一--NodeJS基础

什么是NodeJS。浏览器可以解析JS,NodeJS也可以解析JS,它就是一个JS的解析器。浏览器利用JS操作DOM,而NodeJS利用JS操作磁盘文件或搭建HTTP服务器。NodeJS的作者创造No...
  • fm2005
  • fm2005
  • 2014年11月21日 14:44
  • 7709

Mastering Opencv学习笔记(1)——图片卡通化

一.简介 可以通过opencv将图片进行卡通化处理,基本的思路是将图片的内容部分进行平滑处理,然后让边缘部分更加突出。首先,通过边缘检测滤波器获得图像的黑白素描图,然后通过双边滤波器获得平滑...
  • qq_20668795
  • qq_20668795
  • 2016年08月25日 08:28
  • 232

《mastering-javascripts-this》学习笔记

Javascript中this关键字的作用范围详解day01函数中直接出现的this,指代global或者windowfunction doStuff(){ console.log(this) ...
  • hardone
  • hardone
  • 2016年02月01日 23:53
  • 146

delphi 学习笔记

  • 2015年04月14日 16:02
  • 982B
  • 下载

delphi学习笔记

  • 2013年02月13日 22:16
  • 7.36MB
  • 下载

Delphi 学习笔记

  • 2011年11月16日 18:50
  • 77KB
  • 下载

Delphi+SQL Server研究学习笔记

  • 2015年05月22日 22:49
  • 49KB
  • 下载

Delphi 网友学习笔记

  • 2007年11月26日 13:40
  • 47KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《Mastering Delphi 6》学习笔记之七
举报原因:
原因补充:

(最多只允许输入30个字)