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

Tipy a triky v Delphi, díl 28. - Vizuální styly Windows XP

Jan Šindelář - 6.2.2002

Vizuální styly Windows XP

Tento díl seriálu bude celý zaměřen na vizuální styly Windows XP a naučíme se, jak na ně v Delphi. Článek je jakési doplnění či rozšíření původního článku, který napsal kolega Radek Chalupa a který jste si mohli přečíst minulý týden. Méně zkušeným programátorům nebo těm, pro které nebyl původní text zcela srozumitelný, je právě určen dnešní díl seriálu tipů a triků. Vynecháme tedy teorii (tu doporučuji přečíst si ve výše zmíněném článku) a vrhneme se rovnou na příklad.

Celý postup se skládá z několika málo jednoduchých kroků – vytvoření souboru manifestu, zakomponování tohoto souboru do resources a přidání těchto resources do naší aplikace.

Začněme tedy pěkně postupně. Nejprve si vytvoříme tzv. manifest, což je obyčejný textový soubor napsaný v XML, obsahující informace o aplikaci a použité verzi knihovny comctl32.dll. Vypadá takto:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    name="CompanyName.ProductName.YourApplication"
    processorArchitecture="x86"
    version="1.0.0.0"
    type="win32"/>
<description>Windows Shell</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

Jedná se o stejný soubor, jaký byl uveden v původním článku. Jediné, co je třeba udělat (i když ani to není nutnou podmínkou, na funkčnosti to nic nemění), je doplnit název aplikace (a autora atd..) a její verzi. Tyto informace vyplňte v první polovině dokumentu. Druhou část, kde je mimo jiné uvedeno číslo verze comctl32.dll (tedy 6.0.0.0), ponechte beze změn.

Dostáváme se ke druhému bodu našeho postupu. Musíme teď vytvořit soubor resources, do něhož začleníme náš manifest. Vytvořte tedy nový textový soubor (například pomocí Poznámkového bloku), který se bude skládat pouze z tohoto jednoho řádku:

1 24 "xp.manifest"

Název, uvedený v uvozovkách, je název souboru manifestu, který jsme si vytvořili před chvílí. Takto vytvořený jednořádkový textový soubor uložte pod názvem xp.rc

Nyní máme již soubor s resources připravený, ale takto by nám byl k ničemu. Je třeba jej nejprve zkompilovat, než jej budeme moci zakomponovat do naší aplikace. K tomu použijeme resource compiler, který je součástí Delphi a naleznete jej v adresáři Delphi\Bin pod názvem brcc32.exe. Nejpřehlednější způsob asi bude ten, že si tento soubor zkopírujete do nového prázdného adresáře, který si pro tento účel vytvoříte. Dále do tohoto adresáře zkopírujete i soubor manifestu (v našem případě xp.manifest) a zdrojový kód resources xp.rc.

Nyní si spusťte příkazový řádek, dostaňte se do našeho adresáře se soubory a zkompilujte resources takto:

C:\Náš adresář>brcc32.exe xp.rc

Výsledkem by mělo být to, že se v našem adresáři objeví zkompilovaný soubor resources pod názvem xp.res. Tím končí veškeré přípravy a nyní již můžeme přikročit k samotné úpravě naší aplikace.

Samotná úprava aplikace již spočívá v pouhém přidání takto vytvořeného a zkompilovaného resource souboru do zdrojového kódu. Nejprve tedy soubor xp.res zkopírujeme do adresáře s naším projektem a poté přidáme do zdrojového kódu (hlavního formuláře) následující direktivu:

{$R XP.RES}

a to pokud možno přímo za řádek obsahující {$R *.DFM}, který by se již ve vaší aplikaci měl nacházet. Zdrojový kód (jeho část) by tedy mohl vypadat nějak takto:

...

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
{$R XP.RES}

...

A to je vlastně vše. Nyní by již měla naše aplikace využívat pod Windows XP nových vizuálních stylů. Pod Windows 9x/NT/2000 se pochopitelně nic nemění.

Ale... všechno má bohužel nějaký ten háček. Jak jste si mohli přečíst i v původním článku, nebudou se tyto změny týkat komponent BitBtn a SpeedBtn, protože nejsou kresleny přímo systémem, ale uživatelsky. To bohužel vede k tomu, že pokud je používáte spolu s ostatními komponentami, které pochopitelně nový vzhled mít budou, nevypadá taková kombinace "starého" a "nového" vzhledu příliš dobře. Nepomůže vám ani nejnovější verze Delphi 6 s opravným balíčkem a budeme si (v Delphi a Borland C++ Builderu) muset počkat, dokud v tomto směru Borland něco nepodnikne (alespoň běžní programátoři, protože řešit tento problém individuálně je příliš pracné).

Naneštěstí to však není jediný problém, který nastává. Další nemilé překvapení (a mnohem závažnějšího charakteru) pro nás přichystala komponenta TListView. Jestliže první nedostatek byl spíše vizuální a na běh aplikace samotné jinak neměl vliv, komponenta TListView může za jistých okolností vyvolat přímo chybu v jádře systému a způsobí okamžitý pád aplikace ("pouze" pod Windows XP). Stane se to tehdy, pokud jako styl zvolíme vsReport a poté nadefinujeme hlavičky (Columns). Bohužel je to jedna z nejpoužívanějších variant této komponenty a o to horší tento problém je. V takovém případě, kdy vaše aplikace tuto komponentu a v této podobě používá, v žádném případě nedoporučuji vizuální styly používat! Tato chyba TListView je natolik vážná, že je až s podivem, že se dosud neobjevila nějaká záplata Borlandu (pokud alespoň vím). Není navíc vyloučeno, že se něco podobného může vyskytnout i u jiných komponent v určitých specifických situacích. Proto je nutné vždy celou aplikaci důkladně otestovat přímo pod Windows XP, než ji budete distribuovat dále. Pouze se spoléhat na to, že to fungovat určitě bude, a testovat pouze na starších verzích Windows by se vám nemuselo vyplatit. Pokud nemáte možnost nikde vaši aplikaci pod Windows XP vyzkoušet, raději se použití vizuálních stylů vzdejte. Sice možná nebude vaše aplikace pod Windows XP vypadat tak "efektně", ale budete mít alespoň zaručenu její funkčnost (tedy alespoň co se vizuální podoby týče). Vždy s příchodem nějaké nové technologie (nechce se mi říci přímo "výmyslu") obsažené v operačním systému nastává určitá přechodná doba programátorských problémů (vždyť Windows XP jsou zde relativně krátkou dobu), takže pokud se chcete těmto problémům vyhnout, počkejte raději, až se vše časem usadí a vyřeší. Možná až s novou verzí Delphi...