Reputation: 1623
Is there a Firemonkey equivalent for Windows' MessageBox(), i.e. where the dialog's caption/title can be set? I know I can make one myself but prefer to use an existing solution, but I can't seem to find it.
Upvotes: 1
Views: 9103
Reputation: 21
Another method, that works on all OS, takes almost the same time to write, and is much more flexible : Create a new Form, say with name "fmDialog1", put the Title and Text(s) you want (and possibly some images), and Buttons such as OK, Cancel, Yes, No, etc. Give each button a different value, non zero, to its ModalResult property
Then in the code where the dialog is needed, write (in C++) aa=fmDialog1->ShowModal(); or (in Pascal/Delphi) aa:=fmDialog1.ShowModal(); and test aa to see which button was selected by the user.
In Android apps, you may have to add a loop to overcome the asynchronous character of ShowModal.
Upvotes: 0
Reputation: 5566
Have a look at this answer. Using the Open Source SynTaskDialog for Lazarus and FireMonkey, you can define a custom message box or a message box replacement where the dialog caption can be set.
It does work on Firemonkey in Windows, but I haven't tested it under OSX until now.
Upvotes: 0
Reputation: 849
ok here is my example how I am using NSAlert:
unit DAMessageBox;
interface
uses
System.SysUtils,
System.IOUtils,
FMX.Dialogs,
System.UITypes,
{$IFDEF MSWINDOWS}
Winapi.ShellAPI, Winapi.Windows, Vcl.Forms;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
Macapi.CocoaTypes, Macapi.Foundation, Macapi.AppKit,
Posix.Stdlib;
{$ENDIF POSIX}
type
TDAMessageBox = class
class function MessageDialog(const Title: String; const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint) : integer;
end;
implementation
class function TDAMessageBox.MessageDialog(const Title: String; const Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; HelpCtx: Integer): integer;
var
{$IFDEF MSWINDOWS}
WinButtons : Cardinal;
WinType : Cardinal;
{$ENDIF WINDOWS}
{$IFDEF POSIX}
Alert: NSAlert;
Style: NSAlertStyle;
DlgRes : Integer;
{$ENDIF POSIX}
begin
{$IFDEF MSWINDOWS}
case DlgType of
TMsgDlgType.mtWarning: WinType:= MB_ICONWARNING;
TMsgDlgType.mtError: WinType:= MB_ICONSTOP;
TMsgDlgType.mtInformation: WinType:= MB_ICONINFORMATION;
TMsgDlgType.mtConfirmation: WinType:= MB_ICONQUESTION;
TMsgDlgType.mtCustom: WinType:= MB_ICONINFORMATION;
end;
if Buttons = mbOKCancel then begin
WinButtons:= MB_OKCANCEL;
end;
if Buttons = mbYesNo then begin
WinButtons:= MB_YESNO;
end;
if Buttons = mbYesNoCancel then begin
WinButtons:= MB_YESNOCANCEL;
end;
Result:= MessageBox(Application.Handle, PChar(Msg), PChar(Title), WinType or WinButtons);
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
Alert:= TNSAlert.Create;
//map the configurations:
//mtWarning, mtError, mtInformation, mtConfirmation
case DlgType of
TMsgDlgType.mtWarning: Style:= NSWarningAlertStyle;
TMsgDlgType.mtError: Style:= NSCriticalAlertStyle;
TMsgDlgType.mtInformation: Style:= NSInformationalAlertStyle;
TMsgDlgType.mtConfirmation: Style:= NSInformationalAlertStyle;
TMsgDlgType.mtCustom: Style:= NSInformationalAlertStyle;
end;
try
Alert.setMessageText(NSSTR(Title));
Alert.setInformativeText(NSSTR(Msg));
Alert.setAlertStyle(Style);
//add dialog buttons, note: there are only 3 buttons allowed:
//mbAbortIgnore, mbAbortRetryIgnore, *mbOKCancel,mbYesAllNoAllCancel, mbYesAllNoAllCancel, *mbYesNo, *mbYesNoCancel
//currently I only map the ones I need here
if Buttons = mbOKCancel then begin
//Writeln('mbOKCancel');
Alert.addButtonWithTitle(NSSTR('OK'));
Alert.addButtonWithTitle(NSSTR('Cancel'));
end;
if Buttons = mbYesNo then begin
//Writeln('mbYesNo');
Alert.addButtonWithTitle(NSSTR('Yes'));
Alert.addButtonWithTitle(NSSTR('No'));
end;
if Buttons = mbYesNoCancel then begin
//Writeln('mbYesNoCancel');
Alert.addButtonWithTitle(NSSTR('Yes'));
Alert.addButtonWithTitle(NSSTR('No'));
Alert.addButtonWithTitle(NSSTR('Cancel'));
end;
DlgRes := Alert.runModal;
//map the result to Delphi Consts
//NSAlertFirstButtonReturn = 1000,
//NSAlertSecondButtonReturn = 1001,
//NSAlertThirdButtonReturn = 1002
if Buttons = mbOKCancel then begin
if DlgRes = NSAlertFirstButtonReturn then Result := idYes;
if DlgRes = NSAlertSecondButtonReturn then Result := idNo;
end;
if (Buttons = mbYesNo) or (Buttons = mbYesNoCancel) then begin
if DlgRes = NSAlertFirstButtonReturn then Result := idYes;
if DlgRes = NSAlertSecondButtonReturn then Result := idNo;
if DlgRes = NSAlertThirdButtonReturn then Result := idCancel;
end;
finally
Alert.release;
end;
{$ENDIF POSIX}
end;
end.
The MessagBox call is similar to the MessageDlg call in FireMonkey:
TDAMessageBox.MessageDialog('Title', 'Message Text', TMsgDlgType.mtError, mbYesNoCancel, 0);
The result looks like that:
Upvotes: 2