首页 > 解决方案 > 如何在设计时对其他单元可用的单独单元中定义具有已发布方法的类?

问题描述

为了克服 10.3.3 中的错误(请参阅 QC 报告https://quality.embarcadero.com/browse/RSP-29565)与TFDTable其他地方的详细信息(设置 indexname 时 Delphi TFDTable 打开失败),我希望能够定义一个具有公共单元中的方法的类,可以(以编程方式)将其分配为BeforeOpen相关 DFM 中的事件,用于TFDTable在 Form 或 DataModule 上定义的组件。

我意识到这个问题之前已经被问过(例如,如何为事件方法创建一个单独的单元,哪个 IDE 允许我在设计时分配给组件事件?),但是那里的解决方案与我所做的相匹配,并且他们不工作。

因此,在一个必须已经在使用的单元的uses子句中列出的单元中TFDTable,我这样定义我的类:

通用单位:

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);

最后,在一个测试单元中,我定义了一个带有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. 同样,不是有效的标识符。

我认为我正在尝试做的事情是可能的,而我只是错过了一些基本的东西。请帮忙。

标签: delphievent-handlingdesign-time

解决方案


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

为什么不直接创建一个从 FireDAC.Comp.Client.TFDTable 派生的名为 TFDTable 的插入器类?它可以覆盖虚拟的 DoBeforeOpen() 方法,如果它在另一个单元中,您不必将其安装到 IDE 中,只需确保该单元在 FireDAC.Comp.Client 单元之后的 Form/DataModule 的 uses 子句中,以便您的 TFDTable 是范围内的最后一个,因此 DFM 将改为流式传输它


推荐阅读