将对象加载的方法用了点小技巧。你必须改写组件的 GetChildOwner 及 GetChildParent 方法,否则 Delphi会将所有对象的拥有者都设定为组件所在的表格。(在Delphi 1.0 中你必须改写ReadState方法)。
7.2 如何得知组件是否正从资料流中读出?
当组件正从资料流中读出时,它的 ComponentState 属性会包含csLoading 旗帜。
constructor TMyClass.Create(AOwner: TComponent);
begin
if csLoading in AOwner.ComponentState then
begin ... end
else
begin ... end;
end;
7.3 如何确定组件的属性是否被正确地储存?
有许多很简单的方法可以验证属性是否被正确地储存在档案里:
在整合环境中用鼠标右键点选表格然后选择『View as Text』。然而万一 DFM 檔 有任何错误的话,你将什么也看不到。
开个 DOS 窗口,利用 Delphi 所附的『Convert』程序将 DFM 文件转成文字格式。
Stefan Hoffmeister 指出复制或剪下组件后,到任何一个文书编辑器(如记事本)中贴上,你就可以看到此组件的文字表示。你甚至可以编辑这些文字表示后再将它贴回 Delphi整合环境的表格上。
--------------------------------------------------------------------------------
第八部分 Delphi 的工具
8.1 有没有Delphi版本的 YACC 及 LEX?
有。Albert Graef 这位仁兄写了 Turbo Pascal 版本的 YACC 及 LEX,也可以让 Delphi 使用。
你可以在 ftp://ftp.simtel.net/pub/simtelnet/msdos/turbopas 下取得 tply30a1.zip 及 tply30a2.zip 这两个档案,其中还包含这两个工具的原始程序哦!
8.2 如何秀出 JPEG 格式图形文件?
Jacques Nomssi Nzali 将 Independent JPEG Group 所发展的免费 JPEG 链接库改写成 Pascal 版本。你可以从下取得:
PASJPG10.ZIP
Independent JPEG Group 的免费 JPEG 函式库 rev 6a 之 Pascal 版本 (1.0 版)。
--------------------------------------------------------------------------------
第九部分 基本程序设计技巧
9.1 如何建立不定数目的对象数组?
最简单的方法是使用 TList 类别。我发现从 TList 衍生一个新类别很有用处。接下来的程序代码示范如何为一个特定型态撰写一个特别的 TList 类别,并且加进基本的错误检查。
TListOfMyObject = class (TList)
private
function GetItems(Index: Ordinal): TMyObject;
public
property Items[Index: Ordinal]: TMyObject read GetItems;
procedure Add(AObject: TMyObject);
end;
function TListOfMyObject.GetItems (Index: Ordinal): TMyObject;
begin
if Index >= Count then
raise Exception.CreateFmt(''''Index(%d) outside range 1..%d'''', [Index, Count-1]);
Result := inherited Items[Index];
end;
procedure TListOfMyObject.Add (AObject: TmyObject);
begin
inherited Add(AObject);
end;
9.2 Delphi 2.0的 WinCrt单元到哪去了?
Delphi 2.0并没有 WinCrt单元。 先别伤心,这是因为我们可以用其它方法来取代它。在 Project|Options 的 Linker 页次中将『Generate console application』选项打开,你就可以像以前使用 WinCrt 单元一样地写程序了!
9.3 自制组件时该从哪个类别继承?
VCL 中有一些『自订』类别,而且有许多控件是直接由这些『自订』类别继承下来的。例如 TMemo 直接继承自 TCustomMemo类别。这些自订类别写好了所有该控件所拥有的功能,只是没有将属性公开出来而己。大部分情形下,你应该从那些自订类别继承而不是控件类别。
如果你要从头撰写自己的组件,那么从 TCustomControl 类别继承是个不错的主意。撰写出来的组件会具有 Window Handle 且可以接受输入焦点。
另外根据你的需要也可以从这些类别继承:
TGraphicControl:视觉组件,但是没有window handle,也不能接受输入焦点。
TComponent:不可视组件,你没办法在执行时期看到它。
TWinControl:将已存在的窗口组件包装起来,如Windows标准控件或VBX组件。
-------------------------------------------------------------------------------
第十部分 进阶程序设计技巧
10.1 Delphi 有与 C 一样的 I/O Stream 类别吗?
答案可以说有也可以说没有。Delphi允许你建立自己的『文字文件驱动程序』,它可以让你使用Delphi 标准的 I/O 函式库来处理非标准的 I/O,如处理 UNIX 格式的文字文件或处理 Socket 所取得的资料。虽然没有像 C 的 I/O Stream 类别那么强大但应该也足够一般用途使用了。
建立『文字文件驱动程序』的方法在『Object Pascal Language Guide』中有明述。此 外你也可以参考 VCL 的 Printer 单元。
Delphi有 TStream 类别,不过是设计用来将对象写入资料流的,不像 C 的 I/O Stream 类别那么具有弹性。
10.2 如何取得列举型态变量的文字表示?
使用 TypInfo单元中的 GetEnumName 函式:
type
TMyType = (Value1, Value2);
var
TypeValue: TMyType;
begin
Writeln (GetEnumName(TypeInfo(TMyType), Ord(TypeValue));
end;
TypInfo单元中还有许多与型别信息有关的函式。
『Secrets of Delphi 2.0』这本书有许多关于TypInfo单元的信息,值得参考。
--------------------------------------------------------------------------------
第十一部分 组件虚拟方法
11.1 如何得知组件的window handle是何时建立的?
控件的 window handle 是在 CreateWnd 方法中建立的。如果你想要在建立 window handle 后接着做某些动作那么你应该改写 CreateWnd 方法:
procedure TMyClass.CreateWnd;
begin
// 现在还没取得 window handle
inherited CreateWnd;
// 呼叫 inherited 以取得 window handle
// 在这里撰写你想要执行的动作
end;
11.2 如何得知是否表格上所有组件都已加载完成?
Loaded 方法是在加载完成后接着被呼叫的。
procedure TMyClass.Loaded;
begin
inherited Loaded;
// 将ComponentState中的 csLoading 状态清除
// 在这里撰写你想要执行的动作
end;
11.3 在哪里绘制组件最适合?
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




