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 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.
Datum: 2011-06-20 23:57:00 Tagy: Delphi 2007, VCL, delphi64