如何确认删除 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)的某处完成的:

http://docwiki.embarcadero.com/RADStudio/XE8/en/Mobile_Tutorial:_Using_FireDAC_and_SQLite_%28iOS_and_Android%29

所以在你的情况下会是

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;