2

VB6に問題があります。複数の ComboBox オブジェクトを含むフォームがあります。SQL クエリをパラメーターとして受け取る関数を使用して ComboBoxes を作成したいと考えています。したがって、コードは次のようになります

Private Function FillComboBoxFromMDB(ByVal sDBName As String, _
                                     ByVal sSQL As String) As ComboBox
    '/*
    ' * Execute SQL in MDB and fill the ComboBox with the results
    ' * Returns filled ComboBox
    ' */
    Dim DB As Database
    Dim DBRecordset As Recordset

    On Error GoTo FillComboBoxFromMDB_ErrHandler

    Set DB = OpenDatabase(sDBName, False, False)

    If Not DB Is Nothing Then
        Set DBRecordset = DB.OpenRecordset(sSQL)
        If Not DBRecordset Is Nothing Then
            If DBRecordset.RecordCount > 0 Then
                Call FillComboBoxFromMDB.AddItem(DBRecordset.Fields(0).Value)
                ' ^^ This row gives the "Object variable or With block variable not set"
            End If
        Else
            Call WriteLog("Unable to execute " & sSQL)
        End If
        DB.Close
    Else
        Call WriteLog("Unable to open " & sDBName)
    End If

    Exit Function
FillComboBoxFromMDB_ErrHandler:
    Call WriteLog("FillComboBoxFromMDB() error: " & Err.Number & " " & Err.Description)
End Function

このように関数を呼び出します。

Private Function Test()
    ' Fill the combobox
    frmMyForm.cmbMyCombo = FillComboBoxFromMDB("Database.mdb", _
                                               "SELECT MyTable.MyText FROM MyTable")
End Function

したがって、基本的にこれがインスタンス化に帰着することは理解していますが、オンラインで役立つものは何も見つかりませんでした。New キーワードは、VB.Net で機能するようには機能しません。関数が機能するように FillComboBoxFromMDB コンボボックスをインスタンス化するにはどうすればよいですか? それは可能ですか?

前もって感謝します!

4

5 に答える 5

7

FillComboBoxFromMDBあなたのコードは、識別子が Test プロシージャの割り当ての左側にあるコンボボックスへの参照を取得したという信念を表現しています。

これは、FillCombBoxFromMDB が Nothing の状態で関数が最初に実行される場合ではなく、結果を左側に割り当てようとして (そして失敗して) しまいます。

コンボボックスをパラメーターとして渡す必要があります。

Private Sub FillComboBoxFromMDB(ByVal sDBName As String, _
                                     ByVal sSQL As String, ByVal cbo As ComboBox)
    '/*
    ' * Execute SQL in MDB and fill the ComboBox with the results
    ' * Returns filled ComboBox
    ' */
    Dim DB As Database
    Dim DBRecordset As Recordset

    On Error GoTo FillComboBoxFromMDB_ErrHandler

    Set DB = OpenDatabase(sDBName, False, False)

    If Not DB Is Nothing Then
        Set DBRecordset = DB.OpenRecordset(sSQL)
        If Not DBRecordset Is Nothing Then
            If DBRecordset.RecordCount > 0 Then
                Call cbo.AddItem(DBRecordset.Fields(0).Value)
                ' ^^ This row gives the "Object variable or With block variable not set"
            End If
        Else
            Call WriteLog("Unable to execute " & sSQL)
        End If
        DB.Close
    Else
        Call WriteLog("Unable to open " & sDBName)
    End If

    Exit Sub
FillComboBoxFromMDB_ErrHandler:
    Call WriteLog("FillComboBoxFromMDB() error: " & Err.Number & " " & Err.Description)
End Sub

次のように呼び出します:-

 Private Function Test()
 ' Fill the combobox
 Call FillComboBoxFromMDB("Database.mdb", _
                          "SELECT MyTable.MyText FROM MyTable", _
                          frmMyForm.cmbMyCombo ) 
 End Function
于 2009-07-30T13:22:42.833 に答える
1

Q: AddItem を呼び出す前に、FillComboBoxFromMDB は何に設定されていますか?
A: 何もありません。そのため、エラーが発生します。

のような変数を定義してみてください

Dim Value as ComboBox

次に、これで AddItem を呼び出します

Value.AddItem(...)

次に、関数の最後に

FillComboBoxFromMDB = Value

または、使用しようとしていたような戻り値の型を使用したくない場合は、他の答えとして。

于 2009-07-30T13:23:54.067 に答える
1

戻り値の型が であると主張する関数がありますが、ComboBox実際に戻り値を設定した場所はどこにもありません。戻り値は設定されていないため、 になるNothingため、アクセスするとエラーになります。

あなたが提供するユースケースから、あなたが望むのは既存のコンボボックスで動作するヘルパーサブルーチンだと思います。したがって、次のように呼び出します。

' Fill the combobox
FillComboBoxFromMDB(frmMyForm.cmbMyCombo, _
                    "Database.mdb", _
                    "SELECT MyTable.MyText FROM MyTable")

サブルーチン自体には、次のような署名があります。

Private Sub FillComboBoxFromMDB(ByVal cbo As ComboBox, _ ByVal sDBName As String, _ ByVal sSQL As String)

Sub( ではないことに注意してくださいFunction)。あなたが持っているサブルーチンの本体内

 Call FillComboBoxFromMDB.AddItem(DBRecordset.Fields(0).Value)

代わりに

 cbo.AddItem(DBRecordset.Fields(0).Value)

ComboBoxサブルーチンに渡されたに作用します。

于 2009-07-30T13:27:05.093 に答える
1

私はvb6で同じ問題に直面し、解決策も見つけました。

問題の背後にある理由は、

私のストアド プロシージャには複数の select ステートメントがありました。

解決策 :SET NOCOUNT ONストアド プロシージャの開始時とSET NOCOUNT OFF最後の選択 (出力) ステートメントの直前で使用しました。

于 2011-11-10T08:54:46.747 に答える