通常在使用TDataset后代作为数据存储(例如TClientDataset)的Delphi VCL应用程序中,在Dataset1BeforeDelete处理程序中,我们执行以下操作:
procedure TClientModule1.MyCDSBeforeDelete(DataSet: TDataSet);
begin
if MessageDlg('Delete?', mtCOnfirmation, [mbyes, mbNo], 0) <> mrYes then
SysUtils.Abort
end;
现在,在设计为在Android上运行的FMX应用程序中,这将成为:
procedure TClientModule1.MyCDSBeforeDelete(DataSet: TDataSet);
MessageDlg('Delete?'
,
TMsgDlgType.mtWarning, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0,
procedure(const AResult: TModalResult)
begin
if AResult <> mrYes then
Abort;
end
);
end;
除外,这不起作用! messagedlg将引起用户的注意,但事件处理程序代码将继续并允许记录被删除。
解决方案是什么?
答案 0 :(得分:1)
由于 FMX for Android 目前不支持模态窗口和消息框,因此您应该使用某种类型的&#34; dog-nail&#34;溶液
Ad-Hoc解决方案#1 ,。
以主窗体或窗体形式打开Modal窗口,编写如下代码:
procedure TForm1.btnSelectClick(Sender: TObject);
begin
if fmSelect = nil then
begin
Application.CreateForm(TfmSelect, fmSelect);
fmSelect.Callback := Yahoo;
end;
fmSelect.Show;
end;
procedure TForm1.Yahoo(ASelectedItem: String);
begin
ShowMessage(ASelectedItem);
end;
fmSelect
中的应该是您的消息和带有选项的按钮(例如,是,否,可能是,今天不是)。
以fmSelect
形式,您应声明PUBLIC变量Callback: TCallback;
用户按下某个按钮后,您应该调用此功能并关闭表单:
procedure TfmSelect.btnSelectClick(Sender: TObject);
begin
if Assigned(Callback) then
Callback('user press button XXX');
Close;
end;
TCallback只是返回String类型的常规函数(可以将其更改为Integer)。
TCallback = procedure (ASelected: String) of object;
Ad-Hoc解决方案#2
首先模拟,但使用隐藏的TComboBox。在组合框中,项目将被存储所有选项,例如&#34;是&#34;,&#34;否&#34;,&#34;可能明天&#34;。 ComboBox关闭OnClosePopup
事件后,您将获得用户选择的价值。
所以在你的情况下将是
private
procedure FCloseDialogProc(const AResult: TModalResult);
procedure TForm1.Button1Click(Sender: TObject);
begin
MessageDlg('Want something', TMsgDlgType.mtWarning, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0, FCloseDialogProc);
end;
procedure TForm1.FCloseDialogProc(const AResult: TModalResult);
begin
Label1.Text := IntToStr(AResult);
// -1 -- click outside
// 6 -- yes
// 7 -- no
end;