在前一陣子舉辦的RAD Studio 10.2.2網路發表會中我提到了以前Delphi/C++Builder程式師經常使用的一些對話盒函式都已經被Embarcadero標注為過時棄用了, 例如MessageDlg, InputQuery和ShowMessage等:
function MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const AButtons: TMsgDlgButtons;
const AHelpContext: THelpContext): Integer; overload; inline; deprecated ‘Use FMX.DialogService methods'</b>;
如果您是使用比較新的RAD Studio版本. 那麼您應該開始改用FMX.DialogService程式單元中TDialogService類別的類別方法來取代以前的MessageDlg, InputQuery和ShowMessage等函式.
這是因為現在RAD Studio支援了多個不同的平台, 而不同平台對於對話盒的支援不同, 例如有的平台支援同步和非同步對話盒, 而有的平台只支援同步對話盒. TDialogService類別很方便的統一了不同平台對於對話盒實作的差異. TDialogService類別提供了PreferredMode特性可以讓您指定使用同步或非同步對話盒, 如果您不確定您使用的平台的對話盒模式, 那麼PreferredMode特性值在內定上是使用執行平台模式, 您就不用煩惱了.
TDialogService類別中不但提供了MessageDlg, InputQuery和ShowMessage等類別方法來取代傳統的MessageDlg, InputQuery和ShowMessage等方法, 更有提供進階的功能. 例如在TDialogService類別中提了3種覆載的ShowMessage方法:
class procedure ShowMessage(const AMessage: string); overload;
class procedure ShowMessage(const AMessage: string; const ACloseDialogProc: TInputCloseDialogProc); overload;
class procedure ShowMessage(const AMessage: string; const ACloseDialogEvent: TInputCloseDialogEvent;
const AContext: TObject = nil); overload;
除了取代傳統的ShowMessage方法, 您也可以實作程序或是事件在使用者關閉ShowMessage對話盒時直接觸發您的程序或是事件.例如我們使用如下的一個小範例:
procedure TForm2.btnShowMessageClick(Sender: TObject);
begin
TDialogService.ShowMessage(‘您點選了OK按鈕‘, ShowMessageCloseMethod);
end;
procedure TForm2.ShowMessageCloseMethod(const AResult: TModalResult);
var
alvi : TListViewItem;
begin
alvi := ListView1.Items.Add;
alvi.Text := DateTimeToStr(Now);
alvi.Detail := ‘關閉了ShowMessage對話盒!’;
end;
在呼叫TDialogService.ShowMessage時我們提了一個回叫方法ShowMessageCloseMethod(), 那麼當使用者關閉ShowMessage對話盒時就會自動呼叫ShowMessageCloseMethod()方法:
TDialogService類別提供的對話盒服務可以保證在不同平台使用最適當的方式顯示各種對話盒, 因此請記得從現在開始就使用TDialogService. ShowMessage, TDialogService.MessageDialog和TDialogService. InputQuery等對話盒類別函式吧.