如何确认在Delphi FMX And​​roid中删除记录

时间:2016-04-20 17:05:19

标签: android delphi firemonkey

通常在使用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将引起用户的注意,但事件处理程序代码将继续并允许记录被删除。

解决方案是什么?

1 个答案:

答案 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事件后,您将获得用户选择的价值。

enter image description here

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;