为了克服 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;
...
有了上述内容,我可以像这样在运行时分配FDTable1
的BeforeOpen
事件,并且一切都按预期工作:
FDTable1.BeforeOpen := myMethodHolder.FDTableBeforeOpen;
但是,我无法在设计时分配FDTable1
的BeforeOpen
事件(例如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将流式传输它
。