【发布时间】:2015-05-08 20:33:24
【问题描述】:
我需要编写一个覆盖 onBeforePost 事件的 TQuery 后代,在该事件中我应该检查状态是否为 dsInsert 或 dsEdit...并允许或不允许帖子继续进行,但我需要有自定义组件经验的人仔细检查一下。
我已经很久没有创建我的组件了,我有点生疏了。你能看看我得到了什么并告诉我我做得对吗?
这是我的组件代码
unit MxQuery;
interface
uses
SysUtils, Classes, DB, DBTables;
type
TMxQuery = class(TQuery)
procedure DoBeforePost; override;
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
constructor Create(AOwner:TComponent); override;
end;
procedure Register;
implementation
constructor TMxQuery.Create(AOwner:Tcomponent);
begin
inherited create(AOwner);
end;
procedure Register;
begin
RegisterComponents('Samples', [TMxQuery]);
end;
procedure TMxQuery.DoBeforePost;
begin
case self.DataSource.State of
dsEdit,dsInsert:
begin
//Do nothing or other stuff
end;
else
begin
self.DataSource.DataSet.Cancel;
Abort;
end;
end;
inherited;
end;
end.
谢谢
【问题讨论】:
-
对我来说很合适。但是为什么要在设计时注册它。它是一个非视觉组件。保持在运行时
-
你的意思是:去掉注册程序并在其他项目中使用该单元,而不在托盘上放置另一个组件?
-
但是覆盖,我做得对吗?我停止发布查询的方式对您来说似乎是正确的?
-
您希望使用此代码防止什么?除了 dsInsert,dsEdit 没有需要发布的事件。
-
您的代码完全没有必要。
TDataSet不会调用DoBeforePost,除非数据集已经处于dsInsert或dsEdit模式,因此您的代码是毫无意义的重新检查。如果在不处于这些状态之一的数据集上调用Post,则会引发异常并且永远不会触发DoBeforePost。 (如果数据集 not 处于这些状态之一,则数据集对Cancel没有任何意义,因此您对Cancel和Abort的调用都没有操作 - 它们没有任何用途.)
标签: delphi