Delphi berlin ShowMessage的改进与使用

时间:2021-07-30 06:35:41

这个版本的delphi对ShowMessage进行了重新实现,更好的适应移动跨平台,即在移动平台下是异步执行的,而在Windows及os X下是同步执行的,如果自己控制是否异步显示对话框,也可以通过TDialogServiceAsync(异步对话框)及TDialogServiceSync(同步对话框)来显示对话框,如果使用这个两个类,需要手工uses对应的单元。当然了,最简捷的方法还是ShowMessage.下面我直接上了代码并对三种使用方法做了注释,分享之。

 

unit Unit2;

 

interface

 

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FireDAC.Stan.Intf,
  FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
  FireDAC.Phys.Intf, FireDAC.DApt.Intf, Data.DB, FireDAC.Comp.DataSet,
  FireDAC.Comp.Client, System.Rtti, FMX.Grid.Style, Data.Bind.EngExt,
  Fmx.Bind.DBEngExt, Fmx.Bind.Grid, System.Bindings.Outputs, Fmx.Bind.Editors,
  Data.Bind.Components, Data.Bind.Grid, Data.Bind.DBScope, FMX.ScrollBox,
  FMX.Grid,FMX.DialogService.Async;

 

//  FMX.Grid,FMX.DialogService.Async实现异步对话框的单元,需要手工加入.

 

 

type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure ShowMessageDialogCallBack(Sender: TObject; const AResult: TModalResult);
  end;

 

var    //
  Form2: TForm2;

 

implementation

 

{$R *.fmx}

 

procedure TForm2.Button1Click(Sender: TObject);
begin
//在移动平台下异步执行,在windows,osx上同步执行,查看源码,会发现具体实现中判断了是否是android
//与ios,是的话,通过TDialogServiceAsnyc这个类来显示异步对话框
  ShowMessage(‘Hello world.‘);
//如果要在Windows及os X上也异步显示对话框,则需要直接用TDialogServiceAsnyc来显示
//  TDialogServiceAsync.ShowMessage(‘Hello world async.‘);
end;

 

procedure TForm2.Button2Click(Sender: TObject);
begin
//直接显示异步对话框,并通过匿名函数实现回调,当用户点击确定按钮时,执行该匿名函数
//在所有平台下测试的结果,都是异步执行的,换句话说,,在Windows及osX上也不是模态显示。
  TDialogServiceAsync.ShowMessage(‘Hello world‘,
  procedure (const AResule:TModalResult)
  begin
    ShowMessage(‘Click ok‘);
  end
  );
end;

 

procedure TForm2.Button3Click(Sender: TObject);
begin
//通过回调事先写好的事件函数,来异步显示对话框,即当用户按下确定按钮时,执行
//ShowMessageDialogCallBack.
//在所有平台下测试的结果,都是异步执行的,换句话说,在Windows及osX上也不是模态显示。
  TDialogServiceAsync.ShowMessage(‘Test‘,ShowMessageDialogCallBack,nil);
end;

 

procedure TForm2.ShowMessageDialogCallBack(Sender: TObject;
  const AResult: TModalResult);
begin
  showMessage(‘Call Back.‘);
end;

 

end.

 

后记,进一步看了MessageDialog的实现,基本同TDialogServiceAsync.ShowMessage,只不过,可以指定显示几个按钮,象Yes,No,Cancel等,官方内部实现的代码,看起来很啰嗦,一点都不好看。试着调用这个方法,写起来也不爽,同时在IOS模拟器,osX,Windows下运行,按钮都是英文的,没找到哪里个性成中文,这就不完美了,总不能让中文app显示出一个带Yes No的对话框吧,不论不类的。

 

怎么办呢?难怪当我说Showmessage这个实现完美的时候,高老师说不完美,还真是如此,如果想完美,还是用高师的通用界面好了!

 

再后记:

找到解决方法,把fmx.consts复制到项目下,修改其中的信息为汉字即可。

 

Delphi berlin ShowMessage的改进与使用