Hi,

Currently Lazarus has no CreateMessagedialog function, whereas Delphi has.

function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons): TForm;

This function returns the actual form of the messagedialog, and so
gives the programmer access to all the controls on this dialog form.
In Delphi 3 I used this to access the captions of the buttons and do
an on the fly translation.
Given that we Lazarus can use .po files to translae the
resourcestrings for the captions, this is not necessary anymore.

However, another use of this function is to add controls to the dialog
form, thus creating customized message dialog variants.
One example of this is adding a checkbox with a caption like "Don't
show this dialog again", which is quit useful.
(See 
http://i25.photobucket.com/albums/c74/Talent111/devel/messagedlg_with_checkbox.png
for an example of this)

A long time ago I posted bugreport #0008186 on Mantis (Feature
request: make it possible to add controls to MessageDlg()).
At that time I was new to Lazarus, and saw no opportunity to
accomplish the task myself.

Lately however, browsing dialogs.pp (more specifically
promptdialog.inc), I noticed that most of the work was already done.

So my proposal is like this:

Declare CreateMessageDialog in the interface of  dialogs.pp.
Adjust promptdialog.inc more or less like this:

function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType;
                             Buttons: TMsgDlgButtons): TForm;
var PDlg: TPromptDialog;
    aCaption: String;
    Btns: PLongInt;
    CancelValue, DefaultIndex, ButtonCount: Longint;
    UseDefButton: Boolean; DefButton: TMsgDlgBtn;
begin
  if DlgType <> mtCustom then
    aCaption := MsgDlgCaptions[DlgType]
  else
    aCaption := Application.Title;
  UseDefButton := False;
  Btns := GetPromptUserButtons(Buttons, CancelValue, DefaultIndex, ButtonCount,
                               UseDefButton, DefButton);
  DebugLn('CancelValue = ',ModalResToStr(CancelValue));
  PDlg := TPromptDialog.CreateMessageDialog(aCaption, Msg,
DialogIds[DlgType], Btns, ButtonCount, DefaultIndex);
  Result := TForm(PDlg);

  //??? Is this save to do????
  ReallocMem(Btns, 0);
end;

A tipical use of this function would the be like:

procedure TForm1.ShowBtnClick(Sender: TObject);
var Dlg: TForm;
    Res: TModalResult;
    DT: TMsgDlgType;
    Title,Msg: String;
    Btns: TMsgDlgButtons;
    i: Integer;
begin
  Title := TitleEdit.Text;
  Msg := MsgMemo.Text;
  case DTGroup.ItemIndex of
    0: DT := mtCustom;
    1: DT := mtError;
    2: DT := mtWarning;
    3: DT := mtInformation;
    4: DT := mtConfirmation;
  end;
  Btns := [mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,
           mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose];
  Dlg := CreateMessageDialog(Msg,DT, Btns);

  ...
  DoSomethingWithTheDialogForm; //Add a checkbox for example
  ...

  try
    Res := Dlg.ShowModal;
  Finally
    Dlg.Free;
  end;
end;

Users should be aware that a Modalresult of -1 means that the Escape
key was pressed.


I'd really appreciate your suggestions and ideas on this one,
especially on the "Is this safe to do" remark in my code.

Bart
_______________________________________________
Lazarus mailing list
Lazarus@lazarus.freepascal.org
http://www.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to