2

VB.Netアプリケーションを翻訳しているので、フォームのすべてのコントロールをループする必要があります。次のような再帰関数を使用する

Public Sub TranslateControl(ByVal Ctrl As Control)
    For Each ChildCtrl As Control In Ctrl.Controls
        ChildCtrl.Text = Translate(ChildCtrl.Text)

        If TypeOf ChildCtrl Is Label Then
            CType(ChildCtrl, Label).Tag = Translate(CType(ChildCtrl, Label).Tag)
        End If

        TranslateControl(ChildCtrl)
    Next
End Sub

非常にうまく機能しますが、CommonDialogオブジェクトなどのオブジェクトは含まれていませんFolderBrowser。これらのオブジェクトにアクセスするにはどうすればよいですか?私はこれを試しました

    For Each ChildDialog As CommonDialog In Ctrl.Controls
        ChildDialog.Tag = Translate(ChildDialog.Tag)
    Next

CommonDialogしかし、オブジェクトはではないので、明らかに継承の問題がありcontrolsます。

フォームに表示されているすべてのアイテムをループする方法はありますか?

どうもありがとう!

CFP

4

2 に答える 2

1

いいえ、これらはコンポーネントであり、コントロールではありません。それらのコードは実際にはシェル内にあり、MicrosoftによってアンマネージC /C++で記述されています。それらについて管理されているのは、それらを表示して結果を返すために必要なAPI呼び出しを行う小さなラッパーだけです。たとえば、OpenFileDialog。

遭遇する最初の問題は、そのようなダイアログが表示されたときにコードを実行することです。これはダイアログであり、ShowDialog()呼び出しの後、ユーザーがそれを閉じるまで、コントロールはプログラムに戻りません。それはかなりのトリックで可能です。アプローチについては、このスレッドの私のコードを確認してください。前述のように、そのコードは、MessageBoxだけでなく、すべてのシェルダイアログで機能します。

これにより、ダイアログのウィンドウハンドルが取得されます。次に、ダイアログの子ウィンドウを繰り返す必要があります。これは、EnumChildWindowsAPI呼び出しを使用して実行できます。これにより、各子のウィンドウハンドルが得られ、SendMessage()を使用して子に対して何かを行うことができます。それが何であれ、あなたはあなたの質問でそれを指定しませんでした。

于 2010-01-30T13:58:58.437 に答える
-2
 Friend Sub resetFormControls(zForm As Form)

サブルーチンを試して、すべてのコントロールを未使用の状態にリセットしてください:空白のテキストボックス、チェックされていないチェックボックス、ラジオボタンなど。

        For Each zCntl As Control In zForm.Controls
            If zCntl.HasChildren Then
                For Each zChildCntl As Control In zCntl.Controls
                    If zChildCntl.GetType Is GetType(CheckBox) Then
                        CType(zChildCntl, CheckBox).Checked = False
                    End If

                    If zChildCntl.GetType Is GetType(TextBox) Then CType(zChildCntl, TextBox).Text = ""
                    If zChildCntl.GetType Is GetType(TextBox) Then CType(zChildCntl, TextBox).BackColor = Color.White
                    If zChildCntl.GetType Is GetType(RichTextBox) Then CType(zChildCntl, RichTextBox).Text = ""
                    If zChildCntl.GetType Is GetType(RichTextBox) Then CType(zChildCntl, RichTextBox).BackColor = Color.White
                    If zChildCntl.GetType Is GetType(RadioButton) Then CType(zChildCntl, RadioButton).Checked = False

                Next
            End If
            If zCntl.GetType Is GetType(CheckBox) Then CType(zCntl, CheckBox).Checked = False
            If zCntl.GetType Is GetType(TextBox) Then CType(zCntl, TextBox).Text = ""
            If zCntl.GetType Is GetType(TextBox) Then CType(zCntl, TextBox).BackColor = Color.White
            If zCntl.GetType Is GetType(RichTextBox) Then CType(zCntl, RichTextBox).Text = ""
            If zCntl.GetType Is GetType(RichTextBox) Then CType(zCntl, RichTextBox).BackColor = Color.White
            If zCntl.GetType Is GetType(RadioButton) Then CType(zCntl, RadioButton).Checked = False
            If zCntl.GetType Is GetType(DateTimePicker) Then CType(zCntl, DateTimePicker).Text = Now.Date
            If zCntl.GetType Is GetType(ComboBox) Then CType(zCntl, ComboBox).SelectedIndex = 0

        Next
        Application.DoEvents()

    Catch ex As Exception

    End Try
End Sub
于 2014-05-14T18:11:54.003 に答える