TListBoxのItemを複数行で表示させるにはどうすれば良いのでしょうか?
※項目数ではなく、ListBoxの各Itemを複数行で表示させたいんです。。。
皆様よろしくお願いしますー。。。
(Items[i].Heightを変えて、Canvasに直接文字を描画すればOKかとは思うんですが、複数行表示のプロパティはデフォルトで有りますか?)
OwnewDrawとDrawText APIを使用するのが普通でしょうね。
Styleプロパティに lbOwnerDrawFixed を指定して、ItemHeight プロパティに必要な高さを指定します(最初は100とか50とかでいいでしょう)。
OnDrawItemイベントを記述します。
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with (Control as TListBox) do begin Canvas.FillRect(Rect); //見た目の調整 //もちろんこういう固定値の直書きはよくないはずなのだけど //VCLのソース(StdCtrls.pas TCustomListBox.DrawItem)にもこう書いてあるし…… if not UseRightToLeftAlignment then Inc(Rect.Left, 2) else Dec(Rect.Right, 2); DrawText(Canvas.Handle, PChar(Items[Index]), -1, Rect, DT_WORDBREAK); end; end;
こんな感じですね。
最初は DrawText の動作の確認のために、
procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.Items.Add('aaa'+chr(10)+'bbb'); ListBox1.Items.Add('bbb'); ListBox1.Items.Add('ccc ddd eee fff ggg hhh iii jjj kkk lll mmm'); end;
というテストコードを書いてみるといいでしょう。
改行コード(chr(10))で複数行表示できることや、幅に応じて改行されることが確認できると思います。
Delphi for .NET では使えません。悪しからず。
うーん!素晴らしい回答ありがとうございました!
参考になりました!