今回は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プロパティで設定できます。
(ミガロ.情報マガジン「MIGARO News!!」Vol.158 2014年1月号より)