For Eachについて

タグの編集
投稿者 中学生  () 投稿日時 2008/8/24 03:04:00
VB2008を使っています。 
 
フォーム上のコントロールすべてのEnabledを操作する時は 
for each i as object in me.controls 
     i.enabled = false 
next 
 
ですが、コントロールの中でたとえばRadioButton だけの 
Eabledを操作する時はどうすればいいのでしょうか。 
教えてください。
投稿者 るきお  () 投稿日時 2008/8/24 04:31:00
If文でiがRadioButtonであるか判定するのが1つの方法です。 
For Each i As Control In Me.Controls 
    If TypeOf i Is RadioButton Then 
        i.Enabled = False 
    End If 
Next 
 
VB2008ということなので、新しく追加されたOfTypeメソッドを使ってControlsのうちからRadioButtonだけ抜き出すことも簡単にできます。 
 
For Each i In Me.Controls.OfType(Of RadioButton)() 
    i.Enabled = False 
Next 
 
なお、i As XXXXXの部分はVB2008であればAs Objectと自分で指定する必要はありません。指定を省略するとVBが自動的に適切なAs XXXXと解釈して実行してくれまし、可能であればプログラム中で . を打ったタイミングでヒント(入力候補など)も出ます。 
As Objectとすると有用なヒントはでません。 
 
1つ目の例は 
As Object → OK。有用なヒントなし。 
As Control → OK。有用なヒントあり。 
As RadioButton → エラー。(フォームにRadioButtonしかなければOK)。 
省略 → As Objectと解釈されます。(VB2008) 
 
2つ目の例は 
As Object → OK。有用なヒントなし。 
As Control → OK。有用なヒントあり。 
AS RadioButton → OK。有用なヒントあり。 
省略 → As RadioButtonと解釈されます。(VB2008) 
 
以上蛇足でした。
投稿者 中学校  () 投稿日時 2008/8/24 07:26:00
>>1 
ありがとうございます。 
上手くできました。
投稿者 よねKEN  () 投稿日時 2008/8/24 23:01:00
うまくいったとのことなので、Formの上に直接、RadioButtonを複数配置されているのでしょうか。  
 
Formの上にPanelやGroupBoxなどを配置し、  
その中にRadioButtonを配置しているような場合だとこのやり方ではうまくいかないと思います。  
 
例えば、以下のようなメソッドをFormのメソッドとして定義しておきます。  
 
Public Sub DisableRadioButton(ByVal parent As Control)  
    For Each ctrl As Control In Me.Controls  
        If TypeOf ctrl Is RadioButton Then  
            ctrl.Enabled = False  
        End If 
        If ctrl.Controls.Count > 0 Then 
            DisableRadioButton(ctrl)  
        End If 
    Next  
End Sub  
 
その上で、以下のように呼び出せば、そのForm上のすべてのRadioButtonが使用不可になります。  
DisableRadioButton(Me)  
 
Me.Controlsには、そのフォームの上に直接配置されたオブジェクトだけが格納されていますので、再帰的に処理をしないと処理もれが発生することがあります。