使用VCL,您可以使用CreateMessageDialog
to generate a message dialog with custom button captions。
使用FMX CreateMessageDialog
似乎不再存在(因为XE3)。
除了从头开始重建消息对话框之外,有没有办法使用FireMonkey自定义按钮标题?
我希望能够将函数称为described here:
MessageDlg(
'Really quit application ?', mtWarning,
[ButtonInfo(mbNo, 'Do&n''t save'),
ButtonInfo(mbCancel, '&Cancel'),
ButtonInfo(mbYes,'&Save')],
mbYes
);
答案 0 :(得分:5)
简而言之,没有。您无权访问实际对话框,就像在VCL中一样。就像DadisX在评论中所说,你只能改变资源字符串值,但不能触及对话框本身。
然而,据说,FMX使用平台抽象层来处理实际的对话框,你可以稍微调整一下。在每个支持的平台上,FMX都有一个实现FMX IFMXDialogService
接口的类,以提供适合平台的对话框。您可以编写自己的类来实现IFMXDialogService
并覆盖其MessageDialog()
方法(以及其他方法),以使用您自己的自定义对话框执行任何操作。然后,您可以使用TPlatformServices.RemovePlatformService()
取消注册IFMXDialogService
的默认课程,并使用TPlatformServices.AddPlatformService()
注册您的课程。
有关详细信息,请参阅Embarcadero的文档:
答案 1 :(得分:1)
我找到了SynTaskDialog for Lazarus and FireMonkey,这是FireMonkey的SynTaskDialog端口。 SynTaskDialog在较新的Windows版本上本机使用Windows TaskDialog API,并在其他平台上模拟它。
使用这个开源库,我可以定义:
/// returns 100 if first button is pressed, 101 if second button is pressed, ...
function MessageDlgCustom(
const MsgHeader: string; const MsgText: string; const DlgType: TMsgDlgType;
const Buttons: array of string; const DefaultButton: Integer = 0): TModalResult;
var
Task: TTaskDialog;
I: Integer;
DlgIcon: TTaskDialogIcon;
Title: string;
begin
case DlgType of
TMsgDlgType.mtWarning:
begin
DlgIcon := tiWarning;
Title := 'Warning';
end;
TMsgDlgType.mtError:
begin
DlgIcon := tiError;
Title := 'Error';
end;
TMsgDlgType.mtInformation:
begin
DlgIcon := tiInformation;
Title := 'Information';
end;
TMsgDlgType.mtConfirmation:
begin
DlgIcon := tiQuestion;
Title := 'Confirm';
end;
else begin
DlgIcon := tiBlank;
Title := '';
end;
end;
Task.Title := Title;
Task.Inst := MsgHeader;
Task.Content := MsgText;
for I := Low(Buttons) to High(Buttons) do
begin
if I <> Low(Buttons) then
Task.Buttons := Task.Buttons + #13#10;
Task.Buttons := Task.Buttons + Buttons[I];
end;
//see docu: custom buttons will be identified with an ID number starting at 100
Result := Task.Execute([], DefaultButton, [], DlgIcon) - BUTTON_START;
end;
有了这个,你可以打电话:
case MessageDlgCustom('Quit application', 'Really quit application?', mtWarning,
['Save', 'Don''t save', 'Cancel']) of
100: Quit(SAVE_YES);
101: Quit(SAVE_NO);
102: Abort;
end;