[delphi-users:3694] GropBox上の全てのボタンのEnabledを一気に切り替えるには?

356 views
Skip to first unread message

ToMo

unread,
Mar 4, 2014, 11:11:05 PM3/4/14
to delphi...@freeml.com
こんにちは、いつもお世話になります。
Win7 x64 XE3を使っています。

GropBox1上に複数のボタンを配置しています。
このGropBox上の全てのボタンのEnabledのtrue/falseの切り替えを
一気に行いたいです。

単純に、GropBox1.Enabled:=false; とすると、
確かにボタンは押せなくなりますが見た目が変わりません。
(見た目は「押すことのできるボタンのまま」です)


GropBox上の全てのボタンを一気に、押せなさそうなボタンに変えたいのですが、
どういう方法がありますでしょうか。

アドバイスを頂けると助かります。
よろしくお願いいたします。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
BMW厳選のプレゼントを、総計110名様へ。
http://ad.freeml.com/cgi-bin/sa.cgi?id=kWwPi
------------------------------------------------------[freeml byGMO]--

7of9

unread,
Mar 5, 2014, 12:18:05 AM3/5/14
to delphi...@freeml.com
こんにちは,7of9(セブンオブナイン)です。


力技での対応なら思いつきました。


以下のフォームがあるとします。
- B_disable : TButton -- GroupBox1のコンポーネントをDisabledにする機能
- GroupBox1 : TGroupBox -- 以下の3つのコンポーネントを持つ
+ RadioButton1 : TRadioButton
+ CheckBox1 : TCheckBox
+ Button2 : TButton


B_disableのOnClickで以下のような処理をします。

-----
procedure TForm1.B_disableClick(Sender: TObject);
var
loop: Integer;
className: String;
begin
for loop := 0 to (GroupBox1.ControlCount - 1) do begin
className := GroupBox1.Controls[loop].ClassName;
if (Pos(className, 'TButton') >0) then begin
GroupBox1.Controls[loop].Enabled := false;
end;

if (Pos(className, 'TCheckBox') >0) then begin
GroupBox1.Controls[loop].Enabled := false;
end;
end;
end;
-----

上記の例では、TButtonかTCheckBoxのタイプのみDisabledにします。

コンポーネントのタイプを調べるのが面倒な場合は、GroupBox1上のDisabledにしたいコンポーネントのTagの値を同じ値(例えば99)にしておいて、

if (GroupBox1.Controls[loop].Tag == 99) then begin
GroupBox1.Controls[loop].Enabled := false;
end;

のようにしてもいいかもしれません。




MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
夫婦で≪温泉≫1泊2食100円~!京都・箱根などなど
http://ad.freeml.com/cgi-bin/sa.cgi?id=kWxDZ
------------------------------------------------------[freeml byGMO]--

じゃぺ

unread,
Mar 5, 2014, 12:20:42 AM3/5/14
to delphi...@freeml.com
川上です

(Falseの場合だけ・・・)
別途GroupBox1以外にButtonFを置いて

procedure TForm1.ButtonFClick(Sender: TObject);
var
i:integer;
begin
for i:=0 to groupbox1.ControlCount-1 do begin
if(groupbox1.Controls[i].ClassType=TButton)then begin
TButton(groupbox1.Controls[i]).Enabled:=False;
end;
end;
end;

こんなかんじでいかがでしょう?


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
BMW厳選のプレゼントを、総計110名様へ。
http://ad.freeml.com/cgi-bin/sa.cgi?id=kWxFX
------------------------------------------------------[freeml byGMO]--

windy

unread,
Mar 5, 2014, 12:21:26 AM3/5/14
to delphi...@freeml.com
windyです。

残念ですが、VCLではVB6や.NETのGroupBoxのような動作にはなりま
せん。
確かに押せなくはなるんですが、見た目が変わらないんですよね。

GroupBoxのControlsプロパティで子コントロールが取得できるので、
GroupBoxのEnabled設定時に全ての子コントロールのEnabledも明示
的に設定すれば期待する動作になります。

JVCLに含まれるTJvGroupBoxはこの動作を自動で行なってくれます。

但し、この方法では全ての子コントロールのEnabledプロパティを
上書きしてしまうので注意が必要です。

グループボックスの中にEnabledの設定が異なる子コントロールがあ
る時に上記の処理を行なうと全ての子コントロールのEnabledが同じ
になってしまうという事です。
TJvGroupBoxを使ってもこの動作は同じです。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
夫婦で≪温泉≫1泊2食100円~!京都・箱根などなど
http://ad.freeml.com/cgi-bin/sa.cgi?id=kWxGz
------------------------------------------------------[freeml byGMO]--

ToMo

unread,
Mar 5, 2014, 12:32:07 AM3/5/14
to delphi...@freeml.com
7of9さん、じゃぺさん、windyさん

そう、まさに「.NETのGroupBoxのような動作にならなくて」
悩んでいました。
子コントロールが取得できる方法があることを初めて知りました。
これは色々と使えそうです。

ありがとうございました。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
BMW厳選のプレゼントを、総計110名様へ。
http://ad.freeml.com/cgi-bin/sa.cgi?id=kWxPy
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Mar 5, 2014, 12:34:58 AM3/5/14
to delphi...@freeml.com
ToMoさん、7of9さん、川上さん。

細川です。

一括で Enabled を変更するならば、is を使った方が簡単なのでは……。


procedure TForm1.Button2Click(Sender: TObject);
var
Control: TControl;
i: Integer;
begin
for i := 0 to GroupBox1.ControlCount - 1 do begin
Control := GroupBox1.Controls[i];

if (Control is TButton) then
Control.Enabled := GroupBox1.Enabled;
end;
end;


Regards,
HOSOKAWA Jun
[S/G] SERIALGAMES Inc.
TEL: 03-5812-0980
FAX: 03-5812-0970
twitter: http://twitter.com/serialgames
twitter: http://twitter.com/flaver_sg
mailto: j...@serialgames.co.jp
fla:ver http://flaver.jp/


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
夫婦で≪温泉≫1泊2食100円~!京都・箱根などなど
http://ad.freeml.com/cgi-bin/sa.cgi?id=kWxRk
------------------------------------------------------[freeml byGMO]--

ToMo

unread,
Mar 5, 2014, 12:37:01 AM3/5/14
to delphi...@freeml.com
細川さん

とてもスマートで感動しています。
ありがとうございます。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
BMW厳選のプレゼントを、総計110名様へ。
http://ad.freeml.com/cgi-bin/sa.cgi?id=kWxS8
------------------------------------------------------[freeml byGMO]--

7of9

unread,
Mar 5, 2014, 12:39:59 AM3/5/14
to delphi...@freeml.com

細川さん


ありがとうございます。

 僕のコードに比べて、川上さんのコードが洗練されていると思ったら、
さらに洗練されたのが細川さんの投稿にありました。


 勉強になります。
http://ad.freeml.com/cgi-bin/sa.cgi?id=kWxUE
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages