5

テキストボックスにテキストが入力されたときに非同期でクエリを実行するフォームを作成しましたが、「コントロールにフォーカスがない限り、コントロールのプロパティまたはメソッドを参照できません」というエラーがスローされるように思われます。

すぐに関連するコードは次のとおりです。

Dim UpdateRequested As Boolean
Dim qryText As String

.
.
.

Private Sub txtBox_Change()
    qryText = txtBox.Text
    UpdateRequested = true
End Sub

省略記号内のどこかは、ADODB レコード セットの動的な読み込み、ローカル テーブルへの入力、およびサブ フォームの更新を処理するコードです。ただし、このコードを無効にしても問題は解決しません。エラーが発生することがあります。時々私はしません。

これは、データベースを閉じて再度開くことで持続するようです。再び機能し始めるたびに、デバッガーでコードをいじっていたことが原因ですが、正確に何が原因で魔法のように「正常に機能する」のか、またはまったく機能しないのかはわかりません。

アップデート

さらに不可解にするために、いくつかの単純なイベント ハンドラーを追加しました。

Private Sub txtBox_GotFocus()
    MsgBox "Got focus"
End Sub

Private Sub txtBox_LostFocus()
    MsgBox "Lost focus"
End Sub

フォームを実行します。テストボックスをクリックします。「Got focus」というメッセージが表示されます。入力するとすぐに、上記のエラーが表示されます。フォームを再度開くと、問題のテキスト ボックス (それ自体はバインドされていません) とサブ フォームのバインドされたテキスト ボックスの間をクリックすると、期待どおりに「フォーカスを得ました」メッセージと「フォーカスを失った」メッセージの両方が表示されます。さらに、"Screen.ActiveControl.Name" の現在の値を含むメッセージ ボックスを表示すると、Text プロパティにアクセスする直前に予想される名前が表示されます。

4

6 に答える 6

5

という名前のテキスト ボックスtxtFooをフォームに追加しました。その変更イベントの手順は次のとおりです。

Private Sub txtFoo_Change()
    Debug.Print "Value: " & Nz(Me.txtFoo.value, "*Null*") & _
        "; Text: " & Nz(Me.txtFoo.Text, "*Null*")
End Sub

次に、txtFoo(IOW の値は Null) に何も入力せずに「abc」と入力するtxtFooと、イミディエイト ウィンドウに次のように表示されます。

Value: *Null*; Text: a
Value: *Null*; Text: ab
Value: *Null*; Text: abc

基本的に、テキスト ボックスに追加する各文字はその変更イベントをトリガーし、テキスト ボックスの現在の内容をイミディエイト ウィンドウに出力します。

私が理解している限り、あなたは似たようなことをしたいと思っています...ただし、代わりに別のアクションが必要ですDebug.Print。変更イベント プロシージャをもう一度見て、私のものと比較してください。

Private Sub txtBox_Change()
    qryText = txtVendorName.Text
    UpdateRequested = true
End Sub

これは、 という名前のコントロールの変更イベントですtxtBox。そのプロシージャ内で、.Textという名前のコントロールのプロパティを参照しますtxtVendorName。ただし、その変更イベント コードが実行された時点でアクティブなコントロールです。アクティブなコントロールではないため、のプロパティにtxtBoxアクセスできません。.TexttxtVendorName

この問題が 1 つのフォームでのみ発生し、他の新しいフォームでは発生しないことを考えると、問題のフォームが破損している可能性があります。この SO の質問に対する 2 つの回答を読み、破損を修復するために逆コンパイルを試みます: HOW TO decompile and recompile。逆コンパイルは、開発中の日常的な作業として推奨されることがよくあります。

文書化されていないApplication.SaveAsText方法を使用して、フォームをテキスト ファイルとして保存することもできます。不正なフォームを削除しApplication.LoadFromText、保存したテキスト コピーをインポートするために使用します。

何か問題が発生した場合に備えて、db ファイルのバックアップ コピーがあることを確認してください。

于 2012-07-23T19:57:20.820 に答える
3

コントロールの Text プロパティを設定または取得するには、コントロールにフォーカスがある必要があります。フォーカスがない場合、エラーが発生します。
コントロールにフォーカスを移動するには、 txtBox.SetFocusまたはを使用できますDoCmd.GoToControl "txtBox"

また、Text プロパティは常に使用できるとは限りません。
コントロールにフォーカスがある間、Text プロパティには現在コントロール内にあるテキスト データが含まれます。Value プロパティには、コントロールの最後に保存されたデータが含まれています。フォーカスを別のコントロールに移動すると、コントロールのデータが更新され、Value プロパティがこの新しい値に設定されます。その後、コントロールが再びフォーカスを取得するまで、Text プロパティの設定は使用できなくなります。

于 2012-07-23T18:43:07.600 に答える
1

フォームには残留データ ソースがありました。特にテキスト ボックス コントロールがバインドされていないことを考えると、これが上記の動作を引き起こす理由はわかりませんが、データ ソースを削除したため、テキスト ボックスは期待どおりに動作しています。

于 2012-07-23T21:08:39.353 に答える
-1

私の答えが古くなっていることは知っています。それでも、フォーカスを設定できるのは 3 回だけです。ヘッダーの TextBox で、詳細スペースの任意の texbox で、ヘッダーの TextBox で再び。アクセス2003を使用しています。

于 2016-03-20T03:09:52.320 に答える