Home » Tipps & Tricks » Komponenten » TForm » Alternative Formularformen

Alternative Formularformen

Mit Delphi lässt sich fast jede gewünschte Formular-Form erzeugen.Im folgenden Beispiel wird eine runde Region erzeugt:Über CreateEllipticRgn lässt sich eine ellipsenartige Region definieren, welche mit SetWindowRgn schließlich gesetzt und angezeigt wird.

procedure TForm1.FormCreate(Sender: TObject);
begin
  if SetWindowRgn(Handle, CreateEllipticRgn(0, 0, Width, Height), True) = 0 then
    RaiseLastOSError;
end;

RaiseLastOSError ist erst ab Delphi 6 verfügbar. Programmierer, die mit älteren Versionen arbeiten müssen an dieser Stelle RaiseLastWin32Error verwenden.Wenn bei diesem Beispiel etwas fehlschlägt, wird unter Umständen die definierte Region nicht mehr freigegeben. War hingegen die Ausführung erfolgreich, wird die Region wie ein normales Formular verwaltet.Mit einer Fehlerbehandlung sieht der Quelltext so aus:

procedure TForm1.FormCreate(Sender: TObject);
var
  RegionHandle: HRGN;
begin
  RegionHandle := CreateEllipticRgn(0, 0, Width, Height);
  if RegionHandle  0 then
  begin
    try
      if SetWindowRgn(Handle, RegionHandle, True) = 0 then
        RaiseLastOSError;
    except
      DeleteObject(RegionHandle);
      raise;
    end;
  end
  else
    RaiseLastOSError;
end;

Verwendet man statt der Funktion CreateEllipticRgn eine der anderen Region-erzeugenden Funktionen,lassen sich auch andere Formen darstellen:Rechteck (CreateRectRgn), Vieleck (CreatePolygonRgn), Rechtecke mit abgerundeten Ecken (CreateRoundRectRgn) – (Weitere siehe Online Hilfe von Delphi)Ein anderes Beispiel soll zeigen, wie sich durch Kombination der Regions-Funktionen fast jede beliebige Formular-Form darstellen läst.Formular in Form einer Sprechblase:Dazu wird erst ein Rechteck mit abgerundeten Ecken erstellt, welches dann mit einer weiteren Region verbunden wird, um das Sprechblasen-typische Aussehen zu erhalten.

procedure TForm1.FormCreate(Sender: TObject);
var
  FormRegion, BeakRegion: HRGN;
  Beak: array[0..2] of TPoint;
begin
  FormRegion := CreateRoundRectRgn(0, 0, ClientWidth, ClientHeight - 48, 40, 40);
  if (FormRegion = 0) then
    RaiseLastOSError;
  try
    Beak[0] := Point(50, ClientHeight - 50);
    Beak[1] := Point(55, ClientHeight);
    Beak[2] := Point(80, ClientHeight-50);
    BeakRegion := CreatePolygonRgn(Beak, 3, WINDING);
    if (BeakRegion = 0) then
      RaiseLastOSError;
    try
      if CombineRgn(FormRegion, FormRegion, BeakRegion, RGN_OR) = ERROR then
        RaiseLastOSError;
    finally
      DeleteObject(BeakRegion);
    end;
    if SetWindowRgn(Handle, FormRegion, True) = 0 then
      RaiseLastOSError;
  except
    DeleteObject(FormRegion);
    Raise;
  end;
end;

Im OnPaint-Ereignis wird nun ein schwarzer Rahmen um die Sprechblase gezeichnet:

procedure TForm1.FormPaint(Sender: TObject);
var
  TempRgn: HRGN;
begin
  with Canvas.Brush do begin
    Color := clBlack;
    Style := bsSolid;
  end;
  TempRgn := CreateRectRgn(0, 0, 1, 1);
  if (TempRgn = 0) then
    RaiseLastOSError;
  try
    if GetWindowRgn(Handle, TempRgn) = ERROR then
      RaiseLastOSError;
    if not FrameRgn(Canvas.Handle, TempRgn, Canvas.Brush.Handle, 1, 1) then
      RaiseLastOSError;
  finally
    DeleteObject(TempRgn);
    Raise;
  end;
end;

Um unschöne Effekte zu vermeiden, sollte man die Eigenschaft BorderStyle des Formulars auf bsNone setzen.