如何在设计时可供其他单元使用的单独单元中定义具有已发布方法的类?



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

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

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

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

最后,在测试单元中,我定义了一个带有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;
...

有了上述内容,我可以像这样在运行时分配FDTable1BeforeOpen事件,并且一切都按预期工作:

FDTable1.BeforeOpen := myMethodHolder.FDTableBeforeOpen;

但是,我无法在设计时分配FDTable1BeforeOpen事件(例如myMethodHolder.FDTableBeforeOpen(。IDE 抱怨它不是有效的标识符。

即使我将TMyMethodHolder组件作为myMethodHolder1放到表单上(这反而违背了我的目的(,我也无法将BeforeOpen事件分配给myMethodHolder1.FDTableBeforeOpen。同样,不是有效的标识符。

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

根据Remy Lebeau的评论,这似乎是最好的攻击途径:

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

最新更新