来源:远方网络 | 2005-12-31 9:37:50 | (有1976人读过)
18 有哪些Web站台可以取得撰写组件的信息?
全世界最大的 Delphi Web 站台『Delphi SuperPage』
(译注:亚洲地区使用者可以就近到位于日本的 Mirror Site )
我在下面这些站台中找到许多组件的原始程序代码:
Temple of Delphi
Delphi Free Stuff
(译注:『Your Delphi Programming Resource』整理组件也十分用心! )
(译注:台湾地区目前维持最好的 Delphi 站台是『32 Bit Delphi 深度历险』及其 Mirror Site)
19 如何将包含其它对象的对象一起存入 DFM 檔?
我试过许多方法,包括改写组件的 DefineProperties及 WriteComponents方法,但都还是失败了。所以我只能说要解决这个问题的话只有使用 Delphi 原本的方法一途。
将包含其它对象的对象一起储存起来的步骤大致如下:
确定你要储存的所有对象都是从 TComponent 类别衍生下来的。
将所有需要储存的变量宣告在 published 区段。
在组件的 Register 程序中呼叫 RegisterComponents程序来注册所有你要储存起来的类别。
每个拥有子控件的类别必须改写 GetChildren 方法以储存每个子控件。(在 Delphi 1.0 中你必须改写 WriteComponents 方法并且为每个子控件呼叫 WriteComponent方法)。
将对象加载的方法用了点小技巧。你必须改写组件的 GetChildOwner 及 GetChildParent 方法,否则 Delphi会将所有对象的拥有者都设定为组件所在的表格。(在Delphi 1.0 中你必须改写ReadState方法)。
20 如何得知组件是否正从资料流中读出?
当组件正从资料流中读出时,它的 ComponentState 属性会包含csLoading 旗帜。
constructor TMyClass.Create(AOwner: TComponent);
begin
if csLoading in AOwner.ComponentState then
begin ... end
else
begin ... end;
end;
21 如何确定组件的属性是否被正确地储存?
有许多很简单的方法可以验证属性是否被正确地储存在档案里:
在整合环境中用鼠标右键点选表格然后选择『View as Text』。然而万一 DFM 檔 有任何错误的话,你将什么也看不到。
开个 DOS 窗口,利用 Delphi 所附的『Convert』程序将 DFM 文件转成文字格式。
Stefan Hoffmeister 指出复制或剪下组件后,到任何一个文书编辑器(如记事本)中贴上,你就可以看到此组件的文字表示。你甚至可以编辑这些文字表示后再将它贴回 Delphi整合环境的表格上。
22 有没有Delphi版本的 YACC 及 LEX?
有。Albert Graef 这位仁兄写了 Turbo Pascal 版本的 YACC 及 LEX,也可以让 Delphi 使用。
你可以在 ftp://ftp.simtel.net/pub/simtelnet/msdos/turbopas 下取得 tply30a1.zip 及 tply30a2.zip 这两个档案,其中还包含这两个工具的原始程序哦!
23 如何秀出 JPEG 格式图形文件?
Jacques Nomssi Nzali 将 Independent JPEG Group 所发展的免费 JPEG 链接库改写成 Pascal 版本。你可以从下取得:
PASJPG10.ZIP
Independent JPEG Group 的免费 JPEG 函式库 rev 6a 之 Pascal 版本 (1.0 版)。
24 如何建立不定数目的对象数组?
最简单的方法是使用 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;
24 Delphi 2.0的 WinCrt单元到哪去了?
Delphi 2.0并没有 WinCrt单元。 先别伤心,这是因为我们可以用其它方法来取代它。在 Project|Options 的 Linker 页次中将『Generate console application』选项打开,你就可以像以前使用 WinCrt 单元一样地写程序了!
25 自制组件时该从哪个类别继承?
VCL 中有一些『自订』类别,而且有许多控件是直接由这些『自订』类别继承下来的。例如 TMemo 直接继承自 TCustomMemo类别。这些自订类别写好了所有该控件所拥有的功能,只是没有将属性公开出来而己。大部分情形下,你应该从那些自订类别继承而不是控件类别。
如果你要从头撰写自己的组件,那么从 TCustomControl 类别继承是个不错的主意。撰写出来的组件会具有 Window Handle 且可以接受输入焦点。
另外根据你的需要也可以从这些类别继承:
TGraphicControl:视觉组件,但是没有window handle,也不能接受输入焦点。
TComponent:不可视组件,你没办法在执行时期看到它。
TWinControl:将已存在的窗口组件包装起来,如Windows标准控件或VBX组件。
|