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

Tipy a triky v Delphi, díl 113. - zrychlujeme zobrazení aplikace

Jan Šindelář - 22.10.2003

Zabývat se budeme událostmi OnCreate a OnShow a nejprve si na začátku nastíníme, v čem je vlastně s těmito událostmi problém. Těchto událostí se využívá často pro ten případ, kdy je potřeba provést nějakou činnost ihned po spuštění aplikace či vykreslení nějakého konkrétního formuláře. Problém nastane, když tato činnost (obvykle nějaké základní inicializační procedury celé aplikace či formuláře) přeci jen zabere nějaký ten čas. Nemusí to být mnoho, stačí jen dvě tři sekundy, ale i to může způsobit chvilkové "zamrznutí" aplikace (ponechme teď stranou možnost vložit kód do samostatného procesu), které je ale v případě umístění kódu do události OnCreate či OnShow navíc doprovázeno tím efektem, že formulář bude (resp. nebude) vykreslován v průběhu vykonávání onoho kódu. V konečném důsledku to pak způsobí, že formulář bude zobrazen až poté, co bude kód vykonán a do té doby vlastně nebude nic vidět. Obzvláště při spouštění aplikace to může vypadat velmi podivně a může to být pro uživatele matoucí. Toto je ovšem je jeden z možných problémů, třeba vás napadnou i další případné komplikace.

Jak z toho tedy ven? Vytvoříme si pro náš formulář dvě nové události AfterShow a AfterCreate. Již jejich název napovídá, kdy budou vyvolány. Tyto dvě nové události pak problém alespoň částečně vyřeší, což si můžete vyzkoušet na dnešním příkladu. Vlastně to nejsou události v pravém slova smyslu, vše je jako obvykle zařízeno pomocí zpráv systému.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

const
  WM_AFTER_SHOW = WM_USER + 300;
  WM_AFTER_CREATE = WM_USER + 301;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;
    procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure Zatez;
var
  dt, dtn: TDateTime;
begin
  dt := Now;
  repeat
    dtn := Now;
  until dtn > (dt + 10 / 3600 / 24);
end;

procedure TForm1.WmAfterShow(var Msg: TMessage);
begin
//Zatez;
end;

procedure TForm1.WmAfterCreate(var Msg: TMessage);
begin
  Zatez;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
end;

end.

Procedura Zatez simuluje jednoduchým cyklem na několik sekund zatížení procesoru a spustíte-li příklad v této podobě, sami uvidíte, že se formulář v pořádku zobrazí. Přesunete-li naopak volání procedury přímo do události OnCreate či OnShow, zobrazí se formulář až po vykonání procedury Zatez.