"كائن متغير أو باستخدام متغير كتلة لم يتم تعيينها" خطأ وقت التشغيل في VB6
-
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
قبل البيان الختامي التحديد (المخرجات)