0

ねえ、私はコードを必要としているように正しく動作させるためにいくつかの助けを必要としています。以下は、ユーザーがテキストボックスをクリックすると、任意の文字をクリックできるキーボードがポップアップ表示され、その文字がテキストボックスに入力されるという私のコードです。問題は、文字の送信先がわかるように、テキストボックスの名前を返すことができないように見えることです。

発砲の順序は次のとおりです。

TextBox1_MouseDown

KeyboardOrPad.runKeyboardOrPad

kbOrPad.keyboardPadType

ClickLetters

Form1.putIntoTextBox

Form1

Private Sub TextBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDown
    Call keyboardOrPad.runKeyboardOrPad("SHOW") 'Just shows the keyboard
    Call kbOrPad.keyboardPadType("PAD", TextBox1)
End Sub

Public Sub putIntoTextBox(ByRef what2Put As String, ByRef whatBox As TextBox)
    whatBox.Text = what2Put '<-- has error Object reference not set to an instance of an object. for the whatBox.text
End Sub

kbOrPadクラス

Dim theBoxName As TextBox = Nothing

Public Sub keyboardPadType(ByRef whatType As String, ByRef boxName As TextBox)
    theBoxName = boxName '<-- shows nothing here
    Dim intX As Short = 1

    If whatType = "PAD" Then
        Do Until intX = 30
            Dim theButton() As Control = Controls.Find("Button" & intX, True)

            theButton(0).Enabled = False
            intX += 1
        Loop
    ElseIf whatType = "KEYB" Then

    End If
End Sub

Private Sub ClickLetters(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim btn As Button = CType(sender, Button)

    If btn.Text = "Backspace" Then

    Else
        Call Form1.putIntoTextBox(btn.Text, theBoxName) 'theBoxName taken from keyboardPadType
    End If
End Sub

あなたのためのいくつかのビジュアル:

ここに画像の説明を入力してください ここに画像の説明を入力してください

Pastebinコード: http: //pastebin.com/4ReEnJB0

4

2 に答える 2

1

theBoxNameそれがモジュールスコープの変数であることを確認してください。そうすれば、共有TextBox MouseDownハンドラーを実装する柔軟性を提供するために、次のようにデータを設定します。

Private Sub TextBox1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDown
    Dim tb As TextBox = CType(sender, TextBox)

    Call keyboardPadType("PAD", tb)
End Sub

このようなものを試してください

Public Class Form1
Dim myKborPad As New kbOrPad

Private Sub TextBox1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDown
    Dim tb As TextBox = CType(sender, TextBox)

    Call myKborPad.keyboardPadType("PAD", tb)
End Sub

PasteBinコードに基づいて編集します。

モジュールでkeyboardPadTypeのインスタンスがすでに宣言されていることに気付きました。前に言ったのではなく、それを使用してください。そのコードは次のようになります。

削除:myKborPadを新しいkbOrPadとして薄暗くする

モジュールで作成したKbOrPadを次のように使用します。

Private Sub TextBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDown
    Dim tb As TextBox = CType(sender, TextBox)

    Call keyboardOrPad.runKeyboardOrPad("SHOW")
    Call theKbOrPad.keyboardPadType("PAD", tb)
    'Call kbOrPad.keyboardPadType("PAD", tb)
End Sub

また、発生している現在のエラーについては、Form1のデフォルトのインスタンスを使用しようとしています。これは、実行している実際のフォームではありません。使用しようとしているメソッドを共有として作成することで、これを回避できます。このような:

Public Shared Sub putIntoTextBox(ByRef what2Put As String, ByRef whatBox As TextBox)
    whatBox.Text = what2Put
End Sub

しかし、私は実際にそれをこのようにあなたのモジュールに入れたいと思います

Public Sub putIntoTextBox(ByRef what2Put As String, ByRef whatBox As TextBox)
    whatBox.Text = what2Put
End Sub

このように呼んでください

Call putIntoTextBox(btn.Text, theBoxName)

上記の変更を行った後、コードは機能しました。

于 2012-06-20T03:14:59.267 に答える
1

まず、ByRefをByValに置き換える必要があります(どちらを使用すべきかわからない場合は、ByValを使用してください)。

次に、メソッドputIntoTextBoxは必要ないと思います。直接実行できるはずです(スレッドの問題が原因で問題が発生する可能性がありますが、説明に基づくとは思われません)。Form1どこに設定されているか(または設定されている場合でも)は表示されません。これは別の潜在的な問題です。

最後に、他のクラスにコールバックするためのより良い方法は、デリゲート/ランバダを使用することです。

(コードはありませんが、応答を機能させるための十分なコンテキストが提供されていないため、テキストを提供しているだけです)。

于 2012-06-20T07:30:08.110 に答える