2008-11-28 5 views
1

étrange erreur spécifique à une machine particulière ...Erreur d'exécution 0 lors du remplissage d'une zone de liste déroulante dans VB6

J'ai une application dans laquelle la valeur de texte d'une zone de liste déroulante est définie sur le chemin d'un document (c.-à- ..

cmbAIDFile.Text = clsTonyToolkit.GetSetting("ExportAIDFile",gtypmetadata.gcnnCentral) & "" 

Oubliez toute la procédure GetSetting etc, juste qu'il renvoie une ligne de texte et fonctionne très bien.

Cela fonctionne correctement sur toutes les machines, sauf un. Cette machine Vista jette l'erreur d'exécution -time error 0 et jette l'utilisateur hors du programme indépendamment de l'erreur andling sur la procédure. D'autres machines Vista fonctionnent bien.

Toutes les réponses à ce problème prêtant à confusion seraient les bienvenues.


Merci pour votre aide.

La machine exécute Vista Business 64 bits.

L'utilisateur a la possibilité d'obtenir des droits d'administrateur via le contrôle de compte d'utilisateur qui est activé. Suite à vos invites, j'ai essayé d'exécuter l'application en tant qu'administrateur et d'obtenir toutes sortes de réponses étranges (fichiers manquants, dépendances non enregistrées, etc). Avez désinstallé l'application et va essayer de réinstaller. Je pense que les clichés instantanés du dossier peuvent également créer des confusions.

+0

Je l'ai découvert il le fait avec une zone de texte aussi, mais juste cette machine. – Tony

+0

Etes-vous certain que le problème ne se trouve pas dans GetSettings? Vous pouvez essayer d'ajouter le résultat de la fonction à une variable temporaire à findout qui provoque le problème. –

+0

Oui, essayé cela. GetSettings va bien. – Tony

Répondre

1

Quelle est la différence entre les machines vista?

  • Version
  • paramètres
  • permissions utilisateur

Al peut avoir un impact sur le fonctionnement de l'application.

6

Vous cherchez peut-être au mauvais endroit pour l'erreur. Lorsque vous modifiez la propriété Text d'un ComboBox, l'événement Change de ComboBox se déclenchera, si le nouveau texte est différent du texte précédent. Les événements LostFocus et/ou Validate peuvent également se déclencher, en fonction de l'action de votre code et de la configuration de votre formulaire.

Si une erreur se produit dans le gestionnaire d'événements Change (ou dans les LostFocus ou Validate gestionnaires d'événements, si vous faites quoi que ce soit avec eux), le code de gestion des erreurs dans le code qui modifie le texte combobox sera jamais get appelé (cela a à voir avec comment la gestion des erreurs et les événements fonctionnent dans VB6). En règle générale, vous devez toujours mettre un gestionnaire d'erreurs dans chaque routine (Sub, Function ou Property) dans votre code VB6, car vous ne pouvez jamais être sûr que vous allez attraper toutes les erreurs dans le cas contraire.

Voici un exemple rapide qui montre que la gestion des erreurs peut ne pas toujours fonctionner comme vous le pensez dans VB6.

Créer un nouveau projet EXE standard et ajoutez un bouton de commande (Command1) et une zone de liste déroulante (Combo1) à la forme par défaut, et ajoutez le code suivant au formulaire:

Private Sub Combo1_Change() 

    Dim a As Long 
    a = 1/0 '<-- this will cause a divide-by-zero runtime error' 

End Sub 

Private Sub Command1_Click() 

    On Error GoTo MyErrorHandler 

    'Change the combobox text.' 
    'This will cause the Change event to fire' 

    Combo1.Text = "test" 

    Exit Sub 

MyErrorHandler: 
    'This code will not be executed if an error occurs in Combo1_Change...' 
    MsgBox "My error-handler called." 

End Sub 

Si vous compilez le projet et exécutez l'EXE résultant, vous obtiendrez une erreur d'exécution chaque fois que vous cliquez sur Command1 et le programme se terminera. Cela est dû au fait que le code de gestion des erreurs qui a été ajouté (MyErrorHandler dans l'exemple) n'est pas appelé. Toutefois, si vous ajoutez un code de gestion des erreurs au gestionnaire d'événements Combo1_Change, vous pouvez intercepter l'erreur et essayer de la traiter (à tout le moins, vous pouvez empêcher le programme de se bloquer). Par conséquent, je m'assurerais que chaque procédure événementielle comporte un code de gestion des erreurs, et je l'ajouterai si elle est manquante. Cela devrait faciliter la localisation de l'erreur. Par exemple, si vous avez du code dans la procédure événementielle cmbAIDFile_Change, assurez-vous qu'il comporte une gestion des erreurs. J'ajouterais aussi des numéros de ligne à votre code (si vous ne les avez pas déjà): de cette façon, vous pouvez utiliser Erl dans votre code de gestion des erreurs pour obtenir le numéro de ligne où l'erreur s'est produite. Voir le code suivant pour un exemple de la façon d'enregistrer les numéros de ligne dans vos messages d'erreur.

En utilisant Erl signaler les numéros de ligne dans les messages d'erreur

Private Sub cmbAIDFile_Change() 

1000 On Error Goto ErrorHandler 

1010 DoSomething 
1020 DoSomethingElse 

ErrorHandler: 

1030 Dim sErrMsg As String 
     sErrMsg = "A fatal error occurred." & vbCrLf & vbCrLf & _ 
       "Method: cmbAIDFile_Change" & vbCrLf & _ 
       "Line: " & Erl & vbCrLf & _ 
       "Err.Number: " & Err.Number & vbCrLf & _ 
       "Err.Description: " & Err.Description 

1040 MsgBox sErrMsg, vbCritical+vbOKOnly, "Fatal error" 

End Sub 

Une fois que vous avez une erreur de manipulation plus fine en place, vous pouvez commencer à comprendre pourquoi vous voyez un problème sur une seule machine , parce que vous devriez avoir beaucoup plus d'informations fiables sur l'erreur qui se produit, et être dans une meilleure position pour comprendre quelle est la cause première.

+0

Ce comportement ne serait-il pas le même sur toutes les machines, puisqu'il s'agit d'un problème connu dans VB6? (J'ai testé pour confirmer.) Cela n'explique pas pourquoi Ton'y ne voit que le problème sur une machine. – JeffK

+0

@Jeff: Vous avez raison, ce n'est pas le cas, mais cela pourrait l'aider à trouver quelle ligne de code est en train d'échouer sur Vista. Il regarde la ligne de code qui change la propriété Text; Cependant, je parie que le code est en erreur dans un gestionnaire d'événement quelque part ... –

+0

Ce que je suggère dans ma réponse est qu'il ajoute la gestion des erreurs à tous les gestionnaires d'événements qu'il pourrait avoir, de cette façon, il peut être en mesure de attraper l'erreur plus près de l'endroit où cela se passe réellement. Le code que nous ne pouvons pas voir pourrait faire un certain nombre de choses qui pourraient échouer sur une machine et pas une autre ... –

1

La suggestion de Mike Spears est juste sur l'argent dont vous avez besoin pour mettre des gestionnaires d'erreurs dans tous vos événements comme l'attribution d'une chaîne au texte d'une zone de liste déroulante provoque un certain nombre d'événements.

Ma contribution est d'essayer ce qui suit.

Dim TempS as String 
TempS = clsTonyToolkit.GetSetting("ExportAIDFile",gtypmetadata.gcnnCentral) & "" 
cmbAIDFile.Text = TempS 

Il peut y avoir quelque chose de funky avec Unicode. Ceci est indiqué par l'erreur 0 "Appel ou argument de procédure invalide" lors d'une affectation par ailleurs normale. Encore une fois, si vous avez des procédures événementielles pour cmbAIDfile, vous devez les piéger pour voir si l'erreur se produit là-bas.

0

Utilisez ces codes

Private Sub Command1_Click() 
    On Error Resume Next 
     'Your combo-box code here 
    On Error GoTo 0 
End Sub 
Questions connexes