如何确认删除 Delphi FMX Android 中的记录
How to confirm delete of a record in Delphi FMX Android
通常在 Delphi VCL 应用程序中使用 TDataset 后代作为数据存储(例如 TClientDataset),在 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 将引起用户的注意,但事件处理程序代码将继续并允许删除记录。
有什么解决办法?
因为模态 window 和消息框目前在 FMX for Android 中不支持,你应该使用某种“dog-nail”解决方案
临时解决方案 #1, .
在主窗体或应打开 Modal 的窗体中 window 编写如下代码:
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 只是常规函数,return String 类型(您可以将其更改为 Integer)。
TCallback = procedure (ASelected: String) of object;
临时解决方案 #2
首先模拟,但使用隐藏的 TComboBox。在组合框中项目将存储所有选项,如“是”、“否”、“也许明天”。 ComboBox 关闭后 OnClosePopup
事件,您将获得用户选择的价值。
3。看一下它是如何在 Embarcadero 样本(来自 XE8)的某处完成的:
所以在你的情况下会是
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;
通常在 Delphi VCL 应用程序中使用 TDataset 后代作为数据存储(例如 TClientDataset),在 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 将引起用户的注意,但事件处理程序代码将继续并允许删除记录。
有什么解决办法?
因为模态 window 和消息框目前在 FMX for Android 中不支持,你应该使用某种“dog-nail”解决方案
临时解决方案 #1, .
在主窗体或应打开 Modal 的窗体中 window 编写如下代码:
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 只是常规函数,return String 类型(您可以将其更改为 Integer)。
TCallback = procedure (ASelected: String) of object;
临时解决方案 #2
首先模拟,但使用隐藏的 TComboBox。在组合框中项目将存储所有选项,如“是”、“否”、“也许明天”。 ComboBox 关闭后 OnClosePopup
事件,您将获得用户选择的价值。
3。看一下它是如何在 Embarcadero 样本(来自 XE8)的某处完成的:
所以在你的情况下会是
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;