📄 compfaq.html
字号:
<UL>
<P><FONT COLOR="#000000">每当目前记录变更时会呼叫此方法。Distance 参数代表缓冲区欲卷动的行数。
(其值范围皆在 -1 .. 1 之间)。使用 ActiveRecord 属性可以取得缓冲区中目前所指向的记录。我们无法强制让
DataLink 的缓冲区卷动。</FONT></P>
</UL>
<P><FONT COLOR="#000000">procedure FocusControl(Field: TFieldRef)</FONT></P>
<UL>
<P><FONT COLOR="#000000">与TField.FocusControl方法相同。</FONT></P>
</UL>
<P><FONT COLOR="#000000">procedure EditingChanged</FONT></P>
<UL>
<P><FONT COLOR="#000000">当 DataLink 的编辑状态改变时会呼叫此方法。使用
Editing 属性可以得知DataLink 是否 正处於编辑状态。</FONT></P>
</UL>
<P><FONT COLOR="#000000">procedure LayoutChanged</FONT></P>
<UL>
<P><FONT COLOR="#000000">当 DataSet 的 Layout 改变时会呼叫此方法(例如新增一个column)。</FONT></P>
</UL>
<P><FONT COLOR="#000000">procedure RecordChanged(Field: TField)</FONT></P>
<UL>
<P><FONT COLOR="#000000">当下列任一事件发生时都会呼叫此方法:</FONT></P>
<UL>
<LI><FONT COLOR="#000000">目前记录进入编辑状态</FONT></LI>
<LI><FONT COLOR="#000000">目前记录内容更动</FONT></LI>
</UL>
</UL>
<P><FONT COLOR="#000000">procedure UpdateData</FONT></P>
<UL>
<P><FONT COLOR="#000000">在一笔记录被更新以前会呼叫此方法。你可以呼叫 Abort
程序来防止资料库更新。</FONT></P>
</UL>
</UL>
</UL>
<P><A NAME="4_2"></A><B><FONT COLOR="#000000">4.2 如何得知一个 dataset
中有几笔记录?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">TDateSet 的 RecNo 属性可以传回资料记录的数目,但很不幸地它只适用於
dBase 及 Paradox 的资料表格。若想得知目前资料记录的编号,可以从 TDataLink
类别衍生一个新的类别,然後进行下 列步骤:</FONT></P>
<UL>
<LI><FONT COLOR="#000000">改写 DataSetScrolled 方法以取得目前记录是否被卷动。</FONT></LI>
<LI><FONT COLOR="#000000">改写 DataSetChanged 方法来确认目前记录是否跳至最前面或最後面了。</FONT></LI>
</UL>
<P><FONT COLOR="#000000">接著你可以将这个新类别的物件连结到TDataSource物件上然後就可以随时得知目前的
记录编号了。 </FONT></P>
</UL>
</UL>
<P>
<HR WIDTH="100%"></P>
<H3><I><FONT COLOR="#0000FF">第五部分 VCL </FONT></I></H3>
<UL>
<P><A NAME="5_1"></A><B><FONT COLOR="#000000">5.1 使用""合环境除错时如何追踪检视
VCL元件的程式码? </FONT></B></P>
<UL>
<P><FONT COLOR="#000000">将你想要追踪的 VCL 原始程式单元拷贝至存放专案的目录中并重新编译元件库,此後你就可以在那些
VCL单元中追踪检视程式码了。</FONT></P>
</UL>
<P><A NAME="5_2"></A><B><FONT COLOR="#000000">5.2 我的元件参考到其它元件,如何得到参考元件被消灭的讯息?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">Max Nilson 的回答:</FONT></P>
<P><FONT COLOR="#000000">TComponent 类别提供了 Notification 方法。当一个元件被移除时我们可以利用这个方
法得到消息以进行适当的反应。你可以参考『Component Writer's Guide』内有关
Notification 及FreeNotification 这两个方法的说明。</FONT></P>
<P><FONT COLOR="#000000">当你的元件参考到另一个元件,例如,你的元件中有一个
TDataSource 型态的属性。那 你必须改写此元件的 Notification 方法,在其中检查被移除的元件是否就是本身所参
考的元件。预设情况下,当元件被移除时,所有其它在同一个表格上的元件才会收到
消息,如果参考元件位於另一个表格上时,你的元件无法得知这件事情。Delphi
2.0 推出了TDataModule,参考元件位於另一个表格上的机会大幅增加,所以你应该利用
FreeNotification 方法来确定当参考元件移除时,你一定可以得到消息。</FONT></P>
<P><FONT COLOR="#000000">如果你不改写 Notification 方法来处理参考元件被移除的讯息,这会让
Delphi""合环境陷入十分不稳定的状态。它可能不会立刻当掉,但你也不能再正常地继续其它工作
了。</FONT></P>
<P><FONT COLOR="#000000">下面是一个范例,当你的元件参考其它元件时,千万记得要做以下的处理:
</FONT></P>
<P><FONT COLOR="#000000">TMyComponent = </FONT><B><FONT COLOR="#004080">class</FONT></B><FONT COLOR="#000000">
(TComponent) </FONT></P>
<P><B><FONT COLOR="#004080">private</FONT></B><FONT COLOR="#000000"> </FONT></P>
<UL>
<P><FONT COLOR="#000000">FDataSource: TDataSource; </FONT></P>
<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
SetDataSource(Value: TDataSource); </FONT></P>
</UL>
<P><B><FONT COLOR="#004080">protected</FONT></B></P>
<UL>
<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
Notification(AComponent: TComponent; Operation: TOperation); </FONT><B><FONT COLOR="#004080">override</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>
<P><B><FONT COLOR="#004080">published</FONT></B></P>
<UL>
<P><B><FONT COLOR="#004080">property</FONT></B><FONT COLOR="#000000"> DataSource:
TDataSource </FONT><B><FONT COLOR="#004080">read</FONT></B><FONT COLOR="#000000">
FDataSource </FONT><B><FONT COLOR="#004080">write</FONT></B><FONT COLOR="#000000">
SetDataSource; </FONT></P>
</UL>
<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
TMyComponent.SetDataSource(Value: TDataSource);</FONT></P>
<P><B><FONT COLOR="#004080">begin</FONT></B></P>
<UL>
<P><B><FONT COLOR="#004080">if</FONT></B><FONT COLOR="#000000"> Value <>
FDataSource </FONT><B><FONT COLOR="#004080">then</FONT></B><FONT COLOR="#000000">
</FONT></P>
<P><B><FONT COLOR="#004080">begin</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">FDataSource := Value;</FONT></P>
<P><FONT COLOR="#008040">// 告诉参考元件说,当它被移除时记得通知我一声。</FONT></P>
<P><FONT COLOR="#000000">if FDataSource <> nil then FDataSource.FreeNotification(Self)
</FONT></P>
</UL>
<P><B><FONT COLOR="#004080">end;</FONT></B></P>
</UL>
<P><B><FONT COLOR="#004080">end;</FONT></B></P>
<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
TMyComponent.Notification(AComponent: TComponent; Operation:TOperation);</FONT></P>
<P><B><FONT COLOR="#004080">begin</FONT></B><FONT COLOR="#000000"> </FONT></P>
<UL>
<P><B><FONT COLOR="#004080">inherited</FONT></B><FONT COLOR="#000000">
Notification(AComponent, Operation);</FONT></P>
<P><FONT COLOR="#008040">// 如果被移除的正是参考元件,把FDataSource栏位清除。</FONT></P>
<P><B><FONT COLOR="#004080">if</FONT></B><FONT COLOR="#000000"> (Operation
= opRemove) </FONT><B><FONT COLOR="#004080">and</FONT></B><FONT COLOR="#000000">
(AComponent = FDataSource) </FONT><B><FONT COLOR="#004080">then</FONT></B><FONT COLOR="#000000">
</FONT></P>
<UL>
<P><FONT COLOR="#000000">FDataSource := </FONT><B><FONT COLOR="#004080">nil</FONT></B><FONT COLOR="#000000">
</FONT></P>
</UL>
</UL>
<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>
<P><A NAME="5_3"></A><B><FONT COLOR="#000000">5.3 什麽是元件讯息?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">元件讯息是什麽?它十分类似Windows的视窗讯息,只有一点不同:元件讯息只适用於
VCL 元件;而视窗讯息可以用在系统内所有具有 window handle 的控制项或视窗。如果
你有一个具有 Font 属性的元件(例如TLabel元件),当我们更改它的 Font 属性时并没
有送出视窗讯息(译注:TLabel 元件不是视窗控制项,根本也没有视窗 Handle可以让
我们传送视窗讯息),但是控制项仍然知道字型改变了所以要重画自己,为什麽?因
为我们有元件讯息。</FONT></P>
<P><FONT COLOR="#000000">元件讯息不可以由虚拟方法来处理,这可能是设计 VCL
时的考量,大概是因为不想让虚 拟方法表格(Virtual Method Table)过於庞大的原因。</FONT></P>
<P><FONT COLOR="#000000">『Secrets of Delphi 2.0』这本书对於所有的元件讯息有十分详尽的解说。</FONT></P>
<P><FONT COLOR="#000000">接下来我们列出一些比较常见的元件讯息及它们的作用。
标示著『Notification Only』 的讯息表示送出这个讯息只是为了通知元件某件消息而己,并不传入任何参数而且也
不需要传回值。</FONT></P>
<P><FONT COLOR="#000000">CM_ACTIVATE (Notification Only)</FONT></P>
<UL>
<P><FONT COLOR="#000000">当表格成为焦点视窗时会传给本身这个讯息。</FONT></P>
</UL>
<P><FONT COLOR="#000000">CM_CTL3DCHANGED (Notification Only)</FONT></P>
<UL>
<P><FONT COLOR="#000000">当控制项的Ctl3D属性更改时会传给本身这个讯息。</FONT></P>
</UL>
<P><FONT COLOR="#000000">CM_DESIGNHITTEST 参数:TCMDesignHitTest 传回值:0或1
</FONT></P>
<UL>
<P><FONT COLOR="#000000">在设计时期当滑鼠移到元件上头时,""合环境会送给此元件这个讯息。此讯息的目的
用来决定元件在设计时期是否要处理滑鼠讯息。如果传回值是 1,""合环境就让元件
自行处理滑鼠讯息;若传回值是 0,则""合环境会帮你处理滑鼠讯息。如果传回值永
远是 1,那麽元件的快速功能选单则永远不会出现;如果元件不处理这个讯息或永远
传回 0,那此元件在设计时期将无法对滑鼠讯息做任何反应。</FONT></P>
</UL>
<P><FONT COLOR="#000000">CM_FONTCHANGED (Notification Only) </FONT></P>
<UL>
<P><FONT COLOR="#000000">控制项的字型改变後送给本身此讯息。</FONT></P>
</UL>
<P><FONT COLOR="#000000">CM_FONTCHANGE (Notification Only) </FONT></P>
<UL>
<P><FONT COLOR="#000000">当控制项收到WM_FONTCHANGE视窗讯息时会送给本身这个讯息。</FONT></P>
</UL>
<P><FONT COLOR="#000000">CM_PARENTCTL3DCHANGED (Notification Only) </FONT></P>
<UL>
<P><FONT COLOR="#000000">当元件父控制项的Ctl3D属性改变或设定新的父控制项时会收到此讯息。</FONT></P>
</UL>
<P><FONT COLOR="#000000">CM_PARENTCOLORCHANGED (Notification Only) </FONT></P>
<UL>
<P><FONT COLOR="#000000">当元件父控制项的 Color 属性改变或设定新的父控制项时会收到此讯息。</FONT></P>
</UL>
<P><FONT COLOR="#000000">CM_PARENTFONTCHANGED (Notification Only)</FONT></P>
<UL>
<P><FONT COLOR="#000000">当元件父控制项的Font属性改变或设定新的父控制项时会收到此讯息。</FONT></P>
</UL>
<P><FONT COLOR="#000000">CM_PARENTSHOWHINTCHANGED (Notification Only) </FONT></P>
<UL>
<P><FONT COLOR="#000000">当元件父控制项的ShowHint属性改变或设定新的父控制项时会收到此讯息。</FONT></P>
</UL>
<P><FONT COLOR="#000000">CM_WININICHANGE 参数:TWMWinIniChange 传回值:无
</FONT></P>
<UL>
<P><FONT COLOR="#000000">当控制项收到WM_WININICHANGE视窗讯息时会送给本身这个讯息。</FONT></P>
</UL>
</UL>
<P><A NAME="5_4"></A><B><FONT COLOR="#000000">5.4 我的元件得到输入焦点後仍不能接受键盘讯息,为什麽?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">如果你的元件有 DragMode 属性而且将它设成 dmAutomatic
时,很有可能让你的元件以为它正被拖曳但实际上并没有的情况。在 Controls 单元中有一个区域变数
DragControl 指 向目前正被拖曳的元件。你遇到的情况很可能就是明明没有拖曳的动作但是DragControl
变数却指向你的元件。在 TWinControl 的 WndProc 方法中,当 DragControl 变数指向元件
本身时,会忽略所有键盘讯息,这就是原因了!</FONT></P>
</UL>
</UL>
<P>
<HR WIDTH="100%"></P>
<H3><I><FONT COLOR="#0000FF">第六部分 其它资讯</FONT></I></H3>
<UL>
<P><A NAME="6_1"></A><B><FONT COLOR="#000000">6.1 有哪些书介绍或讲解如何撰写元件?
</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">有关撰写元件的『标准』参考书籍:</FONT></P>
<P><FONT COLOR="#000000">『Developing Delphi Components』 作者:Ray Konopka
出版:Coriolis Group</FONT></P>
<UL>
<P><FONT COLOR="#000000">下面这本书并不专注於元件写作,但里面提到许多元件撰写者不可不知的资讯:</FONT></P>
</UL>
<P><FONT COLOR="#000000">『Secrets of Delphi 2』 作者:Ray Lischner 出版:Waite
Group</FONT></P>
<UL>
<P><FONT COLOR="#000000">另外一本元件撰写的好书,它有许多在『Developing
Delphi Components』里找不到的资讯:</FONT></P>
</UL>
<P><FONT COLOR="#000000">『Programming Delphi Custom Components』 作者:Fred
Bulback 出版:M&T Books</FONT></P>
</UL>
<P><A NAME="6_2"></A><B><FONT COLOR="#000000">6.2 有哪些Web站台可以取得撰写元件的资讯?
</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">全世界最大的 Delphi Web 站台『<A HREF="http://sunsite.icm.edu.pl/delphi/">Delphi
SuperPage</A>』 </FONT></P>
<P><FONT COLOR="#000000">(译注:亚洲地区使用者可以就近到位於日本的 <A HREF="http://ring.asahi-net.or.jp/archives/pc/delphi/">Mirror
Site</A> )</FONT></P>
<P><FONT COLOR="#000000">我在下面这些站台中找到许多元件的原始程式码:</FONT></P>
<UL>
<LI><FONT COLOR="#000000"><A HREF="http://www.coast.net/~jkeller">Temple
of Delphi</A> </FONT></LI>
<LI><FONT COLOR="#000000"><A HREF="http://www.pobox.com/~bstowers/delphi">Delphi
Free Stuff</A> </FONT></LI>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -