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

Tipy a triky v Delphi, díl 129. - Easter Eggs

Jan Šindelář - 10.3.2004

Nejprve přeci jen malý úvod. Tzv. Easter Eggs jsou na první pohled skryté "funkce" běžné aplikace, které jsou aktivovány obvykle určitou speciální klávesovou kombinací, kliknutím myší na určité místo formuláře za současného stisku určité klávesy, uchopení nějakého objektu formuláře a jeho přetažení myší na jiné místo a podobně. Variant a různých kombinací je obvykle celá řada a stává se často sportem a koníčkem uživatelů odhalovat tato skrytá překvapení v aplikacích. Za jejich námahu se jim dostane odměny v podobě nějaké jednoduché animace, fotografie vývojářského týmu, jednoduché hry a podobně. Easter Eggs nejsou jen úletem nějakých amatérských nadšenců, ale najdeme je prakticky ve všech "seriózních" aplikacích i v operačním systému samotném.

Naším dnešním úkolem je vytvořit si vlastní jednoduchý "easter egg", resp. dva. Nebude nás teď zajímat samotná spuštěná funkce, to již nechám na vaší fantazii, ale mechanismus spuštění. V prvním případě to bude klasická klávesová kombinace a jako druhá přijde na řadu myš.

Stačit nám bude prázdný formulář a jeho události. V ostré aplikaci pak můžeme použít postup například na dialog "O aplikaci". Budeme tedy v události OnKeyDown postupně odchytávat jednotlivé stisknuté klávesy. Pokud budou dohromady odpovídat našemu spouštěcímu heslu, spustíme náš "easter egg". V našem příkladu však pouze jednoduchý dialog. Budeme potřebovat jen dvě konstanty a jednu globální proměnnou. Konstanty obsahují klíčovou frázi (v naší ukázce je to slovo "DELPHI") a pomocná proměnná slouží k počítání úspěšně vložených znaků z našeho hesla. Navíc je pro oživení během psaní nutné držet stisknutou klávesu CTRL.

Druhý příklad je ještě jednodušší. Funkce je aktivována po kliknutí myší na určité "tajné" místo formuláře prostřednictvím události OnMouseDown. Buď to může být oblast, ohraničená nějakým geometrickým tvarem a nebo můžeme být velmi zlomyslní a uživatel musí kliknout přímo na konkrétní bod na formuláři, což není právě snadné ani v případě, že víme kam. V našem druhém příkladu tedy necháme uživatele klikat na levý horní roh plochy formuláře (obě souřadnice nulové).

unit Unit1;

interface

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

const
  Egg = `DELPHI`;
  EggLen = Length(Egg);

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
    i: integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Keypreview := True;
  i := 1;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if ssCtrl in Shift then
    if Key = Ord(Egg[i]) then
      if i = EggLen then
        begin
          ShowMessage(`Easter Egg #1`);
          i := 1;
        end
      else i := i + 1
    else i := 1;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var Egg2: TPoint;
begin
  Egg2.x := 0;
  Egg2.y := 0;
  if (X = Egg2.x) and (Y = Egg2.y) then ShowMessage(`Easter Egg #2`);
end;

end.

Na závěr si povíme o několika skrytých "Easter eggs" v Delphi 7. Vyvolejte si přes položku Help v hlavní nabídce okno "About...". Nyní stiskněte klávesu ALT a napište "DEVELOPERS". Zobrazí se okno s běžícími titulky ve stylu Hvězdných válek se seznamem vývojářů. Podobný seznam, tentokrát všech zaměstnanců podílejících se nějakým způsobem na Delphi, získáte pomocí stejného postupu a fráze "TEAM". A pokud nemáte titulků dost, zkuste ještě "QUALITY" nebo "JEDI". Poslední dnešní skrytý vtípek se týká startu Delphi. Pokud během startu budete držet klávesovou kombinaci CTRL+SHIFT, může se (náhodně) zobrazit místo obvyklého startovacího loga velká skupinová fotografie týmu vývojářů Delphi.