Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi】TComboBoxのアイテム表示制御

今回はTComboBoxを使用する場合のアイテム表示の制御テクニックをご紹介します。

TComboBoxはItemsプロパティに設定したアイテムを
リストとして表示・選択することができます。

選択する際に表示されるリストの幅は、設計時のTComboBoxのサイズに準拠しますが、
アイテムの文字列が長い場合には全て表示ができない場合があります。

アイテム内容が固定の場合は設計時に調整できますが、
マスタファイルから動的にアイテムをセットする場合などは、
あらかじめサイズを設計できないため、次のような表示幅制御のテクニックが有効です。

プログラムはリストを開く際に動作するOnDropDownイベントに実装します。

 

例)TComboBoxのアイテム表示幅制御

procedure TForm1.ComboBox1DropDown(Sender: TObject);
const
 Margin = 10; // 左右の余白の幅(4~10 程度)
var
  MaxWidth, i, w: Integer;
begin
  with ComboBox1 do
  begin
    Canvas.Handle := GetDC(Handle);
    try
      Canvas.Font := Font;
      MaxWidth := 0;
      // 最も長い文字列の幅を調べる
      for i := 0 to Items.Count - 1 do
      begin
        w := Canvas.TextWidth(Items[i]);
        if w > MaxWidth then
        begin
          MaxWidth := w;
        end;
      end;
      Inc(MaxWidth, Margin);
      // スクロールバーの幅を加味する
      if Items.Count > DropDownCount then
      begin
        Inc(MaxWidth, GetSystemMetrics(SM_CXVSCROLL));
      end;
      SendMessage(Handle, CB_SETDROPPEDWIDTH, MaxWidth, 0)
    finally
      ReleaseDC(Handle, Canvas.Handle)
    end
  end;
end;

これによって設計時に選択リストの表示幅を設定できない場合でも、
実行時にリストアイテムから自動で適切な幅を設定することができます。

 

また、リストに表示する項目数はDropDownCountプロパティで設定できます。

左はデフォルトの状態(横幅はComboBoxの幅まで+8行表示)
右は上記のロジックで横幅を調整した上で、DropDownCount=15に設定して全件表示できるようにした例

 

(ミガロ.情報マガジン「MIGARO News!!」Vol.158 2014年1月号より)