ListboxのOnDrawItemを呼び出すには?

解決


ヒカリ  2005-09-12 23:21:15  No: 17530  IP: 192.*.*.*

最近Delphi6.0を始めた者です。

フォームのロードイベントで同フォーム内のListboxのOnDrawItemイベントを呼び出すにはどうしたらいいのでしょうか?
型の定義とかがいまいち分からなくてなかなかうまくいきません。

お願いします。

編集 削除
ママん  2005-09-13 01:36:32  No: 17531  IP: 192.*.*.*

おそらく単語が間違ってます。
フォームのロード中はフォームが見えませんから当然その上にあるコントロールを描く必要はありませんし、描けません。
ちょっとやりたいことを具体的にお願いします。

編集 削除
ヤミ  2005-09-13 09:07:47  No: 17532  IP: 192.*.*.*

単純に呼び出すだけなら OnDrawItem(nil) で。

編集 削除
ヒカリ  2005-09-13 09:41:26  No: 17533  IP: 192.*.*.*

フォームのロードが完了したら、Listboxの各Itemに違う色をつけたいのですが。

編集 削除
anone  2005-09-13 09:56:41  No: 17534  IP: 192.*.*.*

> フォームのロードが完了したら、Listboxの各Itemに違う色をつけたいのですが。

OnDrawItemイベントは、ユーザが呼び出すものじゃなくて、OS が ListBox を
描画するときによびだすものです。そこのとこは理解できてますか?

編集 削除
Mr.XRAY  URL  2005-09-13 11:22:20  No: 17535  IP: 192.*.*.*

>ListboxのOnDrawItemを呼び出すには?

(1) Listboxの各Itemの色を変更したい ---->
(2) OnDrawItemを使えばいいのかも知れない

ということで,このタイトルの質問になったのではないかと思いますが,
Delphiでは,各コントロール(コンポーネント)にイベントがあり,これは,
実行中に適当なタイミングで呼び出してくれます.
素直に,やりたいことを質問すればよかったわけですね.

つまり,OnDrawItemイベントを定義しさえすれば自動的に実行してくれる
わけです.以下のコードを実行してみて下さい.後は適当に...
もちろんヘルプも参考にして下さい.
実行確認は,WindowsXP(SP2),Delphi5(UP1)です.

//=====================================================================
//  ListBoxのItemの色を変更
//  StyleプロパティをlbOwnerDrawFixedにするとこのイベントが呼ばれる
//  このイベントを定義するとデフォルトの描画は行わないので,自分で書く
//=====================================================================
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
     with ListBox1 do begin
       if odFocused in State then begin
         Canvas.Brush.Color:=clWhite;
       end else begin
         case Index of
           0: Canvas.Brush.Color:=clYellow;
           1: Canvas.Brush.Color:=clBlue;
           2: Canvas.Brush.Color:=clGreen;
           3: Canvas.Brush.Color:=clRed;
         end;
       end;
       Canvas.FillRect(Rect);
       DrawText(Canvas.Handle,PChar(Items[Index]),-1,Rect,
               DT_SINGLELINE or DT_VCENTER or DT_LEFT);
     end;
end;

編集 削除
deldel  2005-09-13 11:22:53  No: 17536  IP: 192.*.*.*

例えば、ListBox1.Style を lbOwnerDrawFixed としておいて、
以下のようにすれば、1行目だけ色付きで表示されるようになります。

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  if Index = 0 then begin
    ListBox1.Canvas.Font.Color := clRed;
    ListBox1.Canvas.Brush.Color := clYellow;
    ListBox1.Canvas.FillRect(Rect);
    ListBox1.Canvas.TextOut(2, 2, ListBox1.Items[Index]);
  end;
end;

編集 削除
deldel  2005-09-13 11:24:22  No: 17537  IP: 192.*.*.*

やや、かぶってしまった・・・^^;

編集 削除
Mr.XRAY  URL  2005-09-13 11:26:29  No: 17538  IP: 192.*.*.*

>with ListBox1 do begin

もし,ListBoxに対して汎用的に使用するのであれば,この部分を

With Control as TListBox do begin

とかけばOKです.

編集 削除
Mr.XRAY  URL  2005-09-13 11:28:34  No: 17539  IP: 192.*.*.*

deldelさん
>やや、かぶってしまった・・・^^;

おしい!!  わずか1分以内の差でしたね.^ ^;

編集 削除
ヒカリ  2005-09-14 19:15:55  No: 17540  IP: 192.*.*.*

解決しました。
詳しいご説明感謝します。

編集 削除