Generic dialog with custom captions for buttons

前端 未结 3 1896
陌清茗
陌清茗 2020-12-30 11:15

I know this issue have been up since before (ex. Best way to show customized message dialogs), but I still don\'t find what I want.

I started like this:



        
相关标签:
3条回答
  • 2020-12-30 11:35

    How about something like this:

    type
      TButtonInfo = record
        MsgDlgBtn: TMsgDlgBtn;
        Caption: string;
      end;
    
    function ButtonInfo(MsgDlgBtn: TMsgDlgBtn; const Caption: string): TButtonInfo;
    begin
      Result.MsgDlgBtn := MsgDlgBtn;
      Result.Caption := Caption;
    end;
    
    const
      ModalResults: array[TMsgDlgBtn] of Integer = (
        mrYes, mrNo, mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll,
        mrYesToAll, 0, mrClose);
    
    function FindDialogButton(Form: TForm; MsgDlgBtn: TMsgDlgBtn): TButton;
    var
      i: Integer;
      Component: TComponent;
    begin
      for i := 0 to Form.ComponentCount-1 do begin
        Component := Form.Components[i];
        if Component is TButton then begin
          if TButton(Component).ModalResult=ModalResults[MsgDlgBtn] then begin
            Result := TButton(Component);
            exit;
          end;
        end;
      end;
      Result := nil;
    end;
    
    function MessageDlg(
      const aMsg: string;
      aDlgType: TMsgDlgType;
      const Buttons: array of TButtonInfo;
      aDefault: TMsgDlgBtn
    ): TModalResult;
    var
      i: Integer;
      MsgDlgButtons: TMsgDlgButtons;
      vDlg: TForm;
    begin
      MsgDlgButtons := [];
      for i := low(Buttons) to high(Buttons) do begin
        Assert(not (Buttons[i].MsgDlgBtn in MsgDlgButtons));//assert uniqueness
        Include(MsgDlgButtons, Buttons[i].MsgDlgBtn);
      end;
      vDlg := CreateMessageDialog(aMsg, aDlgType, MsgDlgButtons, aDefault);
      try
        for i := low(Buttons) to high(Buttons) do begin
          FindDialogButton(vDlg, Buttons[i].MsgDlgBtn).Caption := Buttons[i].Caption;
        end;
        vDlg.Position := poDefaultPosOnly;
        Result := vDlg.ShowModal;
      finally
        vDlg.Free;
      end;
    end;
    
    procedure Test;
    begin
      MessageDlg(
        'Really quit application ?',
        mtWarning,
        [ButtonInfo(mbNo, 'Do&n''t save'), ButtonInfo(mbCancel, '&Cancel'), ButtonInfo(mbYes,'&Save')],
        mbYes
      );
    end;
    

    enter image description here

    0 讨论(0)
  • 2020-12-30 11:45

    I write this code: (I am from Croatia, so the texts are in Croatian)

    function MojDijalog(const Msg, Capt: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons;
      DefaultButton: TMsgDlgBtn): TModalResult;
    var
      dlg : TForm;
    begin
      dlg := CreateMessageDialog(Msg, DlgType, Buttons, DefaultButton) ;
      with dlg do begin
         Caption := Capt;
         FormStyle := fsStayOnTop;
         ( FindComponent( 'OK' ) as TButton ).Caption := 'U redu' ;
         ( FindComponent( 'Cancel' ) as TButton ).Caption := 'Odustani' ;
         ( FindComponent( 'Yes' ) as TButton ).Caption := 'Da' ;
         ( FindComponent( 'No' ) as TButton ).Caption := 'Ne' ;
          ( FindComponent( 'Help' ) as TButton ).Caption := 'Pomoć' ;
         ( FindComponent( 'Close' ) as TButton ).Caption := 'Zatvori' ;
         ( FindComponent( 'Ignore' ) as TButton ).Caption := 'Zanemari' ;
         ( FindComponent( 'Retry' ) as TButton ).Caption := 'Pokušaj ponovo' ;
         ( FindComponent( 'Abort' ) as TButton ).Caption := 'Prekini' ;
         ( FindComponent( 'All' ) as TButton ).Caption := 'Sve' ;
      end;
      Result := dlg.ShowModal;
    end;
    

    Example of use :

    if MojDijalog('Obrisati zapis ?','Upit za brisanje',mtConfirmation,mbYesNo,mbNo) = mrNo then
        begin
             Abort;
        end;
    
    0 讨论(0)
  • 2020-12-30 11:56

    you can use this code:

    function MyMessageDlg(CONST Msg: string; DlgTypt: TmsgDlgType; button: TMsgDlgButtons;
      Caption: ARRAY OF string; dlgcaption: string): Integer;
    var
      aMsgdlg: TForm;
      i: Integer;
      Dlgbutton: Tbutton;
      Captionindex: Integer;
    begin
      aMsgdlg := createMessageDialog(Msg, DlgTypt, button);
      aMsgdlg.Caption := dlgcaption;
      aMsgdlg.BiDiMode := bdRightToLeft;
      Captionindex := 0;
      for i := 0 to aMsgdlg.componentcount - 1 Do
      begin
        if (aMsgdlg.components[i] is Tbutton) then
        Begin
          Dlgbutton := Tbutton(aMsgdlg.components[i]);
          if Captionindex <= High(Caption) then
            Dlgbutton.Caption := Caption[Captionindex];
          inc(Captionindex);
        end;
      end;
      Result := aMsgdlg.Showmodal;
    end;
    

    For example:

    MyMessageDlg('Hello World!', mtInformation, [mbYes, mbNo],
          ['Yessss','Noooo'], 'New MessageDlg Box'):
    
    0 讨论(0)
提交回复
热议问题