📄 compfaq.html
字号:
<LI><FONT COLOR="#000000">(译注:『<A HREF="http://www.delphi32.com/">Your
Delphi Programming Resource</A>』""理元件也十分用心! )</FONT></LI>
<LI><FONT COLOR="#000000">(译注:台湾地区目前维持最好的 Delphi 站台是『<A HREF="http://www.aaa.hinet.net/delphi">32
Bit Delphi 深度历险</A>』及其 <A HREF="http://ibmsrv.cc.nthu.edu.tw/DELPHI">Mirror
Site</A>) </FONT></LI>
</UL>
<P><FONT COLOR="#000000">你也可以使用一些搜寻引擎来寻找有关 Delphi 的站台:</FONT></P>
<UL>
<LI><FONT COLOR="#000000"><A HREF="http://www.yahoo.com/">Yahoo</A></FONT></LI>
<LI><FONT COLOR="#000000"><A HREF="http://www.altavista.digital.com/">Alta
Vista</A></FONT></LI>
<LI><FONT COLOR="#000000">(译注:<A HREF="http://www.excite.com/">Excite</A>
搜寻引擎也别错过罗!)</FONT></LI>
</UL>
</UL>
</UL>
<P>
<HR WIDTH="100%"></P>
<H3><B><I><FONT COLOR="#0000FF">第七部分 元件的储存与载入</FONT></I></B></H3>
<UL>
<P><A NAME="7_1"></A><B><FONT COLOR="#000000">7.1 如何将包含其它物件的物件一起存入
DFM 档?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">我试过许多方法,包括改写元件的 DefineProperties及
WriteComponents方法,但都还是失败了。所以我只能说要解决这个问题的话只有使用
Delphi 原本的方法一途。</FONT></P>
<P><FONT COLOR="#000000">将包含其它物件的物件一起储存起来的步骤大致如下:</FONT></P>
<OL>
<LI><FONT COLOR="#000000">确定你要储存的所有物件都是从 TComponent 类别衍生下来的。
</FONT></LI>
<LI><FONT COLOR="#000000">将所有需要储存的变数宣告在 published 区段。</FONT></LI>
<LI><FONT COLOR="#000000">在元件的 Register 程序中呼叫 RegisterComponents程序来注册所有你要储存起来的类别。</FONT></LI>
<LI><FONT COLOR="#000000">每个拥有子控制项的类别必须改写 GetChildren 方法以储存每个子控制项。(在
Delphi 1.0 中你必须改写 WriteComponents 方法并且为每个子控制项呼叫 WriteComponent方法)。</FONT></LI>
</OL>
<P><FONT COLOR="#000000">将物件载入的方法用了点小技巧。你必须改写元件的
GetChildOwner 及 GetChildParent 方法,否则 Delphi会将所有物件的拥有者都设定为元件所在的表格。(在Delphi
1.0 中你必须改写ReadState方法)。</FONT></P>
</UL>
<P><A NAME="7_2"></A><B><FONT COLOR="#000000">7.2 如何得知元件是否正从资料流中读出?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">当元件正从资料流中读出时,它的 ComponentState
属性会包含csLoading 旗帜。</FONT></P>
<P><B><FONT COLOR="#004080">constructor</FONT></B><FONT COLOR="#000000">
TMyClass.Create(AOwner: TComponent); </FONT></P>
<P><B><FONT COLOR="#004080">begin</FONT></B></P>
<UL>
<P><B><FONT COLOR="#004080">if</FONT></B><FONT COLOR="#000000"> csLoading
</FONT><B><FONT COLOR="#004080">in</FONT></B><FONT COLOR="#000000"> AOwner.ComponentState
</FONT><B><FONT COLOR="#004080">then</FONT></B><FONT COLOR="#000000"> </FONT></P>
<P><B><FONT COLOR="#004080">begin</FONT></B><FONT COLOR="#000000"> ...
</FONT><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000"> </FONT></P>
<P><B><FONT COLOR="#004080">else</FONT></B><FONT COLOR="#000000"> </FONT></P>
<P><B><FONT COLOR="#004080">begin</FONT></B><FONT COLOR="#000000"> ...
</FONT><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>
<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>
<P><A NAME="7_3"></A><B><FONT COLOR="#000000">7.3 如何确定元件的属性是否被正确地储存?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">有许多很简单的方法可以验证属性是否被正确地储存在档案里:</FONT></P>
<OL>
<LI><FONT COLOR="#000000">在""合环境中用滑鼠右键点选表格然後选择『View
as Text』。然而万一 DFM 档 有任何错误的话,你将什麽也看不到。</FONT></LI>
<LI><FONT COLOR="#000000">开个 DOS 视窗,利用 Delphi 所附的『Convert』程式将
DFM 档转成文字格式。</FONT></LI>
</OL>
<P><FONT COLOR="#000000">Stefan Hoffmeister 指出复制或剪下元件後,到任何一个文书编辑器(如记事本)中
贴上,你就可以看到此元件的文字表示。你甚至可以编辑这些文字表示後再将它贴回
Delphi""合环境的表格上。</FONT></P>
</UL>
</UL>
<P>
<HR WIDTH="100%"></P>
<H3><I><FONT COLOR="#0000FF">第八部分 Delphi 的工具</FONT></I></H3>
<UL>
<P><A NAME="8_1"></A><B><FONT COLOR="#000000">8.1 有没有Delphi版本的 YACC
及 LEX?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">有。<A HREF="mailto:ag@muwiinfa.geschichte.unimainz.de">Albert
Graef</A> 这位仁兄写了 Turbo Pascal 版本的 YACC 及 LEX,也可以让 Delphi
使用。</FONT></P>
<P><FONT COLOR="#000000">你可以在 <A HREF="ftp://ftp.simtel.net/pub/simtelnet/msdos/turbopas">ftp://ftp.simtel.net/pub/simtelnet/msdos/turbopas</A>
下取得 tply30a1.zip 及 tply30a2.zip 这两个档案,其中还包含这两个工具的原始程式哦!</FONT></P>
</UL>
<P><A NAME="8_2"></A><B><FONT COLOR="#000000">8.2 如何秀出 JPEG 格式图形档?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000"><A HREF="mailto:nomssi@physik.tu-chemnitz.de">Jacques
Nomssi Nzali</A> 将 Independent JPEG Group 所发展的免费 JPEG 程式库改写成
Pascal 版本。你可以从下取得:</FONT></P>
<P><FONT COLOR="#000000"><A HREF="http://ibmsrv.cc.nthu.edu.tw/DELPHI/DELPHI/D32FREE/PASJPG10.ZIP">PASJPG10.ZIP</A></FONT></P>
<P><FONT COLOR="#000000">Independent JPEG Group 的免费 JPEG 函式库 rev
6a 之 Pascal 版本 (1.0 版)。</FONT></P>
</UL>
</UL>
<P>
<HR WIDTH="100%"></P>
<H3><I><FONT COLOR="#0000FF">第九部分 基本程式设计技巧</FONT></I></H3>
<UL>
<P><A NAME="9_1"></A><B><FONT COLOR="#000000">9.1 如何建立不定数目的物件阵列?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">最简单的方法是使用 TList 类别。我发现从 TList
衍生一个新类别很有用处。接下来的程式码示范如何为一个特定型态撰写一个特别的
TList 类别,并且加进基本的错误检查。</FONT></P>
<P><FONT COLOR="#000000">TListOfMyObject = </FONT><B><FONT COLOR="#004080">class</FONT></B><FONT COLOR="#000000">
(TList)</FONT></P>
<P><B><FONT COLOR="#004080">private</FONT></B><FONT COLOR="#000000"> </FONT></P>
<UL>
<P><B><FONT COLOR="#004080">function</FONT></B><FONT COLOR="#000000"> GetItems(Index:
Ordinal): TMyObject;</FONT></P>
</UL>
<P><FONT COLOR="#004080"><B>public</B> </FONT></P>
<UL>
<P><B><FONT COLOR="#004080">property</FONT></B><FONT COLOR="#000000"> Items[Index:
Ordinal]: TMyObject </FONT><B><FONT COLOR="#004080">read</FONT></B><FONT COLOR="#000000">
GetItems;</FONT></P>
<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
Add(AObject: TMyObject); </FONT></P>
</UL>
<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
<P><B><FONT COLOR="#004080">function</FONT></B><FONT COLOR="#000000"> TListOfMyObject.GetItems
(Index: Ordinal): TMyObject;</FONT></P>
<P><B><FONT COLOR="#004080">begin</FONT></B><FONT COLOR="#000000"> </FONT></P>
<UL>
<P><B><FONT COLOR="#004080">if</FONT></B><FONT COLOR="#000000"> Index >=
Count </FONT><B><FONT COLOR="#004080">then</FONT></B></P>
<UL>
<P><B><FONT COLOR="#004080">raise</FONT></B><FONT COLOR="#000000"> Exception.CreateFmt('Index(%d)
outside range 1..%d', [Index, Count-1]); </FONT></P>
</UL>
<P><FONT COLOR="#000000">Result := </FONT><B><FONT COLOR="#004080">inherited</FONT></B><FONT COLOR="#000000">
Items[Index]; </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">
TListOfMyObject.Add (AObject: TmyObject);</FONT></P>
<P><B><FONT COLOR="#004080">begin</FONT></B></P>
<UL>
<P><B><FONT COLOR="#004080">inherited</FONT></B><FONT COLOR="#000000">
Add(AObject);</FONT></P>
</UL>
<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>
<P><A NAME="9_2"></A><B><FONT COLOR="#000000">9.2 Delphi 2.0的 WinCrt单元到哪去了?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">Delphi 2.0并没有 WinCrt单元。 先别伤心,这是因为我们可以用其它方法来取代它。在
Project|Options 的 Linker 页次中将『Generate console application』选项打开,你就可以像以前使用
WinCrt 单元一样地写程式了!</FONT></P>
</UL>
<P><A NAME="9_3"></A><B><FONT COLOR="#000000">9.3 自制元件时该从哪个类别继承?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">VCL 中有一些『自订』类别,而且有许多控制项是直接由这些『自订』类别继承下来
的。例如 TMemo 直接继承自 TCustomMemo类别。这些自订类别写好了所有该控制项所拥
有的功能,只是没有将属性公开出来而己。大部分情形下,你应该从那些自订类别继
承而不是控制项类别。</FONT></P>
<P><FONT COLOR="#000000">如果你要从头撰写自己的元件,那麽从 TCustomControl
类别继承是个不错的主意。撰 写出来的元件会具有 Window Handle 且可以接受输入焦点。</FONT></P>
<P><FONT COLOR="#000000">另外根据你的需要也可以从这些类别继承:</FONT></P>
<UL>
<LI><FONT COLOR="#000000">TGraphicControl:视觉元件,但是没有window handle,也不能接受输入焦点。</FONT></LI>
<LI><FONT COLOR="#000000">TComponent:不可视元件,你没办法在执行时期看到它。</FONT></LI>
<LI><FONT COLOR="#000000">TWinControl:将已存在的视窗元件包装起来,如Windows标准控制项或VBX元件。
</FONT></LI>
</UL>
</UL>
</UL>
<P>
<HR WIDTH="100%"></P>
<H3><I><FONT COLOR="#0000FF">第十部分 进阶程式设计技巧</FONT></I></H3>
<UL>
<P><A NAME="10_1"></A><B><FONT COLOR="#000000">10.1 Delphi 有与 C++ 一样的
I/O Stream 类别吗?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">答案可以说有也可以说没有。Delphi允许你建立自己的『文字档驱动程式』,它可以
让你使用Delphi 标准的 I/O 函式库来处理非标准的 I/O,如处理 UNIX 格式的文字档或处
理 Socket 所取得的资料。虽然没有像 C++ 的 I/O Stream 类别那麽强大但应该也足够一般用途使用了。</FONT></P>
<P><FONT COLOR="#000000">建立『文字档驱动程式』的方法在『Object Pascal
Language Guide』中有明述。此 外你也可以参考 VCL 的 Printer 单元。</FONT></P>
<P><FONT COLOR="#000000">Delphi有 TStream 类别,不过是设计用来将物件写入资料流的,不像
C++ 的 I/O Stream 类别那麽具有弹性。</FONT></P>
</UL>
<P><A NAME="10_2"></A><B><FONT COLOR="#000000">10.2 如何取得列举型态变数的文字表示?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">使用 TypInfo单元中的 GetEnumName 函式:</FONT></P>
<P><B><FONT COLOR="#004080">type</FONT></B><FONT COLOR="#000000"> </FONT></P>
<UL>
<P><FONT COLOR="#000000">TMyType = (Value1, Value2);</FONT></P>
</UL>
<P><B><FONT COLOR="#004080">var</FONT></B><FONT COLOR="#000000"> </FONT></P>
<UL>
<P><FONT COLOR="#000000">TypeValue: TMyType; </FONT></P>
</UL>
<P><B><FONT COLOR="#004080">begin</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">Writeln (GetEnumName(TypeInfo(TMyType), Ord(TypeValue));</FONT></P>
</UL>
<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
<P><FONT COLOR="#000000">TypInfo单元中还有许多与型别资讯有关的函式。</FONT></P>
<P><FONT COLOR="#000000">『Secrets of Delphi 2.0』这本书有许多关於TypInfo单元的资讯,值得参考。
</FONT></P>
</UL>
</UL>
<P>
<HR WIDTH="100%"></P>
<H3><I><FONT COLOR="#0000FF">第十一部分 元件虚拟方法</FONT></I></H3>
<UL>
<P><A NAME="11_1"></A><B><FONT COLOR="#000000">11.1 如何得知元件的window
handle是何时建立的?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">控制项的 window handle 是在 CreateWnd 方法中建立的。如果你想要在建立
window handle 後接著做某些动作那麽你应该改写 CreateWnd 方法:</FONT></P>
<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
TMyClass.CreateWnd;</FONT></P>
<P><B><FONT COLOR="#004080">begin</FONT></B><FONT COLOR="#000000"> </FONT></P>
<UL>
<P><FONT COLOR="#008040">// 现在还没取得 window handle </FONT></P>
<P><FONT COLOR="#000000">inherited CreateWnd;</FONT></P>
<P><FONT COLOR="#008040">// 呼叫 inherited 以取得 window handle </FONT></P>
<P><FONT COLOR="#008040">// 在这里撰写你想要执行的动作 </FONT></P>
</UL>
<P><B><FONT COLOR="#004080">end</FONT></B><FONT COLOR="#000000">;</FONT></P>
</UL>
<P><A NAME="11_2"></A><B><FONT COLOR="#000000">11.2 如何得知是否表格上所有元件都已载入完成?</FONT></B></P>
<UL>
<P><FONT COLOR="#000000">Loaded 方法是在载入完成後接著被呼叫的。</FONT></P>
<P><B><FONT COLOR="#004080">procedure</FONT></B><FONT COLOR="#000000">
TMyClass.Loaded;</FONT></P>
<P><B><FONT COLOR="#004080">begin </FONT></B></P>
<UL>
<P><B><FONT COLOR="#004080">inherited</FONT></B><FONT COLOR="#000000">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -