《Mastering Delphi 6》学习笔记之九

原创 2001年12月04日 09:49:00
无名称构件的使用

 

我曾在许多Delphi资料中看到这样的说法:每一个Component都必须有一个不为空的Name,用于和其他Component相区分。过去我也对这种说法深信不疑。但是看过《Mastering Delphi 6》后,我知道我错了。Component的Name属性可以是空的,特别是对于Menu Separator,Static Label,Bevel,Shape和Panel等等。虽然IDE会给所有的构件起一个默认的名称,不过你可以在Object Inspector中把它的Name清空,这样的后果是:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1.构件在Object Inspector和Object TreeView中将变成Unnamed或者Component<0>这样的表示方法;

2.该构件的声明将从Form的声明中完全删除;

3.如果用View As Text看看.DFM文件的定义,发现无名称的Component对象定义为这样的形式:

object : TMenuItem

  caption = ‘-’

end

而一般的声明为:

object File1: TMenuItem

  caption = ‘File’

end

这个特点的真正好处在于,可以让Form的声明简洁许多,再也不会充斥大量无用的N1,N2之类标识符,从而混淆你的视线。当然,可执行文件的大小也会稍有减少。

不过,假如将Form上面所有Label的Name都设为空,那么运行该程序将产生一个错误,因为编译器看到声明中没有Label,所以不会将TLabel的有关TLabel的库函数连接进来。(编译器在绝大多数时候都很聪明,不过这个时候只能说它是自作聪明。)解决办法是至少保留一个有名字的Label。

我们甚至可以手动将Form中某个Component的声明删除。不用担心,在Form建立起来的时候这个Component不会消失,只是不能够用通常的办法来引用它了。真的有需要的时候,可以用Form1.FindComponent(‘Button1’)这样的方法找到特定的构件。如果Form中的构件实在太多,可以用这个技巧来删除一部分不太重要的声明,保持单元的简洁。

其实,要减少Label声明的数量,用Delphi 6中新增的LabledEdit是一个行之有效的办法,而且LabeledEdit可以简化窗体的布局管理。不过,LabeledEdit只对Edit有效。要减少其他不需要响应事件和处理输入的构件(如Menu Separator,Panel和Bevel等等)的声明,就只能用这种方法。

 

 

 

不同于一般的procedure或者function,在Delphi中属于某个类的方法称为method,它们的声明一般为

AProcMethod:procedure(Sender:TObject) of object;

为什么一定要加上of object呢?实际上,Object Pascal中一般的函数指针就相当于普通的指针,而AProcMethod则是一个对指针,它在Delphi中有一个对应的类型:TMethod。

TMethod=record

  Data, Code:Pointer;

end;

所以,我们在单元中可以这样:

procedure TForm1.Button1Click2(Sender:TObject);

begin

  ShowMessage(‘Click2!’);

end;

 

procedure TForm1.FormCreate(Sender:TObject);

var

  Method:TMethod;

begin

  Method.Data := Self;

  Method.Code := MethodAddress(‘Button1Click2’);

  Button1.OnClick := TNotifyEvent(Method);

end;

当然,实际上只需要Button1.OnClick=Button1Click2即可;不过,这样可以让你明白在幕后发生的事情。值得注意的一点是,Button1Click2应该声明在published段(或者和其他构件的声明放在一起,因为默认作用域就是published),以便编译器为它产生RTTI信息,否则程序可能达不到预期的效果。

 

 

【机器学习-斯坦福】学习笔记6 - 朴素贝叶斯

本次课程大纲: 1、 朴素贝叶斯 - 朴素贝叶斯事件模型 2、 神经网络(简要) 3、 支撑向量机(SVM)铺垫 – 最大间隔分类器...
  • maverick1990
  • maverick1990
  • 2013年11月14日 12:41
  • 4764

Delphi中Chrome Chromium、Cef3学习笔记(二)

用Tchromium替换webbrowser   用惯了EmbeddedWB,不想换,但是IE内核一直存在内存泄漏问题,没办法,只有寻找替代品了。   要把用习惯的EmbeddedWB换成完全...
  • xtfnpgy
  • xtfnpgy
  • 2015年06月25日 14:09
  • 2777

AppleScript学习笔记(六)处理程序Handler

进入AS4AS书中的最后一章了,本章说的内容类似于OC中的方法和其调用。本文的内容:(1)定义和调用Handler (2)load script...
  • u010962810
  • u010962810
  • 2014年03月01日 10:55
  • 2999

理解windows消息机制-delphi消息机制学习笔记。

一、什么是消息? 消息是windows对应用程序发送的有关‘发生了某种事件’的通知。例如点击鼠标,调整窗口大小或键盘上按下一个键,都会引起windows发送一条消息到应用程序中去,去通知应用程序...
  • chinajobs
  • chinajobs
  • 2016年06月23日 16:39
  • 453

CAN总线学习笔记四:CAN总线通信

CAN总线学习笔记四:CAN总线通信     在理解了CAN总线的自通信程序后,再来探讨CAN总线间的相互通信变得容易了许多。对于是自通信还是相互通信,这个肯定是需要对寄存器进行必要的设置的,分析P...
  • delphi308
  • delphi308
  • 2013年03月08日 21:41
  • 2067

小四轴9轴数据融合成功

前两天二代硬件终于到齐了,室友风风火火焊出来两架新硬件,没想到电路板上产生的磁场比地磁场还强,导致磁力计数据变化不明显,害得我们以为是焊接问题(毕竟DataSheet说不推荐手工焊接且温度不能超过26...
  • u010097644
  • u010097644
  • 2017年04月28日 00:38
  • 952

Delphi的学习笔记九——汉字与区位码

在没有 Uncode 的时代, 用 256 个 ACSII 只是方便了英文, 其他文字怎么办? 那时是各自为政的, 譬如中文就有: GB2312-80(国内简体)、Big5(台湾繁体)、HKSC...
  • my98800
  • my98800
  • 2016年05月26日 10:53
  • 136

Delphi中Chrome Chromium、Cef3学习笔记(一)

官方下载地址:https://cefbuilds.com/ CEF简介:     嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在20...
  • xtfnpgy
  • xtfnpgy
  • 2015年06月25日 13:25
  • 4874

Delphi的学习笔记九——汉字与区位码

在没有 Uncode 的时代, 用 256 个 ACSII 只是方便了英文, 其他文字怎么办? 那时是各自为政的, 譬如中文就有: GB2312-80(国内简体)、Big5(台湾繁体)、HKSC...
  • lygcalm
  • lygcalm
  • 2013年01月10日 18:05
  • 230

《机器学习》--周志华 (第六章学习笔记)

支持向量机间隔与支持向量​ 在样本空间中寻找一个超平面,将不同类别的样本分开​ “正中间”的:鲁棒性最好,泛化能力最强​ ​ 对偶问题 拉格朗日乘子法第...
  • Cristal_yin
  • Cristal_yin
  • 2017年07月30日 08:31
  • 405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《Mastering Delphi 6》学习笔记之九
举报原因:
原因补充:

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