带有自定义按钮标题的通用对话框

问题描述 投票:0回答:4

我知道这个问题从以前就已经出现了(例如。显示自定义消息对话框的最佳方式),但我仍然找不到我想要的东西。

我是这样开始的:

class function TAttracsForm.MessageDlg(const aMsg: string; aDlgType: TMsgDlgType; Buttons: TMsgDlgButtons; aCaptions: array of String; aDefault: TMsgDlgBtn): TModalResult;
var
  vDlg: TForm;
  i: Integer; 
begin
  if aButtons.Count = aCaptions.Count then
  begin
    vDlg := CreateMessageDialog(aMsg, aDlgType, Buttons);
    try
      for i := 0 aCaptions.Count - 1 do
        TButton(vDlg.FindComponent(Buttons[i].Caption)).Caption := aCaptions[i]; 

      vDlg.Position := poDefaultPosOnly;
      Result := vDlg.ShowModal;
    finally
      vDlg.Free;
    end;
  end;
end;

调用看起来像:

if (MessageDlg('Really quit application ?', mtWarning, 
       [mbNo, mbCancel, mbYes], {'No save', 'Cancel', 'Save'}) = mrYes) then

但是上面的代码当然不能编译。我不知道如何在循环中获取一组中的一项以及如何在开始时获取它的总数。

delphi dialog customization caption
4个回答
22
投票

您可以使用此代码:

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;

例如:

MyMessageDlg('Hello World!', mtInformation, [mbYes, mbNo],
      ['Yessss','Noooo'], 'New MessageDlg Box'):

8
投票

这样的事情怎么样:

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


3
投票

我写了这段代码:(我来自克罗地亚,所以文本是克罗地亚语)

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;

使用示例:

if MojDijalog('Obrisati zapis ?','Upit za brisanje',mtConfirmation,mbYesNo,mbNo) = mrNo then
    begin
         Abort;
    end;

0
投票

为了跟进我在因尝试将一组按钮与字符串数组匹配而导致的关键错误的已接受答案中的评论,这里是完整的工作版本(因为我的评论几乎没有关于如何实现的线索)。

function MyMessageDlg(const dlgCaption, dlgMessage : string; dlgType : TmsgDlgType;
                      captions : array of string) : integer;
var
  aMsgdlg : TForm;
  i, captionIndex : integer;
  dlgButton : Tbutton;
  buttons : TMsgDlgButtons; //a set, so can't associate with captions array 
begin
  buttons := []; //load this set with mb Buttons, 1 per captions array element
  for i := 0 to High(captions) do //get all the enums up to the number of buttons
    if i <= Ord(High(TMsgDlgBtn)) then //check we haven't blown the set count
      buttons := buttons + [TMsgDlgBtn(i)]; //add the mb Buttons to our set
  aMsgdlg := createMessageDialog(dlgMessage, dlgType, buttons);
  try
    aMsgdlg.Caption := dlgCaption;
    captionIndex := 0;
    for i := 0 to aMsgdlg.ComponentCount-1 do //find our buttons to change labels
    begin
      if aMsgdlg.Components[i] is TButton then
      Begin
        dlgButton := aMsgdlg.Components[i] as TButton;
        dlgButton.caption := captions[captionIndex];
        dlgButton.ModalResult := captionIndex + 1; //override the mrOK etc with our index, +1 as mrNone is 0
        inc(captionIndex);
      end;
    end;
    result := aMsgdlg.ShowModal - 1; //back to zero based index
  finally
    aMsgdlg.free;
  end;
end;

我重命名了变量以使其更加明显,重新排序了参数以匹配典型的对话框调用并且更加符合逻辑。

用途:-

MyMessageDlg('Confirm', 'Yes, No or Maybe?', mtConfirmation, ['Yes','No','Maybe']);

其中,对于

0
,返回值为
Yes
,对于
1
,返回值为
No
,对于
2
,返回值为
Maybe

干杯:)

© www.soinside.com 2019 - 2024. All rights reserved.