お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"コンボボックスのリストを項目別に色分け"





コンボボックスのリスト部分の背景色を項目別に色分けするコンポです。
項目を選択すると、コンボボックス本体の背景色も変わります。

コンボボックスでリストから項目を選択するとき、同じような文字が並んでると
選択ミスをしても気が付きにくいですが、項目別に色分けして、選択した時に
その色の背景色になることで、間違えて選択をした場合でも、気が付きやすく
なります。入力ミスの軽減を目的に作りました。

プロパティの「ListColor1〜3」に指定した色で、リストが色分けされます。
初期値では、薄い青・黄・赤になっています。

                          JBC01362 アトリエ まっちゃん
                                 「うたた寝子」
                                   http://www.people.or.jp/~macchan/

-------------------------< ColorComboBox.pas >-------------------------
unit ColorComboBox;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls;

type
  TColorCombo = class(TComboBox)
  private
    { Private 宣言 }
    FColor: TColor;
    FListColors: array[0..2] of TColor;
    procedure SetColor(const Value: TColor);
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
    procedure SetListColors1(const Value: TColor);
    procedure SetListColors2(const Value: TColor);
    procedure SetListColors3(const Value: TColor);
  protected
    { Protected 宣言 }
    procedure Change; override;
    procedure DrawItem(Index: Integer; Rect: TRect;
      State: TOwnerDrawState); override;
  public
    { Public 宣言 }
    constructor Create(AOwner: TComponent); override;
    procedure CreateParams(var Params: TCreateParams); override;
  published
    { Published 宣言 }
    property Color: TColor read FColor write SetColor default clWindow;
    property ListColor1: TColor read FListColors[0] write SetListColors1
                                default $FFD0D0;
    property ListColor2: TColor read FListColors[1] write SetListColors2
                                default $D0FFFF;
    property ListColor3: TColor read FListColors[2] write SetListColors3
                                default $D0D0FF;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Additional', [TColorCombo]);
end;

{ TColorCombo }

procedure TColorCombo.Change;
var
  i: Integer;
begin
  inherited;
  i := Items.IndexOf(Text);
  if i < 0 then
    inherited Color := FColor
  else
    inherited Color := FListColors[i mod 3];
end;

procedure TColorCombo.CMFontChanged(var Message: TMessage);
begin
  inherited;
  if Style in [csDropDown, csSimple, csDropDownList] then
    ItemHeight := Abs(Font.Height);
end;

constructor TColorCombo.Create(AOwner: TComponent);
begin
  inherited;
  FColor := clWindow;
  inherited Color := FColor;
  FListColors[0]  := $FFD0D0;
  FListColors[1]  := $D0FFFF;
  FListColors[2]  := $D0D0FF;
end;

procedure TColorCombo.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or CBS_OWNERDRAWFIXED;
end;

procedure TColorCombo.DrawItem(Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
const
  ArrowWidth  =  6;
  ArrowHeight = 12;
  Space       =  2;
begin
  TControlCanvas(Canvas).UpdateTextFlags;
  if Assigned(OnDrawItem) then
   begin
    OnDrawItem(Self, Index, Rect, State);
    Exit;
   end;
  Canvas.Font .Color := Font.Color;
  Canvas.Brush.Color := FListColors[Index mod 3];
  Canvas.FillRect(Rect);
  Canvas.TextOut(ArrowWidth + Space * 2 + 2, Rect.Top, Items[Index]);
  if odSelected in State then
   begin
    Canvas.DrawFocusRect(Rect);
    Canvas.Brush.Color := Font.Color;
    Rect.Left   := Rect.Left + Space;
    Rect.Right  := Rect.Left + ArrowWidth;
    Rect.Top    := Rect.Top  + (Rect.Bottom - Rect.Top - ArrowHeight) div 2;
    Rect.Bottom := Rect.Top  + ArrowHeight;
    Canvas.Polygon([Point(Rect.Left , Rect.Top),
                    Point(Rect.Right, (Rect.Top + Rect.Bottom) div 2),
                    Point(Rect.Left , Rect.Bottom),
                    Point(Rect.Left , Rect.Top)]);
   end;
end;

procedure TColorCombo.SetColor(const Value: TColor);
begin
  if FColor = Value then Exit;
  if FColor = inherited Color then
   begin
    FColor := Value;
    inherited Color := FColor;
   end
  else
    FColor := Value;
end;

procedure TColorCombo.SetListColors1(const Value: TColor);
begin
  if FListColors[0] = Value then Exit;
  FListColors[0] := Value;
  if Style = csSimple then
    Invalidate;
end;

procedure TColorCombo.SetListColors2(const Value: TColor);
begin
  if FListColors[1] = Value then Exit;
  FListColors[1] := Value;
  if Style = csSimple then
    Invalidate;
end;

procedure TColorCombo.SetListColors3(const Value: TColor);
begin
  if FListColors[2] = Value then Exit;
  FListColors[2] := Value;
  if Style = csSimple then
    Invalidate;
end;

end.
 


- FDELPHI  MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 01/08/05 -

Original document by Atelier Macchan 氏 ID:(JBC01362)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum