Home » Tipps & Tricks » Applikation » Dialoge » Eigenen Message-Dialog erschaffen

Eigenen Message-Dialog erschaffen

Im folgenden Artikel wird erklärt, wie man einen Message-Dialog erschafft, der sein Icon aus einer Ressource bezieht.
In der Win-Api gibt es dazu folgende Funktion:

BOOL API MessageBoxIndirect(LPMSGBOXPARAMS lpMsgBoxParams);

Die Struktur lpMsgBoxParams ist wie folgt aufgebaut:

typedef struct { 
  UINT      cbSize; 
  HWND      hwndOwner; 
  HINSTANCE hInstance; 
  LPCSTR    lpszText; 
  LPCSTR    lpszCaption; 
  DWORD     dwStyle; 
  LPCSTR    lpszIcon; 
  DWORD     dwContextHelpId; 
  MSGBOXCALLBACK lpfnMsgBoxCallback; 
  DWORD     dwLanguageId; 
}

Der Variable lpszIcon kann an der Stelle der Name der Ressource übergeben werden. Gefasst in eine Funktion sieht der Aufruf so aus:

uses
  Windows;

function ShowMessageDlgEx(const AText, ACaption: string;
  const ResID: Integer; Style: Cardinal = MB_OK): Cardinal;
var
  lpMsgBoxParams : MsgBoxParams;
begin
  with lpMsgBoxParams do
  begin
    cbSize             := SizeOf(lpMsgBoxParams);
    hwndOwner          := Application.Handle;
    hInstance          := SysInit.hInstance;
    lpszText           := PChar(AText);
    lpszCaption        := PChar(ACaption);
    dwStyle            := MB_USERICON or MB_TOPMOST or Style;
    lpszIcon           := MAKEINTRESOURCE(ResID);
    dwContextHelpID    := 0;
    lpfnMsgBoxCallback := nil;
    dwLanguageId       := LANG_ENGLISH;
  end;

  Result := Cardinal(MessageBoxIndirect(lpMsgBoxParams));
end;

Der Procedure müssen mindestens drei Parameter übergeben werden. Dies sind Meldungstext, Titel und der Name der Ressource:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessageDlgEx('Hallo Welt', 'Information', 101);
end;

Voraussetzung für diese Procedure ist, dass man ein Icon namens ‚101‘ mit in die Ressourcendatei des Projektes einbindet. Das Icon des Symbols ist auf 32×32 Pixel beschränkt.
Der vierte Parameter ist optional. Damit kann gesteuert werden, welche Buttons im Meldungsfenster erscheinen sollen. Die Funktion gibt dann zurück, auf welchen Button der Anwender geklickt hat:

if ShowMessageDlgEx('Hallo Welt, alles klar?', 'Information', 101, MB_YESNO) = IDYES then
  ShowMessageDlgEx('Gut so!', 'Information', 101);
else
  ShowMessageDlgEx(':(', 'Information', 101);
end;

Mögliche Rückgabewerte finden sich im PSDK unter dem Stichwort MessageBoxIndirect.
In älteren Delphi-Versionen funktioniert der Typkonvert nach PChar nicht so komfortabel, wie es oben gemacht wurde. Den entsprechenden Strings muss zunächst ein abschließendes #0 angehängt werden. Die Konvertierung sieht dann wie folgt aus:

lpszCaption := @aCaption[1];

Man kann das Aussehen der Message-Box auch noch weiter beeinflussen. Zuständig dafür ist die Variable dwStyle. Die Informationen findet man im PSDK unter dem Stichwort MessageBoxEx.
Beispiel:

dwStyle:= MB_OKCANCEL or MB_ICONQUESTION or MB_TOPMOST;

Der Dialog wird nun mit zwei Buttons (OK und Cancel), einem Fragezeichen als Icon und im Vordergrund (TopMost) angezeigt.
Ist man nicht auf ein eigenes Icon angewiesen, kann man auch direkt die MessageBoxEx-Funktion verwenden. Sie befindet sich ebenfalls in der Unit Windows.