"كائن متغير أو باستخدام متغير كتلة لم يتم تعيينها" خطأ وقت التشغيل في VB6

StackOverflow https://stackoverflow.com/questions/1206526

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا عندي مشكلة مع VB6. لدي نموذج مع عدة كائنات تحرير وسرد عليه. وأود أن ملء كومبوبوكسيس عبر دالة التي تأخذ استعلام SQL كمعلمة. حتى رمز يشبه هذا

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

وذلك أساسا أنا أفهم أن هذا الأمر الى انخفاض مثيل، ولكن لم أجد أي شيء مفيد حول هذا الموضوع على الانترنت. لا يعمل الكلمة الجديدة مثل أنه يعمل في VB.Net. كيف يمكنني مثيل منسدل FillComboBoxFromMDB ذلك أن وظيفة ستعمل؟ هل من الممكن؟

ويرجع الفضل في ذلك مسبقا!

هل كانت مفيدة؟

المحلول

وأنت رمز يعبر عن الاعتقاد بأن FillComboBoxFromMDB معرف اكتسب إشارة إلى منسدل على الجانب الأيسر من التعيين في إجراء الاختبار.

وهذا ليس هو الحال فإن وظيفة تنفيذ أول مع FillCombBoxFromMDB كونها لا شيء مرة واحدة انها ستحاول (وفشل) لتعيين النتيجة إلى الجانب الأيسر.

وتحتاج إلى تمرير منسدل كمعلمة.

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

نصائح أخرى

وهذا المشكلة مع العمل مع عناصر تحكم النموذج VB6، ويمكن إنشاء مثيل إلا في النموذج. ما فرياكين 'horseshit! أوه نعم يمكنك تسجيل DLL أن الضوابط الموجودة في. نلهو مع ذلك! جريت إلى هذا مع برنامج التعاون الفني / الملكية الفكرية المقبس.

وكان لي حل لإنشاء واجهة SocketDriver. إنشاء نموذج ووضع مقبس في النموذج. جعل النموذج غير مرئية. تطبيق واجهة SocketDriver في النموذج. الآن يمكنك تمرير SocketDriver حولها.

وأحب الإجابة أنتوني، إلا أنني من شأنه أن يخلق واجهة اسمه 'DataFiller "مع أسلوب واحد.

Public Sub AddItem(item As String)
End Sub

وبعد ذلك تنفيذ على النموذج الخاص بك.

Public Sub AddItem(item As String)
   cmbMyCombo.AddItem(item)
End Sub

والآن استخدام التوقيع

Private Sub FillComboBoxFromMDB(ByVal sDBName As String, _
                                 ByVal sSQL As String, ByVal injectWith As DataFiller)
   'yada yada code

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

   'yada yada code

End Sub

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

وباستخدام واجهة يمكن أن يكون لديك بعض فصل الاهتمامات. وصول إلى البيانات لا يعرف شيئا عن أشكال أو الضوابط والخاص الإستبانة والضوابط لا يعرف من أين جاءت تلك البيانات من لأن التبعية على واجهة

س: ما هو وضع FillComboBoxFromMDB إلى قبل استدعاء AddItem
A: لا شيء، وهذا هو السبب في أنك تحصل على الخطأ

وحاول تحديد متغير مثل

Dim Value as ComboBox

وثم استدعاء AddItem على هذا

Value.AddItem(...)

وبعد ذلك في نهاية الدالة ديك

FillComboBoxFromMDB = Value

وأو كما إجابة أخرى إذا كنت لا ترغب في استخدام نوع الإرجاع كما لو كنت تحاول استخدامه.

لديك وظيفة التي تدعي أن نوع عودتها هو ComboBox، ولكن لا أستطيع أن أرى أي مكان حيث كنت من أي وقت مضى في الواقع تعيين قيمة الإرجاع. منذ تم تعيين قيمة الإرجاع أبدا، سيتم Nothing ذلك، وبالتالي خطأ الخاص بك عند الوصول إليه.

ومن حالة استخدام لكم العرض، وأعتقد أن ما تريده هو روتين المساعد الذي يعمل على القائمة منسدل. لذلك كنت أسميها مثل هذا:

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

وسيكون روتين نفسها على توقيع مثل هذا:

والخاص الفرعية FillComboBoxFromMDB (الأساسية ByVal البنك المركزي العماني وتحرير وسرد _                                 الأساسية ByVal sDBName وسلسلة، _                                 الأساسية ByVal sSQL كسلسلة)

و(لاحظ أنه هو Sub ليس Function). داخل الجسم من روتين، حيث لديك

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

وبدلا من ان

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

وللعمل على ComboBox الذي تم تمريره إلى روتين.

وأنا واجهت نفس المشكلة في VB6 وجدت حلا للغاية.

وكان السبب وراء هذه القضية،

وكان الإجراء المخزن بلدي بيانات مختارة متعددة.

والحل: كنت SET NOCOUNT ON في البداية من الإجراء المخزن وSET NOCOUNT OFF قبل البيان الختامي التحديد (المخرجات)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top