// Hiermit kann man Message-Dialoge erstellen, die 1 bis 9 Buttons mit eigener
// Beschriftung aufweisen, eine eigene Formatierung des Dialog-Textes haben und
// ein eigenes Icon zeigen. Der Dialog wird an der Position X, Y angezeigt,
// es sei denn, man setzt eine dieser beiden Variablen auf "Maxint", dann
// erscheint der Dialog in der Bildschirmmitte. Über die Variable "Defbtn"
// wird gesteuert, welcher Button beim Erscheinen des Dialoges den Focus hat.
// Die Variable "Esc" legt fest, ob und welcher Button den Dialog cancelt.
// Hat sie den Wert Null oder einen Wert, der größer als die Button-Anzahl ist,
// kann der Dialog nicht über die Taste ESC geschlossen werden. Mit der Variablen
// "Signal" kann man festlegen, ob beim Erscheinen des Dialoges ein Beep-Ton
// zu hören ist. Die Rückmeldung der Funktion ist ein Integer-Wert, der den
// gedrückten Button representiert. Ist der Rückgabewert 1, dann wurde der erste
// Button von links betätigt, bei 2 war es der zweite von links usw. Wird der
// Dialog über den Button "Schließen" (Kreuz) des Fensters oder mit Alt+F4
// geschlossen, wird 0 zurückgegeben.

// Getestet mit D4 unter XP

function MyDLG(x, y: integer; caption, Text: string; TextColor: TColor; 
  TextStyle: TFontStyles; Buttons: array of string; Ico: TIcon; 
  defbtn, esc: byte; Signal: boolean): integer; 
var 
  MsgDlg: TForm; 
  MsgText: TLabel; 
  MsgIcon: TImage; 
  z, i, k, bl, abstand: integer; 
  b: TMsgDlgButtons; 
  dc: HDC; 
  cnv: TCanvas; 
begin 
  abstand := 7; 
  z := high(buttons); 
  if z > 8 then 
    z := 8; 
  if (defbtn < 1) or (defbtn > z + 1) then 
    defbtn := 1; 
  if z < 0 then 
    b := [mbYes] 
  else 
    b := []; 
  for i := 0 to z do 
  begin 
    if i > 2 then 
      k := i + 1 
    else 
      k := i; 
    b := b + [TMsgDlgBtn(k)]; 
  end; 
  MsgDlg := CreateMessageDialog(text, mtConfirmation, b); 
  bl := abstand; 
  dc := GetDC(MsgDlg.handle); 
  cnv := TCanvas.create; 
  cnv.handle := dc; 
  if z < 0 then 
    TButton(MsgDlg.components[2]).caption := '&OK' 
  else 
    for i := 0 to z do begin 
      with TButton(MsgDlg.components[i + 2]) do begin 
        caption := buttons[i]; 
        width := cnv.Textwidth(caption) + 10; 
        left := bl; 
        inc(bl, width + abstand); 
      end; 
    end; 
  cnv.free; 
  ReleaseDC(MsgDlg.handle, dc); 
  MsgDlg.clientwidth := bl; 
  MsgDlg.Caption := caption; 
  MsgText := TLabel(MsgDlg.FindComponent('Message')); 
  with MsgText do begin 
    Font.Color := TextColor; 
    Font.Style := TextStyle; 
    width := bl - ico.width - 3 * abstand; 
    left := abstand * 2 + ico.width; 
  end; 
  MsgIcon := TImage(MsgDlg.FindComponent('Image')); 
  MsgIcon.Picture.Icon := Ico; 
  MsgIcon.left := abstand; 
  for i := 2 to MsgDlg.ComponentCount - 1 do 
    TButton(MsgDlg.components[i]).Cancel := i = esc + 1; 
  if (x < maxint) and (y < maxint) then 
    MsgDlg.setbounds(x, y, MsgDlg.width, MsgDlg.height); 
  for i := 0 to z - 1 do 
  begin 
    k := defbtn + i + 1; 
    if k > z + 2 then 
      k := k - z - 1; 
    TButton(MsgDlg.components[k]).TabOrder := i; 
  end; 
  if signal then 
    Beep; 
  MsgDlg.showmodal; 
  k := MsgDlg.ModalResult; 
  case k of 
    1: result := 3; 
    3, 4, 5: result := k + 1; 
    6, 7: result := k - 5; 
    8, 9, 10: result := k - 1; 
  else 
    result := 0; 
  end; 
  MsgIcon.free; 
  MsgText.free; 
  MsgDlg.free; 
end;
// 2 Beispielaufrufe 
 
procedure TForm1.Button2Click(Sender: TObject); 
var 
  ic: TIcon; 
  m: integer; 
begin 
  ic := TIcon.create; 
  ic.handle := ExtractIcon(hinstance, 'c:\windows\system32\shell32.dll', 9); 
  m := MyDlg(maxint, 0, 'DLG - Selbstgemacht', 'Button anklicken, aber flott!', 
    clgreen, [], ['Button&1', 'Button&2', 'Button&3'], ic, 0, 0, true); 
  case m of 
    1: showmessage('Button1 wurde gedrückt.'); 
    2: showmessage('Button2 wurde gedrückt.'); 
    3: showmessage('Button3 wurde gedrückt.'); 
  else 
    showmessage('Abgebrochen'); 
  end; 
  ic.free; 
end; 
 
procedure TForm1.Button3Click(Sender: TObject); 
begin 
  case MyDlg(100, 50, 'DLG mit ESC', 'Klicken Sie auf eine Taste!', 
    clRed, [fsBold], ['&Wow', '&Cancel', '&Test', '&Ups'], 
    Application.icon, 4, 2, false) of 
    0, 2: showmessage('Abgebrochen'); 
    1: showmessage('Wow wurde gedrückt.'); 
    3: showmessage('Test wurde gedrückt.'); 
  end; 
end; 


Zugriffe seit 6.9.2001 auf Delphi-Ecke