Delphiでのプログラミングに関する質問です。

TListBoxのItemを複数行で表示させるにはどうすれば良いのでしょうか?

※項目数ではなく、ListBoxの各Itemを複数行で表示させたいんです。。。
皆様よろしくお願いしますー。。。

(Items[i].Heightを変えて、Canvasに直接文字を描画すればOKかとは思うんですが、複数行表示のプロパティはデフォルトで有りますか?)

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/01/08 21:44:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:quintia No.1

回答回数562ベストアンサー獲得回数71

ポイント100pt

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 では使えません。悪しからず。

id:oyasayumin

うーん!素晴らしい回答ありがとうございました!

参考になりました!

2007/01/08 21:44:07

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません