【问题标题】:Delphi TQuery descendant objectDelphi TQuery 后代对象
【发布时间】: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,除非数据集已经处于 dsInsertdsEdit 模式,因此您的代码是毫无意义的重新检查。如果在不处于这些状态之一的数据集上调用 Post,则会引发异常并且永远不会触发 DoBeforePost。 (如果数据集 not 处于这些状态之一,则数据集对 Cancel 没有任何意义,因此您对 CancelAbort 的调用都没有操作 - 它们没有任何用途.)

标签: delphi


【解决方案1】:

恕我直言,这个问题更适合https://codereview.stackexchange.com/

无论如何,让我指出一点:

  1. 您的代码应该可以运行。
  2. 正如@SirRufo 所说,您不必要地将方法DoBeforePost 的可见性提高到published。在声明 TQuery 或其祖先之一中查找此方法。覆盖具有相同可见性的方法。
  3. 不需要构造函数TMxQuery.Create,因为它不会添加任何内容。

【讨论】:

  • 我不知道你提到的那个网站。谢谢
猜你喜欢
  • 2011-12-29
  • 2018-03-09
  • 2011-08-06
  • 2016-04-21
  • 1970-01-01
  • 2010-09-12
  • 2017-07-22
  • 2012-12-22
  • 1970-01-01
相关资源
最近更新 更多