如何在一个单独的单元中定义一个具有发布方法的类,并在设计时提供给其他单元?

问题描述 投票:0回答:1

为了克服10.3.3中的一个bug(见QC report https:/quality.embarcadero.com浏览RSP-29565。)有关 TFDTable 详见于别处(当indexname被设置时,Delphi TFDT表打开失败。),我希望能够在一个公共单元中定义一个带有方法的类,该方法可以(以编程的方式)被分配为一个 BeforeOpen 事件,在相关的DFM中 TFDTable 在表单或DataModule上定义的组件。

我知道这个问题以前有人问过(例如:如何为事件方法建立一个单独的单元,IDE允许我在设计时将其分配给组件事件?如何为事件方法创建一个单独的单元,IDE允许我在设计时将其分配给组件事件?),但那里的解决方案与我所做的相吻合,但它们不起作用。

所以,在一个单元中,必须已经列在了 uses 的单位的子句,使用 TFDTable我是这样定义我的类的。

Common_unit:

type
  TmyMethodHolder = class(TComponent)
  published
    procedure FDTableBeforeOpen(DataSet: TDataSet);
  end;

...

var
  myMethodHolder : TmyMethodHolder=nil;

...

procedure TmyMethodHolder.FDTableBeforeOpen(DataSet: TDataSet);
begin
  // this procedure below is also defined within this "common_unit" 
  FDTableSetCatalogName(Dataset);
end;

...

initialization
  myMethodHolder := TmyMethodHolder.Create(nil);
finalization
  myMethodHolder.Free;

在注册单元中,组件(和类--虽然这似乎没有什么区别)被注册如下。

RegisterComponents('MyComponents', [TmyMethodHolder]);
RegisterClass(TmyMethodHolder);

最后,在一个测试单元中,我定义了一个Form,它的名字是 "Form"。TFDTable. 该单位 uses 的 "common_unit"。

unit FDTable_Bug_Demo2;

interface

uses
  ... Common_Unit, ....

type

  TForm2 = class(TForm)
    DBGrid1: TDBGrid;
    Button1: TButton;
    FDConnection1: TFDConnection;
    DataSource1: TDataSource;
    edServer: TLabeledEdit;
    edDatabase: TLabeledEdit;
    edUserName: TLabeledEdit;
    edPassword: TLabeledEdit;
    Button2: TButton;
    Button3: TButton;
    FDTable1: TFDTable;
    ...

有了上面的内容,我就可以将 BeforeOpen 事件 FDTable1 在运行时,就像这样,一切都像预期的那样工作。

FDTable1.BeforeOpen := myMethodHolder.FDTableBeforeOpen;

但是,我不能将 BeforeOpen 事件 FDTable1 在设计时(以如 myMethodHolder.FDTableBeforeOpen). IDE抱怨说这不是一个有效的标识符。

即使我放弃了一个 TMyMethodHolder 组件到表格上,作为 myMethodHolder1 (这相当程度上违背了我的目的),我不能分配给 BeforeOpen 事件 myMethodHolder1.FDTableBeforeOpen. 同样,不是一个有效的标识符。

我想我想做的事情是可能的,我只是错过了一些基本的东西。请给予帮助。

delphi event-handling design-time
1个回答
1
投票

根据Remy Lebeau的评论,这看起来是最好的攻击途径。

为什么不干脆创建一个名为TFDTable的类 从FireDAC.Comp.Client.TFDTable派生出来?它可以重写虚拟的DoBeforeOpen()方法,如果它在另一个单元中,你不必把它安装到IDE中,只要确保那个单元在FormDataModule的uses子句中,在FireDAC.Comp.Client单元之后,这样你的TFDTable就是最后一个在范围内的,所以DFM会用流式传输代替它。

© www.soinside.com 2019 - 2024. All rights reserved.