电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> delphi技术>>Delphi 组件撰写常问问题(3):

Delphi 组件撰写常问问题(3)

来源:远方网络 | 2005-12-31 9:37:50 | (有1856人读过)

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组件。



delphi技术热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号