随着XE7中非阻塞MessageDlg的出现,现在似乎无法有条件地 阻止 该应用。从我们在Windows中关闭(或在XE5中):
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := False;
FCanClose := False;
FMX.Dialogs.MessageDlg('Exit?'
,
TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0,
procedure(const AResult: TModalResult)
begin
if AResult = mrYes then
FCanClose := True;
end
);
CanClose := FCanClose;
end;
仅在表单已关闭后才调用MessageDlg(和匿名过程),从而使对象失败。哦,如果你想知道我为什么要使用FCanclose,那是因为我得到了一个关于&#34的编译器错误;无法捕获Canclose"在匿名程序中。
现在我尝试的另一种可能性是将MessageDlg放在FormKeyUp事件处理程序中并捕获vkHardwareBack。
procedure TfrmMain.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
Shift: TShiftState);
var
FService: IFMXVirtualKeyboardService;
begin
if Key = vkHardwareBack then
begin
TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyBoardService,
IInterface(FService));
if (FService <> nil) then
begin
if (TVirtualKeyBoardState.Visible in FService.VirtualKeyBoardState) then
else
begin
FMX.Dialogs.MessageDlg('Exit?'
,
TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0,
procedure(const AResult: TModalResult)
begin
if AResult = mrYes then
Key := 0; // prevent exit, if Key could be "captured"
end
);
end;
end;
end;
但是再一次,MessageDlg仅在FormKeyUp事件处理程序完成执行后被调用,再次使键设置无效! (如果它可以&#34;捕获&#34;,那就是)
如何为用户提供不关闭应用程序的选项,因为他们可能经常点击后退按钮,或者可能是因为他们需要完成某些任务才能允许出口?
答案 0 :(得分:5)
字段FCanClose
已初始化为False
。第一次调用CloseQuery
CanClose
后,将设置为False
,并显示MessageDialog。确认后,mrYes
FCanClose
对话框将设置为True
,并再次调用表单的Close
方法。现在,虽然FCanClose
为True
,但没有对话框,CanClose
设置为True
,表单将关闭。
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not FCanClose then
FMX.Dialogs.MessageDlg(
'Exit?',
TMsgDlgType.mtConfirmation,
[TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo],
0,
procedure(const AResult: TModalResult)
begin
if AResult = mrYes then
begin
FCanClose := True; // set the field value
Close; // call close again
end;
end );
CanClose := FCanClose;
end;