プログラム内でリストボックスの選択されているアイテムを取得する際、
画面に表示されている項目に選択した時の色を表示する事は出来ますか?
出来ればどなたかご教授願います。
色の名前(TColor)を表示したいの?
プログラムで選択したアイテムを画面上に色で表示したいのです。
(説明が下手ですいません)
赤
青
黄
があって、青を選択したら、青色になってほしいの?
説明が下手じゃなく、不足
TListBoxのItemsが
"赤"
"青"
"黄"
とかなら
TListBoxのItemIndexを使って判断、処理できる。
この場合、最初が 0 で最後が 2。
フォームに TPanelとTListBoxが貼り付けてあるとして
TListBox.OnClick のイベントハンドラに
case ListBox1.ItemIndex of
0: Panel1.Color:= clRed;
1: Panel1.Color:= clBlue;
2: Panel1.Color:= clYellow;
else
Panel1.Color:=clBlack;
end;
それともリストボックス内の各項目の背景色?
各項目の背景色の場合。
コンストラクタか オブジェクトインスペクタで
ListBox の Style を lbOwnerDrawFixed にした上で、
ListBox の OnDrawItemイベントを使えば派生しなくても何とかなります。
OnDrawItemは、アイテムの描画が必要されるたびに
アイテム1つずつに1回以上、呼び出されます。
自分で考えるのも大切だけど最初のうちは、
人のを見た方が参考になると思うんで、書いてみました。(まあ息抜き)
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
fc,bc: TColor;
w,h: integer;
begin
// fc はフォント(テキスト)の色
// bc は 背景色
case Index of
0: begin
fc:= clWhite;
bc:= clRed;
end;
1: begin
fc:= clWhite;
bc:= clBlue;
end;
2: begin
fc:= clBlack;
bc:= clYellow;
end;
else
begin
fc:= clWindowText;
bc:= clWindow;
end;
end;
with Control as TListBox do
if Canvas.TryLock then
try
//選択されていたら色を変える(あまり見栄えがよくない)
//if (odSelected in State) then
// bc:= (bc shr 1) and $00FFFFFF;
//背景塗りつぶし
Canvas.Brush.Color:= bc;
Canvas.FillRect(Rect);
//選択されていたら、分かりづらいので左端にボタンをつける処理
w:=Rect.Bottom-Rect.Top; //アイテムの幅
dec(w,7); //ボタンの大きさを調節(少し小さくする)
h:=w; //正方形にするため高さを幅に合わせる
inc(Rect.Left,4); //小さくした分の半分を余白にとる
inc(Rect.Top,4);
//選択されていたらボタンを描画
if (odSelected in State) then
DrawFrameControl( Canvas.Handle,
classes.Rect( Rect.Left, Rect.Top, Rect.Left + w, Rect.Top + h),
DFC_BUTTON,DFCS_BUTTONPUSH or DFCS_TRANSPARENT);
//ボタンの右に余白をとる
inc( Rect.Left,4);
inc( Rect.Left, w);
//テキスト描画
Canvas.Font.Color:= fc;
Canvas.TextOut( Rect.Left,Rect.Top, Items[Index]);
finally
Canvas.UnLock;
end;
end;
ListBox の Style を lbOwnerDrawFixed にするのを忘れずに。
ListBoxは、マウス操作だけじゃ未選択にできないんですねー
知りませんでした。
ツイート | ![]() |