Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 151. - základní informace o formuláři

Jan Šindelář 11.8.2004

Dnešní díl bude opět zaměřen více na začátečníky a povíme si několik základních věcí o formuláři, o jeho parametrech a jak je můžeme ovlivnit, když Object Inspector nám tyto skryté možnosti nenabízí.

Nejprve něco málo teorie. Prakticky všechny vizuální objekty, ze kterých je uživatelské prostředí vytvořeno, jsou ve své podstatě okna. Jsou to objekty, které jsou odvozeny od TWinControl, což je základní (rodičovská) třída pro všechny "okenní" prvky. Tedy nejen samotný formulář, ale i tlačítka, editboxy, radiobuttony a další objekty jsou vlastně okna.

Když Delphi tyto objekty vytvářejí, volají API funkci CreateWindowEx, která příslušný objekt vytvoří. Ještě předtím je ale volána metoda CreateParams, která "připraví" parametry budoucího okna. Jestliže se nám podaří tuto metodu vzít do vlastních rukou a připravit si parametry budoucího okna sami, máme vyhráno a můžeme si nastavit takové vlastnosti, které nám Object Inspector nastavit neumožňuje. Jak uvidíte za chvilku, toto "převzetí kontroly" je velmi snadné.

Příslušné parametry metody CreateParams jsou uloženy v proměnné typu TCreateParams (ano, opravdu se metoda i struktura jmenují stejně), což je obyčejný record, který má následující strukturu (k nalezení v nápovědě Delphi):

type
  TCreateParams = record
    Caption: PChar;
    Style: DWORD;
    ExStyle: DWORD;
    X, Y: Integer;
    Width, Height: Integer;
    WndParent: HWND;
    Param: Pointer
    WindowClass: TWndClass;
    WinClassName: array[0..63] of Char;
  end;

Podrobný popis je k nalezení ve zmiňované nápovědě, ale podle názvů jednotlivých vlastností je zřejmé, k čemu slouží. Mnoho z nich, jako například titulek okna, rozměry, pozici a další, lze nastavit běžným způsobem v Object Inspectoru. Některých zajímavějších efektů lze ale docílit především nastavením parametru ExStyle.

Než si ukážeme některé konkrétní příklady, musíme si připravit novou aplikaci a postarat se o metodu CreateParams. Vytvořte nový projekt a na hlavní formulář umístěte tlačítko. Pro demonstraci funkcí budeme totiž potřebovat ještě jeden podřízený formulář a tímto tlačítkem jej budeme vyvolávat. Událost OnClick tohoto tlačítka tedy může vypadat například takto:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;

Když máme aplikaci připravenou (včetně druhého formuláře), je čas na metodu CreateParams. Budeme se zabývat vlastnostmi druhého (podřízeného) formuláře, takže následující kód přidejte právě do jeho unitu. Nejprve přidáme jeden řádek do deklarace samotného formuláře a pak do implementační části přidáme vlastní proceduru CreateParams. Kód tedy může vypadat nějak takto:

...
type
  TForm2 = class(TForm)
  procedure CreateParams(var Params: TCreateParams); override;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
...

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
end;

To je vše. Tím máme tvorbu druhého formuláře pevně v rukou a můžeme přejít na úpravy příslušných parametrů.

Nejprve si ukážeme, jak zařídit, aby každý podřízený formulář měl vlastní tlačítko na hlavním panelu. Toho docílíme přidáním hodnoty WS_EX_APPWINDOW k parametru ExStyle. Zároveň zařídíme, aby se okno druhého formuláře chovalo zcela nezávisle na okně hlavním (tj. aby se obě okna minimalizovala a obnovovala nezávisle na druhém). Uděláme to tak, že jako rodičovské okno pro druhý formulář nastavíme místo hlavního formuláře okno desktopu. Nový kód tedy vypadá takto:

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
    begin
      ExStyle := ExStyle or WS_EX_APPWINDOW;
      WndParent := GetDesktopwindow;
    end;
end;

Velmi jednoduchým způsobem můžeme i zapnout příznak "vždy navrchu". Opět úpravou parametru ExStyle:

ExStyle := ExStyle or WS_EX_TOPMOST;

Zobrazení tlustého okraje okna jako u hlavního okna MDI aplikace docílíme opět snadno:

ExStyle := ExStyle OR WS_EX_OVERLAPPEDWINDOW;

Průhlednost okna zajistí toto nastavení:

ExStyle := ExStyle OR WS_EX_TRANSPARENT;

Zde je ovšem ještě dát pozor na překreslování, protože jinak bude místo obsahu okna vykreslováno to, co ho naposledy překrývalo (jakási zbytková stopa).

Všechny tyto hodnoty nastavení parametru ExStyle lze samozřejmě libovolně kombinovat. V ukázkovém projektu, který si opět můžete stáhnout na konci článku, jsou jednotlivé řádky označeny jako komentáře, aby se všechno nemíchalo dohromady.

Je pravda, že mnoho nastavení lze zařídit jednoduše přes Object Inspector, ale i dnešní postup má své výhody (třeba při tvorbě vlastních komponent). To ale není všechno. Na začátku jsme si říkali, že prakticky každý prvek uživatelského prostředí je ve své podstatě okno. Proto třeba i pro tlačítko lze provádět některá nastavení, která nelze v Object Inspectoru provést. Berte proto tento článek jako jakýsi námět pro další zkoumání a zkuste se podívat například na MSDN.

Dnešní ukázkový projekt stahujte zde.