不确定我做错了什么,但我正在使用Delphi XE8组装一个Android应用程序。
当某个消息对话框出现并且用户选择“是”时,我希望它调用已在应用程序中的按钮OnClick事件。
按下时按钮会加载相机。
我这样做是认为它是正确的,但它不起作用:
if MessageDlg ('Do you wish to continue?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo],0) = mrYes then
begin
TakeImageClick(self);
end;
单步执行代码我没有收到任何错误,但它只是完全跳过按钮点击事件。
按钮是TSpeedButton。
非常感谢任何帮助。 谢谢,
答案 0 :(得分:1)
请阅读Embarcadero的文档。
如果对MessageDlg的调用不包含ACloseDialogProc参数,则调用在所有平台上都是阻塞的;也就是说,在对话框关闭之前,MessageDlg不会返回。 Android不支持这些阻止调用,如果您提供ACloseDialogProc参数,则只能在Android上使用MessageDlg。
此功能已在XE7中添加:
Dialog Box Methods Support Anonymous Methods to Handle Their Closing
在XE6中,对对话框方法(InputBox,InputQuery,MessageDlg,ShowMessage)的调用始终是阻塞的。在对话框关闭之前,不会执行调用其中一个方法之后的任何代码。 Android不允许阻止对话框,因此您无法在Android上使用这些方法。
在XE7上,InputBox,InputQuery和MessageDlg支持一个新的可选参数。包含此新参数的调用适用于所有平台,包括Android 。这个新的可选参数允许您提供在对话框关闭时调用的匿名方法。 当您使用此新参数调用这些方法时,您的呼叫在桌面平台中会被阻止,而在移动平台中会被阻止。如果您需要在对话框关闭后执行代码,请使用此新参数以确保您的应用程序在所有支持的平台上按预期工作。
如果你调用InputBox,InputQuery或MessageDlg并且你没有在你的调用中提供匿名方法,这些方法就像他们在XE6中的行为一样:调用在所有平台上都是阻塞的,包括iOS和 Android不受支持。
例如:
MessageDlg('Do you wish to continue?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0,
procedure(const AResult: TModalResult)
begin
if AResult = mrYes then
TakeImageClick(Self);
end
);