☆TComboBoxExを使ってみる。

TComboBoxExのカテゴリが、なぜAdditionalじゃなくて、Win32なのか・・・疑問に思って調べてみたら、 TreeViewやListViewと同様、Windowsのラッパーなんですね。知らなかったです。

今まで、ComboBoxでインデントさせたり、イメージを表示するには、OnDrawItemで描画する必要がありましたが、 ComboBoxExを使うと簡単に表示できます。
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ComboBoxEx1: TComboBoxEx;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//テスト用アイコン作成
procedure MakeTestIcon(ImageList: TImageList);
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.Height := 16;
    Bitmap.Width := 16;
    Bitmap.Canvas.Brush.Color := clRed;
    Bitmap.Canvas.FillRect(Rect(2,2,14,14));
    ImageList.Add(Bitmap,nil);
    Bitmap.Canvas.Brush.Color := clBlue;
    Bitmap.Canvas.FillRect(Rect(2,2,14,14));
    ImageList.Add(Bitmap,nil);
  finally
    Bitmap.Free;
  end;
end;

function GetCategory(Index: Integer): String;
begin
  case Index of
    0: Result := 'Guitar';
    1: Result := 'Synthesizer';
  else
       Result := 'Piano'
  end;
end;

procedure GetGuitarItem(ComboBoxEx: TComboBoxEx; Ident: Integer);
var
  ComboExItem: TComboExItem;
  I: Integer;
  S: String;
begin
  for I := 0 to 3 do
  begin
    case I of
      0: S := 'Ibanez';
      1: S := 'Gibson';
      2: S := 'Yamaha';
    else
      S := 'Fender';
    end;
    ComboExItem := ComboBoxEx.ItemsEx.Add;
    ComboExItem.Caption := S;
    ComboExItem.Indent := Ident;
    ComboExItem.ImageIndex := 1;
  end;
end;

procedure GetSynthesizerItem(ComboBoxEx: TComboBoxEx; Ident: Integer);
var
  ComboExItem: TComboExItem;
  I: Integer;
  S: String;
begin
  for I := 0 to 2 do
  begin
    case I of
      0: S := 'Roland';
      1: S := 'Yamaha';
    else
         S := 'KORG';
    end;
    ComboExItem := ComboBoxEx.ItemsEx.Add;
    ComboExItem.Caption := S;
    ComboExItem.Indent := Ident;
    ComboExItem.ImageIndex := 1;
  end;
end;

procedure GetPianoItem(ComboBoxEx: TComboBoxEx; Ident: Integer);
var
  ComboExItem: TComboExItem;
  I: Integer;
  S: String;
begin
  for I := 0 to 2 do
  begin
    case I of
      0: S := 'Steinway & Sons';
      1: S := 'Yamaha';
    else
         S := 'Kawai';
    end;
    ComboExItem := ComboBoxEx.ItemsEx.Add;
    ComboExItem.Caption := S;
    ComboExItem.Indent := Ident;
    ComboExItem.ImageIndex := 1;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  MakeTestIcon(ImageList1);
  ComboBoxEx1.Style := csExDropDownList;

  ComboBoxEx1.ItemsEx.Clear;
  ComboBoxEx1.ItemsEx.SortType := stNone;

  for I := 0 to 2 do
  begin
    ComboBoxEx1.ItemsEx.AddItem(GetCategory(I), 0, 0, -1, 0, nil);
    case I of
      0: GetGuitarItem(ComboBoxEx1,1);
      1: GetSynthesizerItem(ComboBoxEx1,1);
    else
      GetPianoItem(ComboBoxEx1,1);
    end;
  end;
  ComboBoxEx1.ItemIndex := 0;
end;

end.

実行するとこんな感じです。

Comboboxex

又、ComboBoxExでは、ソートもテキストだけでなく、SortTypeでstDataを指定し、ItemsExが保持しているポインタで ソートすることも可能です。


参考
MSDN
ComboBoxEx Control Reference

|