- ベストアンサー
全てのオブジェクトのプロパティーを一気に変更する方法
フォーム上に配置している全てのオブジェクトのプロパティを 一気に変更したいのですが、何か良い方法はありませんか? 設計段階では全て選択して一気に変更できますよね・・・ しかしながら、run状態で一気に変更する方法が見つかりません。 例として様々な名前ついたオブジェクトをコードで「Enabled=false」に変更したいのですが、この場合はやはり、ひとつのオブジェクトごとにコードを記述しなくてはならないのでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
強引な方法ですが、こんな感じでできます。 Dim objControl As Control On Error Resume Next For Each objControl In Me.Controls objControl.Enabled = False Next フォーム上のコントロールは、Controlsで取得できます。 On Error Resume Nextをかけているのは、コントロールにEnabledプロパティがないものがあるとエラーが発生するためです。 フォーム全体を殺したい場合は、 Me.Enabled = False って方法もありますが、用途が違いますね。
その他の回答 (1)
- y_an
- ベストアンサー率57% (24/42)
そのような方法は今までで聞いた事ありません。 (実はそのような方法があったら申し訳ないのですが...) しかし、そのようなケースに遭遇したことはあります。 その時、私はこのように対処しました。 例えば、テキストボックスやラベルが複数あり、 ある状況によって、使えたり使えなかったりするパターンが 3通りあるとします。 それらをそれぞれ対象のコントロールのTagプロパティに "1","2","4"と設定しておき、 下記に書いたような関数を呼びます。 Private Sub Command1_Click() Call EnabledChange(1) End Sub Private Sub EnabledChange(ByVal lTag As Long) Dim w As Control For Each w In Me 'Form上の全てのコントロールを走査する With w If .tag = "" Or .tag = "0" Then '何もしない Else '使用可不可の設定 .Enabled = ((CLng(.tag) And lTag) > 0) End If End With Next w End Sub これによって、デザイン時に設定したTagプロパティの値で 自動的にEnabledプロパティは一気に変更できます。 また、Tagプロパティを使わずに、 Fremeコントロールの上にコンテナさせて、 このFrameコントロールに乗っているから変更するという方法もあります。 Private Sub Command1_Click() Call EnabledChange(Frame1) End Sub Private Sub EnabledChange(ByVal objFrame As frame) Dim w As Control For Each w In Me 'Form上の全てのコントロールを走査する With w Select Case .Container.Name Case Me.Name 'フォームに乗っているものに関しては何もしない Case objFrame.Name '選択したFrameに乗っているものに関しては使用可にする .Enabled = True Case Else '選択したFrame以外のフレームに乗っているものに関しては '使用不可にする .Enabled = False End Select End With Next w End Sub まるっきり全てのコントロールを使用不可にするのであれば 以下の方法でよいと思います。 Private Sub Command1_Click() Call EnabledChange(False) End Sub Private Sub EnabledChange(ByVal bFlg As Boolean) Dim w As Control For Each w In Me 'Form上の全てのコントロールを走査する With w '使用可不可の設定をする。 .Enabled = bFlg End With Next w End Sub とりあえず、一気にとはいきませんが、 一つ一つ書かなくても良い分、いくらか楽だとは思いますが。 ご参考までに...。
お礼
ご丁寧にありがとうございます。とりあえづためしにやってみましたが あまりうまくいきませんでした。でも、VBの勉強になりました。 ありがとうございました。
お礼
まさに的確な方法をいただきましてありがとうございます。 私がしたかったことが一発で解決です。 フォーム上に50個以上のオブジェクトがあって ある時にだけそのうちの3つのオブジェクト以外は触られたくなかったのです。 この方法で全てをFalseに設定した後に3つだけTrueにするほうがはるかに時間と手間が省けます。 ありがとうございました。