手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

Delphi 组件撰写常问问题

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

function GetpageSize (ScrollBar: TScrollBar): Integer;
var
ScrollInfo: TScrollInfo;
begin
if HandleAllocated then
begin
ScrollInfo.cbSize := SizeOf (ScrollInfo);
ScrollInfo.fMask := SIF_PAGE;
GetScrollInfo (ScrollBar.Handle, SB_CTL, ScrollInfo);
Result := ScrollInfo.nPage;
end;
end;
--------------------------------------------------------------------------------
第四部分 Bound Controls

4.1 哪里可以找得到有关 TDataLink 类别的说明文件?
我可以大胆地说全世界有关 TDataLink 的说明文件只有一份,就在这儿:
属性 (Property) 介绍
property Active: Boolean(只读)
当此 DataLink 连结至一个已开启的 DataSource 时会传回 True。当 Active 状态改变时会 触发ActiveChanged方法。
property ActiveRecord: Integer(可擦写)
用来设定或取得 DataLink 缓冲区中目前所指向的记录代码,代码的范围是 0 .. BufferCount - 1。使用它来设定记录代码时必须小心不要超过这个范围,否则可能导致不可预期的错误。
property BufferCount: Integer(可擦写)
DataLink 拥有一个资料缓冲区。而 BufferCount 属性即用来设定或取得缓冲区大小,缓冲区大小决定了一个dataset同时可以显视的资料记录笔数。对大部分的资料感知组件来说,BufferCount 的值是 1;但对 TDataGrid 来说,BufferCount 代表它的可视列数目。
property DataSet: TDataSet(只读)
传回此 DataLink 所连结的 DataSet。其实就是 DataSource.DataSet。
property DataSource: TDataSource(可擦写)
传回此DataLink所连结的DataSource。
property DataSourceFixed: Boolean(可擦写)
这个属性可用来防止 DataSource 属性被更改。如果此属性设为 True,当我们试着改变 DataSource 属性时会引发一个例外。
property Editing: Boolean(只读)
如果 DataLink 正处于编辑状态则传回 True。
property ReadOnly: Boolean(可擦写)
设定 DataLink 是否为只读状态。这个属性并不会影响所连结的 DataSet。在只读状态下这个 DataLink 无法进入编辑状态。
property RecordCount: Integer(只读)
传回DataSet的资料记录数目。
方法 (Method) 介绍
function Edit: Boolean;
让所连结的DataSet进入编辑状态。传回值: 成功传回 True ,失败传回 False
procedure UpdateRecord;
我们不直接呼叫这个方法,它是提供其它程序来呼叫的。这个方法只有设定一个旗帜然后呼叫 UpdateData 方法。
虚拟方法 ( Virtual Method )
要让 TDataLink 对象与组件沟通必须改写下列这些方法:
procedure ActiveChanged
当连结的 DataSource 开启状态改变时会呼叫此方法。使用 Active 属性可以得知目前是否为开启状态。
procedure CheckBrowseMode
数据库有任何改变之后都会先呼叫这个方法。
procedure DataSetChanged;
当下列任一事件发生时都会呼叫此方法:
移至DataSet的开头
移至DataSet的结尾
在DataSet中插入或新增资料
删除DataSet的资料
取消DataSet的编辑
更新记录
如果不想改写这个方法只要在其中呼叫:
RecordChanged(nil);
procedure DataSetScrolled(Distance: Integer)
每当目前记录变更时会呼叫此方法。Distance 参数代表缓冲区欲卷动的行数。(其值范围皆在 -1 .. 1 之间)。使用 ActiveRecord 属性可以取得缓冲区中目前所指向的记录。我们无法强制让 DataLink 的缓冲区卷动。
procedure FocusControl(Field: TFieldRef)
与TField.FocusControl方法相同。
procedure EditingChanged
当 DataLink 的编辑状态改变时会呼叫此方法。使用 Editing 属性可以得知DataLink 是否 正处于编辑状态。
procedure LayoutChanged
当 DataSet 的 Layout 改变时会呼叫此方法(例如新增一个column)。
procedure RecordChanged(Field: TField)
当下列任一事件发生时都会呼叫此方法:
目前记录进入编辑状态
目前记录内容更动
procedure UpdateData
在一笔记录被更新以前会呼叫此方法。你可以呼叫 Abort 程序来防止数据库更新。

4.2 如何得知一个 dataset 中有几笔记录?
TDateSet 的 RecNo 属性可以传回资料记录的数目,但很不幸地它只适用于 dBase 及 Paradox 的资料表格。若想得知目前资料记录的编号,可以从 TDataLink 类别衍生一个新的类别,然后进行下 列步骤:
改写 DataSetScrolled 方法以取得目前记录是否被卷动。
改写 DataSetChanged 方法来确认目前记录是否跳至最前面或最后面了。
接着你可以将这个新类别的对象连结到TDataSource对象上然后就可以随时得知目前的记录编号了。
--------------------------------------------------------------------------------

第五部分 VCL
5.1 使用整合环境除错时如何追踪检视 VCL组件的程序代码?
将你想要追踪的 VCL 原始程序单元拷贝至存放项目的目录中并重新编译组件库,此后你就可以在那些 VCL单元中追踪检视程序代码了。

5.2 我的组件参考到其它组件,如何得到参考组件被消灭的讯息?
Max Nilson 的回答:
TComponent 类别提供了 Notification 方法。当一个组件被移除时我们可以利用这个方法得到消息以进行适当的反应。你可以参考『Component Writer''''s Guide』内有关 Notification 及FreeNotification 这两个方法的说明。
当你的组件参考到另一个组件,例如,你的组件中有一个 TDataSource 型态的属性。那你必须改写此组件的 Notification 方法,在其中检查被移除的组件是否就是本身所参考的组件。预设情况下,当组件被移除时,所有其它在同一个表格上的组件才会收到消息,如果参考组件位于另一个表格上时,你的组件无法得知这件事情。Delphi 2.0 推出了TDataModule,参考组件位于另一个表格上的机会大幅增加,所以你应该利用 FreeNotification 方法来确定当参考组件移除时,你一定可以得到消息。
如果你不改写 Notification 方法来处理参考组件被移除的讯息,这会让 Delphi整合环境陷入十分不稳定的状态。它可能不会立刻当掉,但你也不能再正常地继续其它工作了。
下面是一个范例,当你的组件参考其它组件时,千万记得要做以下的处理:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!