F-3 暗い色を作る

「暗くする」ボタンを押すと
左のパネルの色より明るさが半分の色が右のパネルに現れる、というプログラムを作りましょう。

【基礎課題 F-3】

まずは、「ファイル」→「アプリケーションの新規作成」を選び、その後次のようにコンポーネントを配置して下さい。

コンポーネント Name プロパティ
「暗くする」ボタン ButtonDarken
左のパネル Panel1
右のパネル Panel2

とりあえず、このユニットを kisof_3_f という名前で保存してください。

このプログラムでは、前節までの customcolor ユニットを使います。「プロジェクト」→「プロジェクトに追加」で customcolor ユニットを追加しておき、kisof_3_f ユニットの implementation 部に次のように書き加えておいて下さい。

implementation

uses customcolor;

{$R *.DFM}

更に、FormCustomColorVisible プロパティは True にしておいて下さい。

最初は、「暗くする」ボタンを押すとパネルの色が FormCustomColor に取り込まれるようにします。

このように FormCustomColor の外部から色を取り込むため、 SetColor というメソッドを作ります。このメソッドは

// 「暗くする」ボタン
procedure TForm1.ButtonDarkenClick(Sender: TObject);
begin
  FormCustomColor.SetColor(Panel1.Color);
end;

というように色を引数として呼び出された後、RGB 及び HSV を自動的に計算するメソッドとします。このとき、FormCustomColor ユニットのプログラムコードは次のようになります。

type
  TFormCustomColor = class(TForm)
    PanelDisplay: TPanel;
    ButtonDisplay: TButton;
    SpinEditColor: TSpinEdit;
    LabelR: TLabel;
    LabelG: TLabel;
    LabelB: TLabel;
    SpinEditR: TSpinEdit;
    SpinEditG: TSpinEdit;
    SpinEditB: TSpinEdit;
    LabelHue: TLabel;
    LabelSaturation: TLabel;
    LabelValue: TLabel;
    EditH: TEdit;
    EditS: TEdit;
    EditV: TEdit;
    ButtonRGBtoHSV: TButton;
    ButtonHSVtoRGB: TButton;
    procedure ButtonDisplayClick(Sender: TObject);
    procedure ButtonRGBtoHSVClick(Sender: TObject);
    procedure ButtonHSVtoRGBClick(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    procedure SetColor(x: TColor);
  end;

〔中略〕

// 色をセットする
procedure TFormCustomColor.SetColor(x: TColor);
begin
  SpinEditColor.Value := x;
                                  
                                  
                                  
                                  
                                  
  ButtonRGBtoHSVClick(ButtonDisplay);
end;

空欄部分の処理を自分で考えて下さい。

ヒント

出来上がったら、「暗くする」ボタンを押して FormCustomColor に色が取り込まれることを確認しましょう。

【基礎課題 F-4】

以下の「暗くする」ボタンのイベントハンドラを完成させ、明るさが半分の色が右のパネルに現れるようにして下さい。

// 「暗くする」ボタン
procedure TForm1.ButtonDarkenClick(Sender: TObject);
begin
  FormCustomColor.SetColor(Panel1.Color);
                                  
                                  
                                  
end;

ヒント ユニット FormCustomColor 内で定義した、RGBとHSVの変換を行う手続きを利用すれば良いのです。

 

【基礎課題 F-5】

FormCustomColorDarken という関数を作り、

// 「暗くする」ボタン
procedure TForm1.ButtonDarkenClick(Sender: TObject);
begin
  FormCustomColor.SetColor(Panel1.Color);
  Panel2.Color := FormCustomColor.Darken;
end;

とするだけで暗い色が取り出せるようにして下さい。

【基礎課題 F-6】

フォームに新たに「減衰率」欄 (名前は EditRate) を付け加え、これが 0.5 なら
今まで通り明度が半分になるが、
もし 0.8 なら
明度が8割になる、というように明度の減衰率を指定できるプログラムに変更して下さい。

この場合、関数 Darken の定義は次のように変更する必要があります。

  public
    { Public 宣言 }
    procedure SetColor(x: TColor);
    function Darken(Rate: Real): TColor;
  end;

ここまでのプログラムをダウンロード(D)