“Variable objet ou variable bloc with non définie” erreur d'exécution en VB6
J'ai un problème avec VB6. J'ai un formulaire avec plusieurs zone de liste déroulante des objets. Je souhaite pour remplir les zones de liste modifiables via une fonction qui prend une requête SQL en tant que paramètre. Ainsi, le code ressemble à ceci
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
J'ai appeler la fonction comme ceci.
Private Function Test()
' Fill the combobox
frmMyForm.cmbMyCombo = FillComboBoxFromMDB("Database.mdb", _
"SELECT MyTable.MyText FROM MyTable")
End Function
Donc, fondamentalement, je comprends que cela revient à l'instanciation, mais je n'ai pas trouvé quelque chose d'utile en ligne. Le Nouveau mot-clé ne fonctionne pas comme il fonctionne dans VB.Net. Comment puis-je créer une instance de la FillComboBoxFromMDB combobox, de sorte que la fonction va travailler? Est-il même possible?
Merci d'avance!
Félicitations! Vous avez exécuté dans l'un des VB6 deux messages d'erreur! (La seule autre est "il n'y a pas de méthode '~' objet '~'".)
N'oubliez pas 'ActiveX erreur 429' 🙂
Eh bien, c'est l'un des plus amusantes, ouais. J'adore ces anciens projets à partir de l'année 2000 pour ajouter des fonctionnalités....
Nous avons tous été là, Gert, nous sentir votre douleur. 🙂
N'oubliez pas 'ActiveX erreur 429' 🙂
Eh bien, c'est l'un des plus amusantes, ouais. J'adore ces anciens projets à partir de l'année 2000 pour ajouter des fonctionnalités....
Nous avons tous été là, Gert, nous sentir votre douleur. 🙂
OriginalL'auteur Gert | 2009-07-30
Vous devez vous connecter pour publier un commentaire.
Vous code exprime la conviction que l'identificateur
FillComboBoxFromMDB
a acquis une référence à la zone de liste déroulante sur le côté gauche de l'affectation dans la procédure de Test.Ce n'est pas le cas, la fonction ne s'exécute d'abord avec FillCombBoxFromMDB Rien une fois qu'il allait tenter (et l'échec), d'affecter le résultat de la gauche.
Vous avez besoin pour passer la zone de liste déroulante en tant que paramètre.
L'appeler comme ceci:-
Aucun point ayant une fonction si vous ne pouvez pas faire n'importe quoi avec sa valeur de retour. Zones de liste modifiables en VB6 ne sont pas des choses que vous pouvez créer et attribuer à l'instar d'autres valeurs. Comme vous pouvez le voir j'ai déjà converti à un Sous
Ouais, je voulais juste savoir si il y avait d'une certaine façon. J'ai eu un pressentiment que ce ne serait pas jouer. Merci pour le dissiper.
Même si je suis d'accord que vous ne pouvez pas créer une zone de liste déroulante que vous pouvez un objet normal (avec une Nouvelle déclaration), pourquoi ne pouvez pas vous passer?
Il n'y a aucune raison que vous ne pouvez pas passer, je suis de passage dans une dans le code ci-dessus.
OriginalL'auteur AnthonyWJones
Que le problème avec le travail avec vb6 contrôles de formulaire, ils ne peuvent être instancié dans un formulaire. Ce foutu horseshit! Oh oui, vous pouvez enregistrer la DLL que les contrôles se trouvent. Amusez-vous! J'ai couru avec de la socket tcp/ip.
Ma solution a été de créer un SocketDriver interface. Créer un formulaire et placez le support sur la forme. Rendre invisible le formulaire. Mettre en œuvre les SocketDriver interface sur le formulaire. Maintenant, vous pouvez passer à la SocketDriver autour de.
J'aime Anthony réponse, sauf que j'aurais créé une interface nommée "DataFiller' avec une méthode.
Puis le mettre en œuvre sur votre formulaire.
Maintenant utiliser la Signature
Par l'utilisation de l'interface, vous pouvez en avoir la séparation des préoccupations. Vos données d'accès ne sait rien à propos des formulaires ou des contrôles et votre froms et les contrôles ne sait plus où que les données proviennent d', car la dépendance est sur une interface
OriginalL'auteur Gutzofter
Q: Quelle est FillComboBoxFromMDB avant que vous appelez AddItem?
R: Rien, c'est pourquoi vous obtenez le message d'erreur
Essayer de définir une variable comme
Puis l'appel de la AddItem sur ce
puis à la fin de la fonction ont
Ou l'autre réponse, si vous ne voulez pas utiliser un type de retour comme vous étiez en train d'utiliser.
Cela ne fonctionne pas comme
Dim Value As ComboBox
ne pas instancier une nouvelleComboBox
.Yep, c'est ce que je voulais dire.
Oui désolé exemple, il n'était pas destiné à être un exemple de travail mais de pointer dans la bonne direction, car je n'ai pas de VB à la main au moment de répondre. Grâce à d'autres intervenants pour s'en rendre compte, j'espère qu'elle a été un peu utile!
OriginalL'auteur RoguePlanetoid
Vous avez une fonction qui prétend que son type de retour est
ComboBox
, mais je ne peux pas voir n'importe où où vous avez jamais réellement définir la valeur de retour. Puisque la valeur de retour n'est jamais défini, il seraNothing
, par conséquent votre erreur lorsque vous y accédez.À partir du cas d'utilisation que vous fournissez, je pense que ce que vous voulez est d'une aide de sous-routine qui fonctionne sur un existant zone de liste déroulante. Donc vous l'appeler comme ceci:
et de la sous-routine elle-même aurait une signature comme ceci:
Privé Sous FillComboBoxFromMDB(ByVal cbo Comme zone de liste déroulante, _
ByVal sDBName as String, _
ByVal sSQL Comme une Chaîne de caractères)
(notez que c'est un
Sub
pas unFunction
). Dans le corps du sous-programme, où vous avezplutôt
à la loi sur la
ComboBox
qui a été adoptée dans la sous-routine.OriginalL'auteur AakashM
J'ai fait face à un même problème en vb6 et trouvé une solution.
La raison derrière le problème a été,
ma procédure stockée a plusieurs instructions select.
Solution : j'ai utilisé
SET NOCOUNT ON
dans la création de la procédure stockée etSET NOCOUNT OFF
juste avant la sélection finale (de sortie) de la déclaration.OriginalL'auteur Vibin Davis