来源:远方网络 | 2005-12-31 9:38:08 | (有1986人读过)
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];
|