TComboBoxEx - vylepšený TComboBox

vložil Radek Červinka 21. června 2011 00:57

Jednou z méně známých komponent přímo z instalace Delphi je TComboBoxEx. Byla přidána až ve vyšších verzích Delphi - proto ta menší publicita. Verzí si nejsem jist, ale existuje i v Delphi 2007. Díky ní rapidně ubylo pokusů o customdraw combobox pro položky s obrázky, neb to byl jeden z cílů tvůrců.

Pro mne další významnou věcí je možnost použít můj globální imagelist a do comboboxu dát položky, které mají vlastní ID, které se neshoduje s položkou v ImageList a mohu si ho definovat. Další věci jsou už jen bonus - jako např. možnost specifikovat odsazení položky.

TComboBoxEx

TComboBoxEx přidává kromě jiného property Images a ItemsEx a události OnBeginEdit a OnEndEdit. Zajímavé je hlavně ItemsEx, do které se přidávají položky typu TComboExItem = class(TListControlItem). Díky nim lze specifikovat ImageIndex, Indent a Data: TCustomData (=Pointer) a další. Uvedený screenshot je vytvořen následujím programem, resp. je sekcí ve Form.Create.

unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    cmb: TComboBoxEx;
    iml1: TImageList;
    btn1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

type
  // pro novejsi delphi s ohledem na 64bit je definovan typ NativeInt,
  //který ale má v Delphi 2007 špatnou velikost ;-)
{$IFDEF CPUX64}
  IntPtr = NativeInt;
{$ELSE}
  IntPtr = Integer;
{$ENDIF}
{$R *.dfm}

procedure TForm2.btn1Click(Sender: TObject);
  function moFindData(i:IntPtr):TComboExItem;
  var
    p: TCollectionItem;
  begin
    Result := nil;
    for p in cmb.ItemsEx do
      if TComboExItem(p).Data = Pointer(i) then
      begin
        Result := TComboExItem(p);
        Exit;
      end;
  end;

begin
  ShowMessage(moFindData(25).Caption);
end;

procedure TForm2.FormCreate(Sender: TObject);
var
  item: TComboExItem;
begin
//  cmb.Items.Add('ddd')
  item := cmb.ItemsEx.Add;
  item.Caption := 'První položka';
  item.ImageIndex := 1;
  item.Data := Pointer(20);

  item := cmb.ItemsEx.Add;
  item.Indent := 3;
  item.Caption := 'Druhá položka';
  item.ImageIndex := 2;
  item.Data := Pointer(30);

  item := cmb.ItemsEx.Add;
  item.Caption := 'Třetí položka';
  item.ImageIndex := 3;
  item.Data := Pointer(25);

end;

end.

Program je psaný pro Delphi 2007, jinak bych napsal

  function moFindData(i:IntPtr):TComboExItem;
  var
    p: TCollectionItem;
  begin
    Result := nil;
    for p in cmb.ItemsEx do
      if TComboExItem(p).Data = Pointer(i) then
        Exit (TComboExItem(p))
  end;

tj. exit s parametrem (D2009+).

Myslím si, že taková komponenta pěkně vylepší Váš program.

Ještě věnujte prosím pozornost části

{$IFDEF CPUX64}
  IntPtr = NativeInt;
{$ELSE}
  IntPtr = Integer;
{$ENDIF}

NativeInt je Integer o velikosti pointeru, ale jeho velikost v Delphi 2007 je špatná. Proto vytvářím alias IntPtr (on bude pravděpodobně v Delphi64 definován přímo, ale takto je to jasnější). CPUX64 bude definován v 64bitech, více informací ve starším článku o 64bitech, definicích atd.

Tagy: , ,

Komponenty

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců