为了克服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
. 同样,不是一个有效的标识符。
我想我想做的事情是可能的,我只是错过了一些基本的东西。请给予帮助。
根据Remy Lebeau的评论,这看起来是最好的攻击途径。
为什么不干脆创建一个名为TFDTable的类 从FireDAC.Comp.Client.TFDTable派生出来?它可以重写虚拟的DoBeforeOpen()方法,如果它在另一个单元中,你不必把它安装到IDE中,只要确保那个单元在FormDataModule的uses子句中,在FireDAC.Comp.Client单元之后,这样你的TFDTable就是最后一个在范围内的,所以DFM会用流式传输代替它。