当我想确认表单退出时,我使用带有 if 的 DialogMsg
调用将 Action
参数设置为 caNone
(否)或 caHide
(是)。
当我将这种方法用于数据库表行发布时,我遇到了问题。
如果我制作一个带有确认对话框的保存按钮,我可以调用 Post
或 Cancel
,但是当我有一个数据库 Grid
时表格,当用户更改一行然后选择另一行时,问题就来了,女巫会自动保存前一行。
我找到的解决方案是将保存确认对话框放在OnBeforePost
中,但是如果uses说No,我应该如何取消Post
命令继续?我已经尝试了 Cancel
和 Abort
命令,但它继续保存该行。
最佳答案
您需要创建您自己的TXxxQuery
的后代TMyQuery
(或者您正在使用的其他数据集类型)。并在您的类中覆盖 Post
方法并添加一个新事件,允许决定是否需要 Post
。然后注册新组件并将应用程序中的TXxxQuery
替换为TMyQuery
。并创建事件处理程序。
例如,TMyQuery
:
interface
type
TMyAllowPostEvent = procedure (ASender: TDataSet; var AAllow: Boolean) of object;
TMyQuery = class (TXxxQuery)
private
FOnAllowPost: TMyAllowPostEvent;
public
procedure Post; override;
published
property OnAllowPost: TMyAllowPostEvent read FOnAllowPost write FOnAllowPost;
end;
implementation
procedure TMyQuery.Post;
var
lAllow: Boolean;
begin
lAllow := True;
if Assigned(OnAllowPost) then
OnAllowPost(Self, lAllow);
if lAllow then
inherited Post;
end;
以及事件处理程序的示例:
procedure TForm1.MyQuery1AllowPost(ASender: TDataSet; var AAllow: Boolean);
begin
AAllow := MessageDlg('Would you like to save changes ?', mtConfirmation, mbYesNo, -1) = mrYes;
end;
关于database - 什么是 "caHide, caNone"数据库等效项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11922043/