ListboxのOnDrawItemを呼び出すには?

解決


ヒカリ  2005-09-13 08:21:15  No: 17530

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

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

お願いします。


ママん  2005-09-13 10:36:32  No: 17531

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


ヤミ  2005-09-13 18:07:47  No: 17532

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


ヒカリ  2005-09-13 18:41:26  No: 17533

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


anone  2005-09-13 18:56:41  No: 17534

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

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


Mr.XRAY  URL  2005-09-13 20:22:20  No: 17535

>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 20:22:53  No: 17536

例えば、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 20:24:22  No: 17537

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


Mr.XRAY  URL  2005-09-13 20:26:29  No: 17538

>with ListBox1 do begin

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

With Control as TListBox do begin

とかけばOKです.


Mr.XRAY  URL  2005-09-13 20:28:34  No: 17539

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

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


ヒカリ  2005-09-15 04:15:55  No: 17540

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加