Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi FireMonkey中带有自定义按钮标题的MessageDlg_Delphi_Firemonkey_Delphi Xe4 - Fatal编程技术网

Delphi FireMonkey中带有自定义按钮标题的MessageDlg

Delphi FireMonkey中带有自定义按钮标题的MessageDlg,delphi,firemonkey,delphi-xe4,Delphi,Firemonkey,Delphi Xe4,使用VCL,您可以使用 随着FMXCreateMessageDialog似乎不再存在(从XE3开始) 除了从头开始重建消息对话框外,是否有其他方法可以使用FireMonkey自定义按钮标题 我希望能够将函数调用为: 简而言之,没有。您没有访问实际对话框的权限,就像在VCL中一样。正如DadisX在评论中所说,您只能更改资源字符串值,但不能触摸对话框本身 然而,尽管如此,FMX使用一个平台抽象层来处理实际的对话框,您可以稍微调整一下。在每个受支持的平台上,FMX都有一个类,该类实现了FMX的接口,

使用VCL,您可以使用

随着FMX
CreateMessageDialog
似乎不再存在(从XE3开始)

除了从头开始重建消息对话框外,是否有其他方法可以使用FireMonkey自定义按钮标题

我希望能够将函数调用为:


简而言之,没有。您没有访问实际对话框的权限,就像在VCL中一样。正如DadisX在评论中所说,您只能更改资源字符串值,但不能触摸对话框本身

然而,尽管如此,FMX使用一个平台抽象层来处理实际的对话框,您可以稍微调整一下。在每个受支持的平台上,FMX都有一个类,该类实现了FMX的接口,以提供适合平台的对话框。您可以编写自己的类来实现
IFMXDialogService
,并重写其方法(以及其他方法),以便对自己的自定义对话框执行任何操作。然后,您可以使用注销
IFMXDialogService
的默认类,并使用注册您的类

有关更多详细信息,请参阅Embarcadero的文档:

我找到了FireMonkey的一个端口。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;

我认为这是一个坏主意,但你可以在FMX.Consts中编辑并更改那些标签,这似乎还没有在Android上测试过。来自:“FireMonkey支持[…]用于真正的跨平台和跨编译器使用[…]。TaskDialog显示将在Windows Vista+上原生,并在所有其他平台上模拟-Windows、Linux和OSX测试。”
/// 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;