リストボックスを2段表示する方法について

リストボックスを2段表示する方法について

得意先などを検索したいときにその情報を特定するために企業名・郵便番号・住所などを表示されると思います。ただこの住所という項目は結構長くてリストボックスなどに表示しきれないことがたくさんあると思います。
そこで都道府県までに絞って表示したりなどの工夫をするわけですが、リストの大きさを大きくしてしまう方法もあります。ただ闇雲に長くはできないわけなので2行にして表示しようと言うわけです。

実際に2行表示に必要な設定ですが、StyleプロパティをlbOwnerDrawVariableに変更することで準備完了です。設定できたら、リストの中にデータを描く作業が必要です。ただ何もしないとリスト中の各項目の高さは1行分になっているので、まずこれを2行分に変更します。高さの変更にはOnMeasureItemイベントで行います。ここで2行表示するのに必要な高さを計算しHeightに代入します。必要な高さはFontの高さ×2+αなのですが、Fontの高さはマイナスになっているので絶対値で対応します。以下に例を示します。

procedure TForm1.ListBox1MeasureItem
(Control: TWinControl;Index: Integer;var Height: Integer);
begin
Height := (abs(TListBox(Control).Font.Height) * 2) + 2;
end;

次に実際に描画を行います。描画はOnDrawItemイベントで行います。表示するデータをItemsプロパティに改行コード(#13#10)を含むように保管します。DrawText関数を使うと簡単です。まずFillRect関数で描画領域を塗りつぶします。その後きれいになった領域にDrawText関数で描画します。左上を基準にするために、DT_LEFT と DT_TOPを指定します。以下に例を示します。

procedure TForm1.ListBox1DrawItem
(Control: TWinControl; Index: Integer;Rect: TRect; State: TOwnerDrawState);
begin
TListBox(Control).Canvas.FillRect(Rect);
with TListBox(Control) do
begin
DrawText(Canvas.Handle, PChar(Items[Index]), Length(Items[Index]),Rect, DT_LEFT or DT_TOP);
end;
end;

改行コードの位置でテキストが折り返して表示されたでしょうか?塗りつぶしと描画の間で描画領域の大きさを調整して見た目の調整を行えばもっときれいに表示することができます。