2016-04-20 11 views
0

der Regel in einer Delphi-VCL-Anwendung, die eine TDataset Nachkomme als Datenspeicher verwendet (zB TClientDataset), in der Dataset1BeforeDelete Handler tun wir etwas wie folgt aus:Wie zur Bestätigung löschen eines Datensatzes in Delphi FMX Android

procedure TClientModule1.MyCDSBeforeDelete(DataSet: TDataSet); 
begin 
    if MessageDlg('Delete?', mtCOnfirmation, [mbyes, mbNo], 0) <> mrYes then 
    SysUtils.Abort 
end; 

jetzt in einer FMX-Anwendung entwickelt, um auf Android läuft, dies zu:

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; 

Außer, das ist nicht zur Arbeit zu gehen! Das messagedlg wird die Aufmerksamkeit des Benutzers auf sich ziehen, aber der Event-Handler-Code wird fortgesetzt und der Datensatz kann trotzdem gelöscht werden.

Was ist die Lösung?

+0

Ich habe bereits du ein Hinweis. Benutze das Ereignis nicht ... – whosrdaddy

+0

Ich bin ewig dankbar! – nolaspeaker

Antwort

1

Da modale Fenster und Message-Box zur Zeit nicht in FMX unterstützen für Android sollten Sie eine Art von "dog-Nagel" Lösung

Ad-hoc-Lösung # 1 verwenden.

In Haupt-Form oder in Form, die wie Modal Fenster Schreibcode geöffnet werden soll:

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; 

in fmSelect sollten Sie Ihre Nachricht und Buttons mit Optionen sein (wie ja Mai Nein, sein, nicht heute).

in fmSelect Form sollten Sie PUBLIC Variable deklarieren Callback: TCallback;

Sobald Benutzer drücken einige Tasten, können Sie diese Funktion und in der Nähe Form nennen sollen:

procedure TfmSelect.btnSelectClick(Sender: TObject); 
begin 
    if Assigned(Callback) then 
     Callback('user press button XXX'); 

    Close; 
end; 

TCallback nur reguläre Funktion, die String-Typen zurückgeben (Sie könnten ändere es in Integer).

TCallback = procedure (ASelected: String) of object; 

Ad-hoc-Lösung # 2

simulat auf dem ersten, aber mit versteckter TComboBox verwenden. In Combobox-Elementen werden alle Optionen wie "Ja", "Nein", "Vielleicht morgen" gespeichert. Sobald ComboBox OnClosePopup Event geschlossen wurde, erhalten Sie den Wert der Benutzerauswahl.

enter image description here

3. Werfen Sie einen Blick, wie es irgendwo in Embarcadero Proben fertig ist (von XE8):

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

So wird in Ihrem Fall

sein
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; 
+0

Vielen Dank, dass Sie sich die Zeit genommen haben, um kreative Lösungen für das Problem zu finden. – nolaspeaker

Verwandte Themen