コンポーネントのプロパティやTextの変更について

解決


Msun  2006-09-19 16:59:19  No: 23273

複数のコンポーネントの同じプロパティを変更する下記のようなプロシジャー処理を関数化する方法を教えてください。
procedure TFormSetup.CheckBoxRm001Click(Sender: TObject);
begin
  if CheckBoxRm001.Checked                  //ここから
    then
      begin
        CheckBoxRm001.Color := clLime;
      end
    else
      begin
        CheckBoxRm001.Color := clBtnFace;
      end                                   //ここまで
  ;
end;

procedure TFormSetup.CheckBoxSetCh01Click(Sender: TObject);
begin
  if CheckBoxSetCh01.Checked                //ここから
    then
      begin
        SpinEditSetCh01.MinValue := 13;
        SpinEditSetCh01.MaxValue := 62;
        SpinEditSetCh01.Value := 13;
      end
    else
      begin
        SpinEditSetCh01.MinValue := 0;
        SpinEditSetCh01.MaxValue := 60;
        SpinEditSetCh01.Value := 0;
      end
  ;                                         //ここまで
end;

procedure TFormSetup.SpinEditSetCh01Change(Sender: TObject);
begin
  if SpinEditSetCh01.Value = 0            //ここから
    then
      EditSetCh01.Text := ' '
  ;                                       //ここまで
end;

よろしくお願いします。


igy  2006-09-19 20:02:42  No: 23274

>procedure TFormSetup.CheckBoxRm001Click(Sender: TObject);
>begin
>  if CheckBoxRm001.Checked                  //ここから
>    then
>      begin
>        CheckBoxRm001.Color := clLime;
>      end
>    else
>      begin
>        CheckBoxRm001.Color := clBtnFace;
>      end                                   //ここまで
>  ;
>end;

では、

procedure TFormSetup.CheckBoxRm001Click(Sender: TObject);
begin
  if TCheckBox(Sender).Checked then
    TCheckBox(Sender).Color := clLime
  else
    TCheckBox(Sender).Color := clBtnFace;
end;

のようなことをしたいのですか?


Msun  2006-09-19 21:23:47  No: 23275

igyさん早速のレスありがとうございます。
したいことは、
procedure TFormSetup.CheckBoxRm001Click(Sender: TObject);
begin
  if CheckBoxRm001.Checked                  //ここから
    then
      begin
        CheckBoxRm001.Color := clLime;
      end
    else
      begin
        CheckBoxRm001.Color := clBtnFace;
      end                                   //ここまで
  ;
end;
      ・
      ・
      ・
      ・
procedure TFormSetup.CheckBoxRm312Click(Sender: TObject);
begin
  if CheckBoxRm312.Checked                  //ここから
    then
      begin
        CheckBoxRm312.Color := clLime;
      end
    else
      begin
        CheckBoxRm312.Color := clBtnFace;
      end                                   //ここまで
  ;
end;
のようにCheckBoxが48個あり、上記のように同じ処理を記述して目的の動作はするのですが、functionにしてcallすればスマートになり、又変更時の対処も容易になるのではと思っています。
アドバイス方よろしくおねがいします。


igy  2006-09-19 22:10:53  No: 23276

CheckBoxRm001 の OnClickイベントは、
上で挙げた

procedure TFormSetup.CheckBoxRm001Click(Sender: TObject);
begin
  if TCheckBox(Sender).Checked then
    TCheckBox(Sender).Color := clLime
  else
    TCheckBox(Sender).Color := clBtnFace;
end;

を使い、

(1)コード上から、残りの47個すべてに対し、
  CheckBoxRmXXXXX.OnClick = CheckBoxRm001Click;
のように指定するか、

(2)Shift+Clickで残りの47個すべてを選択状態にして、
オブジェクトインスペクタ:イベントの「OnClick」欄で
CheckBoxRm001Clickを選択する。

でどうでしょう?


ofZ  2006-09-20 02:22:09  No: 23277

igyさんのイベント共有が望ましいが、質問にそのまま答えるならコレ

procedure CheckBoxClick(aCheckBox: TCheckBox);
  if aCheckBox.Checked                  //ここから
    then
      begin
        aCheckBox.Color := clLime;
      end
    else
      begin
        aCheckBox.Color := clBtnFace;
      end                                   //ここまで
  ;
end;

procedure TFormSetup.CheckBoxRm001Click(Sender: TObject);
begin
  CheckBoxClick(CheckBoxRm001);
end;

もっとも、このような関数化したとしても以下のようにした方がきれいです。

procedure TFormSetup.CheckBoxRm001Click(Sender: TObject);
begin
  CheckBoxClick(TCheckBox(Sender));
end;

> (1)コード上から、残りの47個すべてに対し、
>   CheckBoxRmXXXXX.OnClick = CheckBoxRm001Click;
> のように指定するか、

> (2)Shift+Clickで残りの47個すべてを選択状態にして、
> オブジェクトインスペクタ:イベントの「OnClick」欄で
> CheckBoxRm001Clickを選択する。


Msun  2006-09-20 12:22:45  No: 23278

igyさん、ofZさんご教示ありがとうございました。今後とも何卒よろしくお願いします。


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

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






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