Column ComboBox - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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:


Function GetField(s:string;index:integer;oddelovac:Char):string;
var PosOddel:integer;
    Count:integer;
begin
 Count:=1;

 while Count <= Index do
  begin
   // postupně odstraňujeme
   // položky zepředu
   PosOddel:=Pos(oddelovac,s);
   Delete(s,1,PosOddel);

   Count:=Count+1;
  end;

 // odřízneme konec
 PosOddel:=Pos(oddelovac,s);
 Delete(s,PosOddel,Length(s));

 // a je to
 Result:=s;
end;


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:


procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
 // vyvoříme pro comboBox nějaká data
 Data[0]:='|1|Procesor|8086 Kč|AMD K7 1,3GHz/266MHz|';
 Data[1]:='|2|Monitor|23679 Kč|ADI 21" MicroScan G1000|';
 Data[2]:='|3|Paměti|28580 Kč|SDRAM 133MHZ 1024MB značková|';
 Data[3]:='|4|Pevný Disk|11644 Kč|IBM Deskstar 76GB|';
 Data[4]:='|5|Klávesnice|530 Kč|Chicony PS/2 8993|';
 Data[5]:='|6|Myš|1023 Kč|Genius NetScroll OPTICKÁ USB|';
 Data[6]:='|7|Case|1680 Kč|BigTower EuroCase 763A ATX|';
 Data[7]:='|8|Motherboard|4098 Kč|MSI K7T PRO2 A|';

 // a přidáme je do ComboBoxu
 ComboBox1.Items.Clear;
 for i:= 0 to 7 do
  begin
   ComboBox1.Items.Add(Data[i]);
  end;

end;


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:


   ...

   Rect.Left:=5;     // pořadové číslo
   DrawText(ComboBox1.Canvas.Handle,
   PChar(GetField(Data[Index],1,'|')),-1,
   Rect,DT_SINGLELINE or DT_VCENTER);

   Rect.Left:=20;    // název
   DrawText(ComboBox1.Canvas.Handle,
   PChar(GetField(Data[Index],2,'|')),-1,
   Rect,DT_SINGLELINE or DT_VCENTER);

   Rect.Right:=150;  // cena
   DrawText(ComboBox1.Canvas.Handle,
   PChar(GetField(Data[Index],3,'|')),-1,
   Rect,DT_SINGLELINE or DT_VCENTER or DT_RIGHT);

   ...


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:


procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 Application.HintPause:=100;
 Application.HintColor:=$00A8EDF9;
 // nastavíme si hint
 ComboBox1.Hint:=
 (GetField(Data[ComboBox1.ItemIndex],1,'|')+')'+#10#13+' název: '+
 GetField(Data[ComboBox1.ItemIndex],2,'|')+' '+#10#13+' cena: '+
 GetField(Data[ComboBox1.ItemIndex],3,'|')+' '+#10#13+' info: '+
 GetField(Data[ComboBox1.ItemIndex],4,'|'));
end;


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)

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: