gpt4 book ai didi

delphi - 派生的TClient数据集;定义始终运行的 OnAfterPost

转载 作者:行者123 更新时间:2023-12-03 15:53:55 26 4
gpt4 key购买 nike

我从 TClientdataset 派生并尝试定义一个“始终运行”的 AfterPost 事件。我尝试在构造函数中分配 AfterPost 事件,但派生组件似乎没有拾取它

TMyClientDataset = class(TClientDataset)
private
FInserting: Boolean; //set to True at the MyOnNewRecord event
property FuserAfterPost: TDataSetNotifyEvent;
...
public
constructor Create(AOwner: TComponent);
...

implementation
constructor TMyClientDataset.Create(AOwner: TComponent)
begin
...
if Assigned(AfterPost) then
FuserAfterPost := AfterPost;
Afterpost := MyAfterPost;
...
end;

procedure TMyClientDataset.MyAfterPost(Dataset: TDataset);
begin
If Assigned(FuserAfterPost) then
FuserAfterPost(Dataset);
FInserting := False;
end;

我想做的:在新记录上,设置Finserting := True;在发布后,运行用户提供的 OnAfterPost 并设置 FInserting := False;但 MyAfterpost 事件甚至不会运行。我假设构造函数不是执行 AfterPost := MyAfterPost; 的正确位置?应该去哪里?

最佳答案

没有适合您想做的事情的好地方。因为组件的用户可以在程序运行时随时将处理程序或 nil 附加到事件处理程序,而不仅仅是在设计时。也可以分离现有的处理程序。那么你的代码将无法运行。

因此,VCL 对事件处理程序采用两步调用。首先是一个虚拟过程,通常它只是调用一个可能的事件处理程序。就您而言,这是 DoAfterPost。

TMyClientDataset = class(TClientDataset)
..
protected
procedure DoAfterPost; override;

...

procedure TMyClientDataset.DoAfterPost;
begin
inherited;
FInserting := False;
end;


对于不存在这样的机会的情况,除了正确记录并希望组件的用户阅读和遵守之外,没有机会。重写 Loaded 将是备份现有设计时附加处理程序的正确位置。

关于delphi - 派生的TClient数据集;定义始终运行的 OnAfterPost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40083406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com