【问题标题】:Component event detection in DelphiDelphi中的组件事件检测
【发布时间】:2015-08-31 19:49:11
【问题描述】:

我正在开发一个DataAware组件并在数据库打开后执行一些代码。

这是我目前的代码:

  TMyDataAwareComponent = class(TDataAwareComponent)
  private
    { Private declarations }
    procedure ToBeExecutedOnAfterOpen(DataSet: TDataSet);
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  end;

 constructor TMyDataAwareComponent.Create(AOwner: TComponent);
 begin
  inherited;
  if Assigned(Self.DataSource) then
  begin
    Self.DataSource.DataSet.AfterOpen := ToBeExecutedOnAfterOpen;
  end;
 end;

 procedure TMyDataAwareComponent.ToBeExecutedOnAfterOpen(DataSet: TDataSet);
 var
  i: Integer;
 begin
    // Do something here
 end;

代码工作正常,但链接到组件的数据集的 AfterOpen 事件不再触发。 如何确保 AfterOpen 事件首先在数据集中触发,然后在我的组件中触发?

是否有适用于数据集中所有事件的解决方案(BeforeOpen、AfterOpen、BeforeCancel、BeforeDelete、AfterCancel、AfterDelete 等)?

【问题讨论】:

  • 代码运行正常,但链接到组件的数据集的 AfterOpen 事件不再触发。你劫持了它!
  • 编写数据感知组件参考 Delphi 作者已经完成的一个。对于单字段编辑器,请查看 TDBEdit 及其 FDataLink 字段;对于类似网格的组件,请查看 TDBGrid 及其 FDataLink 字段。
  • 您需要检查 Self.DataSource.DataSet 是否也已分配,fwiw。

标签: delphi events components


【解决方案1】:

可以使用虚方法拦截器来拦截DoAfterOpen虚调用

FVirtualIncerceptor := TVirtualMethodInterceptor.Create(TDataSet);
FVirtualIncerceptor.OnBefore := procedure(Instance: TObject; Method: TRttiMethod;
    const Args: TArray<TValue>; out DoInvoke: Boolean; out Result: TValue)
begin
  if Method.Name = 'DoAfterOpen' then
    ToBeExecutedOnAfterOpen(TDataset(Instance));
end;
FVirtualIncerceptor.Proxify(Self.DataSource.DataSet);

更多信息请看这里 http://docwiki.embarcadero.com/CodeExamples/XE8/en/TVirtualMethodInterceptor_(Delphi)

我假设您可以了解如何扩展它以处理其他情况

【讨论】:

    【解决方案2】:

    您必须在分配时保存旧的DataSet.AfterOpen,并在ToBeExecutedOnAfterOpen 中调用该保存的方法。 但正如 Abelisto 在他的评论中已经说过的那样,这不是要走的路。它也不会满足您对“对数据集中所有事件都有效的解决方案”的要求。也许这对你有帮助:http://delphidabbler.com/tips/194

    【讨论】:

      【解决方案3】:

      您可能会查看面向方面的编程。就像@Jasper 指出的那样......虚拟方法注入......

      DSharp 很容易设置。看看 DSharp.Aspects.Weaver。您可以轻松地绑定到任何已发布或公开的方法。

      -瑞克

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-09
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2011-01-04
        • 2017-04-10
        • 2012-10-23
        相关资源
        最近更新 更多