Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Delphi
Column ComboBox
delphi_columncombo
6. června 2001, 00.00 | Potřebujete ComboBox s položkami ve více sloupcích ? Nehledejte na internetu komponenty, a vytvořte si jej sami podle tohoto návodu !
Po Color ComboBoxu pro výběr barvy a Font ComboBoxu pro výběr písma tady máme opět další ComboBox, který na žádné základní paletě komponent VCL nenajdete, a musíte si jej tedy udělat sami. Je to Tabbed, nebo spíš Column ComboBox. Česky ComboBox, který má každý řádek ještě rozdělen na určitý počet sloupců.
Tak se do toho dáme.
Efetku rozdělení ComboBoxu na víc sloupců můžeme dosáhnout různými způsoby. Ten starší, ještě z dosu je ten, že použijeme písmo, označované Type Writer (jako z psacího stroje), které je ve windows například Courier New. V dosu to samozřejmě ani jinak nešlo, pokud jsme chtěli několik sloupců, spočítali jsme si délku prvního slova, přidali určitý počet mezer, přidali další slovo a tak pokračovali až do konce. Ve windows však každý používá písma, která mají jednotlivé znaky jinak široké, tudíž nemůžeme přesně říci, kolik místa zabírá například pět znaků. Ovšem řešení není také nijak složité, jednoduše na pozici např. 0,0 napíšeme první slovo, druhé na pozici 50,0, třetí na...
Jenže kde tyto slova získat ? V ComboBoxu máme přeci v každé položce uloženo jen jedno slovo. Určíme si znak, který se běžně nepoužívá a tímto znakem budeme jednotlivé sloupce oddělovat. Například za znak zvolíme | a řetězec o třech sloupcích bude mít tuto podobu - |prvni|druhy|treti|. Nyní si vytvoříme funkci, která nám právě z tohoto řetězce, který bude uložen v Items vrátí požadovaný sloupec. Funkce je vcelku jednoduchá, postupně odřezává části stringu ukončené nastaveným znakem, dokud nedojde k požadovanému sloupci. Potom uřízne i konec, a výsledek vrátí. Parametry jsou tři - řetězec, ve kterém chceme hledat, který sloupec chceme a použitý oddělovač. Celá funkce je zde:
|
Nyní máme již vše potřebné, vytvoříme si nový projekt, na formulář přidáme ComboBox, vlastnost Style nastavíme na csOwnerDrawFixed a ItemHeight na 20. Dále si vytvoříme pole (Data:array [0..10] of String;), do kterého nahrajeme nějaké ty data. Já jsem použil pár položek ceníku jedné nejmenované počítačové firmy, jako první je uloženo pořadové číslo, následuje krátký název, cena a nakonec ještě popis. Tyto data následně v proceduře přidáme do položek ComboBoxu. zde je výpis procedury Form1.OnCreate:
|
Přistoupíme k vykreslování - vytvoříme si proceduru OnDrawItem. Jako u minulého ComboBoxu nejprve vymažeme pozadí modrou, pokud je položka vybraná, nebo šedou, pokud není. Následně postupně nakreslíme první, druhý a třetí sloupec. Zde je výpis pouze kreslení tří sloupců, ostatní je totožné jako u minulých ComboBoxů, pokud chcete vidět proceduru celou, stáhněte si demo aplikaci:
|
A co s posledním sloupcem ? Ten nastavíme jako Hint, pokud nějakou položku vybereme. Vytvoříme si tedy ještě proceduru ComboBox.OnChange, a do ní přidáme následující kód:
|
Výsledek můžete uložit a spustit. Rozbalené menu bude vypadat jako na obrázku úplně nahoře, pokud nějakou položku vyberete, a potom nad ComboBox přesunete kurzor myši, objeví se nápověda podobná této:
A to je už úplně všechno, co jsem vám chtěl ke ComboBoxům říct. Případné další dotazy zodpovím na níže uvedeném e-mailu, nebo v diskusi pod článkem.
Download
ZDE si můžete stáhnout dnes vytvořený program a jeho zdrojáky (170 kB)
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007