人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Delphiでのプログラミングに関する質問です。
TListBoxのItemを複数行で表示させるにはどうすれば良いのでしょうか?

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

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

●質問者: oyasayumin
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:Canvas Delphi デフォルト プログラミング プロパティ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● quintia
●100ポイント ベストアンサー

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

◎質問者からの返答

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

参考になりました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ