当我想确认表单退出时,我使用DialogMsg
调用if,将Action
参数设置为caNone
(否)或caHide
(是)
当我使用该方法进行数据库表行发布时,我遇到了问题。
如果我创建一个带有确认对话框的“保存”按钮,我可以调用Post
或Cancel
,但当表单中有数据库Grid
时,问题出现在用户改变一行,然后选择另一行,自动保存前一行。
我找到的解决方案是将保存确认对话框放在OnBeforePost
内,但如果用户说“不”,我应该如何取消Post
命令继续?我尝试了Cancel
和Abort
命令,但它会继续保存该行。
答案 0 :(得分:2)
您需要创建TMyQuery
(或您正在使用的其他数据集类型)的自己的后代TXxxQuery
。在您的类中重写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;