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

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

来源:远方网络 | 2005-12-31 9:38:08 | (有1876人读过)

26 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 类别那么具有弹性。

27 如何取得列举型态变量的文字表示?

使用 TypInfo单元中的 GetEnumName 函式:

type

TMyType = (Value1, Value2);

var

TypeValue: TMyType;

begin

Writeln (GetEnumName(TypeInfo(TMyType), Ord(TypeValue));

end;

TypInfo单元中还有许多与型别信息有关的函式。

28 如何得知组件的window handle是何时建立的?

控件的 window handle 是在 CreateWnd 方法中建立的。如果你想要在建立 window handle 后接着做某些动作那么你应该改写 CreateWnd 方法:

procedure TMyClass.CreateWnd;

begin

// 现在还没取得 window handle

inherited CreateWnd;

// 呼叫 inherited 以取得 window handle

// 在这里撰写你想要执行的动作

end;

28 如何得知是否表格上所有组件都已加载完成?

Loaded 方法是在加载完成后接着被呼叫的。

procedure TMyClass.Loaded;

begin

inherited Loaded;

// 将ComponentState中的 csLoading 状态清除

// 在这里撰写你想要执行的动作

end;

29 在哪里绘制组件最适合?

你应该拦截 WM_PAINT 窗口讯息然后利用 Canvas 来绘制组件。然而 VCL 己经帮你拦 截好了,你只须改写组件的 Paint 方法即可。

procedure TMyClass.Paint;

begin

// 如果你的组件是己存在的组件继承下来的,那么必须在这里呼叫 inherited Paint

inherited Paint ;

// 在这里撰写你想要执行的动作

end;

30 如何改变组件的窗口式样?

CreateParams方法用来设定组件的窗口式样及其它必须传递至 CreateWindowEx API 的 参数。要改变组件的窗口式样,例如增加或拿掉组件的垂直滚动条只要改写 CreateParams 方法:

procedure TMyControl.CreateParams(var Params: TCreateParams);

begin

inherited CreateParams(Params);

if IWantAScrollBar then

Params.Style := Params.Style or WS_VSCROLL

else

Params.Style := Params.Style and not WS_VSCROLL;

end;

31 组件卷动时闪动的很厉害,如何克服这种情况?

要卷动组件本身最简单的方法就是改变它的坐标然后重画组件,但是这方法会导致组件闪动的很厉害。比较好的方法是呼叫 ScrollWindow 或 ScrollWindowEx Windows API。

闪动的另一个原因可能来自于 WM_PAINT 及 WM_ERASEBKGND。你可以试着拦截 WM_ERASEBKGND 及 WM_PAINT 讯息然后自己处理绘图动作,包括绘制背景的动作,或许可以改善闪动的情况。

32 如何重新激活Windows?

使用 ExitWindowsEx Windows API。

33 如何快速大量地更改组件资料?

在进行大量资料更改前后,利用 WM_SETREDRAW 讯息来控制你的组件暂时不要重画,这不但可以使资料设定速度增快也防止组件闪烁的情况。

34 为什么我的组件的 Ctl3D 属性设为 True 之后,它依然没有 3D 的边框呢?

如果 ControlStyle 属性内没有包含 csFramed 旗帜那么 Ctl3D 属性就会没有作用。在组件 的建构函式内加上:

ControlStyle := ControlStyle + [csFramed];



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

 

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

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