delphi - 如何在设计时对其他单元可用的单独单元中定义具有已发布方法的类?
问题描述
为了克服 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
. 同样,不是有效的标识符。
我认为我正在尝试做的事情是可能的,而我只是错过了一些基本的东西。请帮忙。
解决方案
根据 Remy Lebeau 的评论,这看起来是最好的攻击途径:
为什么不直接创建一个从 FireDAC.Comp.Client.TFDTable 派生的名为 TFDTable 的插入器类?它可以覆盖虚拟的 DoBeforeOpen() 方法,如果它在另一个单元中,您不必将其安装到 IDE 中,只需确保该单元在 FireDAC.Comp.Client 单元之后的 Form/DataModule 的 uses 子句中,以便您的 TFDTable 是范围内的最后一个,因此 DFM 将改为流式传输它
推荐阅读
- powershell - PowerShell 执行带有参数的 exe
- asp.net - ASP.NET - SmtpClient.Send 从不捕获异常
- android - WIFI 网络的 EMM 策略代理设置
- python - 打开文本文件,在两个字符串之间复制数据,转置和连接
- html - 添加 ui.bootstrap 后 Ng-view 不显示
- c# - 以其他用户身份启动后台进程而不显示窗口
- javascript - service-worker.js 和谷歌分析
- javascript - 在 WordPress foreach 循环中使用 jQuery 脚本
- java - 无法在java eclipse中读取src文件夹外的html文件
- react-native - 如何处理或防止在反应原生模态上按下硬件后退按钮?