Tipy a triky v Delphi, díl 45.

Dneska si ukážeme jak přidat obrázky do ComboBoxu, dále jak zakázat překreslování okna aplikace a nakonec zjišťování jména a identifikačního čísla CD disku.

Obrázkový ComboBox

Ukážeme si, jak vylepšit klasický ComboBox tím, že k jednotlivým položkám rozbaleného seznamu přiřadíme obrázky (ikonky). Každá položka pak bude mít vlevo vlastní ikonu a vedle ní bude samotný text dané položky.

Jak toho dosáhnout? Poměrně snadno tím, že se o vykreslení budeme starat sami prostřednictvím události OnDrawItem. Nejprve je však třeba nastavit styl ComboBoxu na csOwnerDrawFixed nebo csOwnerDrawVariable (podle toho, zda budou jednotlivé řádky mít fixní či proměnlivou velikost).

Poté naplňte ComboBox nějakými testovacími daty. Prostě několik řádků hodnot. Jednotlivé obrázky budou potom k položkám přiřazeny z ImageListu, který rovněž přidejte na formulář a pochopitelně naplňte několika (vhodně malými) obrázky.

Vlastní obsluha události OnDrawItem pak vypadá takto:

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);
var
ComboBox : TComboBox;
bitmap : TBitmap;
begin
ComboBox := (Control as TComboBox);
bitmap := TBitmap.Create;
try
  ImageList1.GetBitmap(Index, bitmap);
  with ComboBox.Canvas do
  begin
    FillRect(Rect);
    if Bitmap.Handle <> 0 then Draw(Rect.Left + 2, Rect.Top, Bitmap);
    Rect := Bounds(Rect.Left + ComboBox.ItemHeight + 2, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top);
    DrawText(handle, PChar(ComboBox.Items[Index]), length(ComboBox.Items[index]), Rect, DT_VCENTER+DT_SINGLELINE);
  end;
finally
  bitmap.Free;
end;
end;

Jednotlivé "řádky" (položky) ComboBoxu jsou identifikovány svým indexem (parametr Index), který je jako obvykle počítán od nuly. Kvůli zjednodušení příkladu je tentýž index zároveň určující pro to, který obrázek z ImageListu bude pro danou položku použit. V reálných aplikacích si pochopitelně na základě hodnoty daného řádku můžete přiřadit patřičný vhodný obrázek libovolně.

Máte-li k dispozici Delphi verze 6 (stačí i Personal verze zdarma), pak je situace mnohem jednodušší, neboť vše řeší nová komponenta ComboBoxEx.

Jak zabránit překreslení okna aplikace?

Následující tip patří opět k těm velmi krátkým, jednoduchým a velmi málo používaným. Pokud tedy z nějakého důvodu chcete zabránit systému v překreslování okna vaší aplikace, stačí použít následující příkaz:

SendMessage(Handle, WM_SetRedraw, 0, 0);

Pro opětovné zapnutí překreslování použijte tyto parametry:

SendMessage(Handle, WM_SetRedraw, 1, 0);

Až budete tento tip zkoušet, dejte si pozor, aby se vám aplikace "neztratila". Nejenže se okno nebude překreslovat (tj. pokud jej překryjete oknem jiné aplikace a poté znovu odkryjete, bude vidět plocha Windows), ale nebude ani reagovat na klikání myši. Nelze jej tak ani uchopit nebo klikat na objekty na formuláři (nehledě na to, že i kdyby se vám "nějak" podařilo myší okno uchopit, těžko byste jej díky nepřekreslování někam viditelně přenesli). Aplikace však samozřejmě reaguje na klávesnici, takže lze mezi jednotlivými prvky (i když třeba nejsou vidět) přecházet například tabulátorem.

Název a identifikační číslo CD disku

Na závěr tu máme jednoduchou funkci na zjišťování základních informací o vloženém CD – název a ID disku. Jako parametr se předává písmenko mechaniky CD (včetně dvojtečky). Pokud bude jako parametr předán disk jiného typu (například pevný disk či disketová mechanika), funkce vrátí prázdný řetězec.

function GetCDInfo(WhichDrive: string): string;
var
  VolumeName: array[0..255] of char;
  FileSystemType: array[0..255] of char;
  SerialNum: DWORD;
  MaxFilenameLength: DWORD;
  Flags: DWORD;
begin
  if (GetVolumeInformation(PChar(WhichDrive), VolumeName, 256, @SerialNum, MaxFilenameLength, Flags, FileSystemType, 256)) then
  Result := (IntToHex(SerialNum shr 16, 3) + IntToHex((SerialNum shl 16) shr 16, 4)) + ` - ` + VolumeName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(GetCDinfo(`e:`));
end;

Diskuze (3) Další článek: Audio Galaxy se dohodla s RIAA - končí

Témata článku: Software, Windows, Programování, Následující řádek, Nová komponenta, Trik, Díl, TRI, Jednotlivé položky, Zjednodušený příklad, DEL, Index


Určitě si přečtěte

13 praktických tipů a triků pro Mapy.cz, které možná neznáte

13 praktických tipů a triků pro Mapy.cz, které možná neznáte

** Mapy.cz neslouží jen k zobrazení podkladů a plánování tras ** Nabízejí celou řadu dalších praktických funkcí a možností ** Vybrali jsme třináct tipů a triků, o kterých možná (ne)víte

Karel Kilián | 31

Vyzkoušeli jsme chytrou čínskou zásuvku Sonoff S26 za tři stovky. Nevyhořeli jsme

Vyzkoušeli jsme chytrou čínskou zásuvku Sonoff S26 za tři stovky. Nevyhořeli jsme

** Je sice z Aliexpressu, ale funguje ** Můžete ji ovládat hlasem přes Amazon Echo nebo Google Home ** Za tři stovky zautomatizuje menší 230V spotřebič

Jakub Čížek | 101

Že by konečně revoluce? Nové chytré hodinky od Garminu mají průhledný solární panel

Že by konečně revoluce? Nové chytré hodinky od Garminu mají průhledný solární panel

** Chytré hodinky mají relativně malou výdrž ** Sportovní fénixy od Garminu jsou na tom ale lépe ** Poslední verze nabízí dokonce transparentní solární panel

Jakub Čížek | 56

Antivir zdarma: 8 bezplatných řešení, která zatočí s havětí v počítači

Antivir zdarma: 8 bezplatných řešení, která zatočí s havětí v počítači

** Součástí Windows 10 je integrovaný antivirový program. Stačí to? ** Představíme vám sedm aplikací na boj proti virům a malwaru ** Všechny jsou k dispozici zdarma a některé ani nemusíte instalovat

Karel Kilián | 30

Kdyby měli železničáři tento superpočítač za 99 dolarů, nepotřebovali by lasery

Kdyby měli železničáři tento superpočítač za 99 dolarů, nepotřebovali by lasery

** Nejmodernější český železniční tunel je prošpikovaný technologiemi ** Za tři tisíce koupíte počítač, který je překoná ** Seznamte se s Nvidia Jetson Nano

Jakub Čížek | 50



Aktuální číslo časopisu Computer

Megatest 20 procesorů

Srovnání 15 True Wireless sluchátek

Vyplatí se tisknout fotografie doma?

Vybíráme nejlepší základní desky