davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009
-
5 mai 2006 à 23:11
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009
-
10 mai 2006 à 10:31
B'jour!
Me (re)voilà avec un poblème avec le programme que je développe. Je vais essayer d'être clair et concis:
_Je débute en VB ;)
_Je fais un logiciel qui contient en fait 3 modules: Un qui permet de s'occuper d'ajouter, supprimer et consulter des élèves; Un qui permet de s'occuper d'ajouter, supprimer et consulter des notes qu'auront eu les élèves et Un qui permet de s'occuper d'ajouter, supprimer et consulter des Examens qu'ont subis les élèves.
_Les Elèves, Notes, Examens et leurs caractéristiques attenantes sont enregistrés dans 3 fichiers différents.
_Mon bug ne se produit pas sur le module concernant les élèves, celui que j'ai créé en premier et qui m'a servi de référence pour les deux autres modules. J'ai procédé à quelques copier/coller depuis celui ci vers les autres mais de manière, me semble-t-il, prudente.
Donc il se trouve que quand je veux ajouter (ou consulter ou supprimer) une note ou un examen j'ai, à chaque fois le message d'erreur "Erreur d'excution 13 Type Incompatible".
Je ne comprends pas l'erreur. Mais voici peut-être quelques pistes d'erreur possible, que je ne sais pas résoudre:
_Les données liées aux élèves sont enregistrés par un bout de code dont voici les lignes:
Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve)
SaveEleve.numeroeleve = TxtNumEleve
SaveEleve.nomeleve = TxtNomEleve
SaveEleve.prenomeleve = TxtPrenomEleve
SaveEleve.classeeleve = TxtClasseEleve
Put 1, TxtNumEleve, SaveEleve
Close 1
_ Et celles liées aux Notes (par exemple) sont enregistrées grâce à ça:
Open "C:\note.txt" For Random As 2 Len = Len(SaveNote)
SaveNote.numeroeleve = TxtNumEleve
SaveNote.numexam = TxtNumExam
SaveNote.nommatiere = TxtNomMatiere
SaveNote.numeronote = TxtNumNote
Put 2, TxtNumEleve, SaveNote
Close 2
Je me demande donc si le problème ne vient pas des numéros (1 et 2) qui caractérisent les fichiers... ? Je ne sais pas trop m'en servir de ces numéros...
En réfléchissant vraiment au message d'erreur, je me suis demandé si l'erreur ne vient pas de mon "module" dans lequel sont définis quelques types publiques. Mais je n'y vois pas d'erreur.
Voilà, je vous laisse avec cela, et n'hésitez pas si vous avez des questions pour vous aider à résoudre mon problème, j'essaierai d'y répondre avec le plus de précision ;)
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009 10 mai 2006 à 10:31
Youpi un copain vient de me trouver la solution.
Vous ne pouviez pas trouver la solution vu le code que je vous avais donné. Je vous donne un bout de code plus conséquent:
Private Sub BtnOkAjoutExamen_Click()
Open "C:\examen.txt" For Random As 3 Len = Len(SaveExam)
SaveExam.numeroexam = TxtNumExam
SaveExam.nomexam = TxtNomExam
SaveExam.dateexam = TxtDateExam
SaveExam.moyexam = TxtMoyExam
SaveExam.numsalle = TxtNumSalle
SaveExam.nommatiere = TxtNomMatiere
SaveExam.numeroeleve = TxtNumEleve
SaveExam.nomeleve = TxtNomEleve
Put 3, TxtNumEleve, SaveExamen
SaveExam.numeroexam = ""
SaveExam.nomexam = ""
SaveExam.dateexam = ""
SaveExam.moyexam = ""
SaveExam.numsalle = ""
SaveExam.nommatiere = ""
SaveExam.numeroeleve = ""
SaveExam.nomeleve = ""
Close 3
End Sub
L'erreur.... vous l'avez peut-être trouvée maintenant. Une fois que le Put 3 a été effectué, je voulais que les champs de texte soient effacés pour permettre une autre saisie. Mon pote m'a donc trouvé qu'il ne faut pas réinitialiser la variable (exemple: SaveExam.nomexam) mais uniquement la zone de texte. Donc le type d'exemple pour effacer une ligne est :
TxtNomExam=""
Il m'a d'ailleurs conseillé d'ajouter ".Text" après chaque nom de champ texte afin que tout soit bien défini.
Ensuite, ce monsieur m'a appris à ajouter une condition SI qui me permet de vérifier que certains champs ont bien été remplis ;)
Donc voilà, ma situation est débloqué :)
Merci à vous tous de vous être penchés sur mon problème, ça fait vraiment plaisir de voir que l'on n'est pas seul en cas de pépin en développement :)
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009 5 mai 2006 à 23:16
erf... J'ai bien l'impression que finalement tout mon programme bug avec cette même erreur... Ca sera peut-être plus simple pour résoudre le problème...
Je me relance dans mes recherches, en espérant que vous sachiez précisément ce que cette erreur signifie ;)
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 5 mai 2006 à 23:32
Moi je diaris plutot que ton erreur vient des instructions Put.
L'instruction Put attent en second paramètre un nombre de type long, et toi tu lui passe une chaine de caractère (j'imagine que TxtNumEleve est une chaine de caractère).
Normalement quand tu execute ton programme depuis VB et que tu obtient une erreur, la ligne ou se produit l'erreur est surlignée de jaune, ça peut aider pour trouver l'erreur.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 5 mai 2006 à 23:34
Et pour les nombres 1 et 2 tu peux regarder du coté de la fonction FreeFile aussi. Elle te renvoie le premier numéro de fichier libre.
Personellement, je préfère ça que d'imposer arbritrairement un numéro.
Vous n’avez pas trouvé la réponse que vous recherchez ?
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009 6 mai 2006 à 00:06
Ben en fait non, c'est un Integer :D Mais celui ci se saisi dans une case de texte, d'où le nom que j'ai choisi...
Pour les fichiers, on m'a appris à faire comme ça et vu que je suis un mouton... lol Nan mais j'aimerai, pour ce programme, utiliser ce type d'écriture.
Je ne trouve pas la solution du problème... Il me met et surbrillance cette ligne là (dans le module élève):
SaveEleve.numeroeleve = TxtNumEleve
SaveEleve étant en rapport avec mon type public ELEVE défini dans le module lié...
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 6 mai 2006 à 09:54
Regarde les définitions de tes différentes variables dans ton type ELEVE
numeroeleve doit etre du même type que TxtNumEleve, etc....
Ton type ELEVE s'il est défini dans un autre module, il ne doit pas etre défini avec le mot clé Private, idem pour la variable SaveEleve.
Question : Utilise-tu l'option explicit ? Si ce n'est pas le cas, ajoute systématiquement sur la toute première ligne de code de tous les modules et de toute les feuilles la ligne suivante : Option Explicit
Cela va t'obliger à déclarer explicitement chaque variable que tu utilise. C'est un peu moins souple au niveau codage (c'est une habitude à prendre), mais ça va t'éviter certains bugs très difficiles à trouver quand ils portent sur le type de variable.
Considère cette option comme une option ABSOLUMENT OBLIGATOIRE pour ce programme et tous tes programmes à venir.
asecher
Messages postés262Date d'inscriptionlundi 20 octobre 2003StatutMembreDernière intervention27 avril 20071 6 mai 2006 à 15:48
Casy a casiment raison....
L'erreur de type 13 survient souvent quand on passe un str vers un numérique. De plus, il faut faire attention (ce ne doit pas être le cas pour toi car tu travaille sur des entiers) au séparateur décimal, qui, selon le paramétrage "International" est le point ou la virgule.
Des petites fonctions de conversion (cint, par exemple) ou de verification (IsInteger) selon le langage utilisé (mais qui ne sont pas très compliquées à développer) aident bien...
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009 6 mai 2006 à 16:29
Je ne vois pas ce que tu appelles module. J'ai "ajouté un module" et y ai déclaré mes types publiques.
J'en ai trois: NOTE (auquel le programme se réfère grâce à SaveNote)
EXAMEN (auquel le programme se réfère grâce à SaveExam)
ELEVE (auquel le programme se réfère grâce à SaveEleve)
Est-ce que ta remarque tiens toujours sachant ce que je viens d'écrire?
Merci en tout cas de te pencher sur le problème ;)
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 6 mai 2006 à 16:36
Quand tu dis : J'ai "ajouté un module" et y ai déclaré mes types publiques.
*Comment s'appelle ton module ? module1, ou tu l'as renommé ?
*SaveEleve, qu'est ce c'est ?
c'est en fait pour voir si le problème ne se situe pas dans la phrase
Open "C:\note.txt" For Random As 2 Len = Len(SaveNote)
Si "SaveNote" n'est pas de type string, t'es marron, d'où le message d'erreur d'incompatibilité
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 6 mai 2006 à 17:04
Dans ces 2 phrases :
Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve)
Open "C:\eleve.txt" For Random As 1 Len = Len(SaveNote)
remplace (temporairement) "= Len(SaveEleve)" par "= 10" (10 étant un nombre que j'ai mis au hasard, met la nombre de ton choix, bref le plus adapté)
idem pour "= Len(SaveNote)"
Juste pour voir si ça te cause tjs le problème, au moins on saura si c'est dans cette partie de code ou non.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 6 mai 2006 à 17:06
mortalino, pour ton info l'instruction len(SaveNote) est tout à fait correcte dans ce cas là.
L'instruction Len renvoie le nombre de caractère d'une chaine de caractère OU le nombre d'octet d'une variable qu'elle soit classique ou de type user comme ici.
davidguillon
Messages postés81Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention15 septembre 2009 6 mai 2006 à 17:12
En mettant "Open "C:\eleve.txt" For Random As 1 Len = 10" à la place de "Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve)", le problème et l'erreur restent les mêmes.
Par contre en mettant "Open "C:\eleve.txt" For Random As 1 Len = xx" ben j'ai une erreur 5 Argument ou appel de procédure incorrect. Mais en faisant le débogage, il me surligne Open "C:\eleve.txt" For Random As 1 Len = xx alors qu'avec Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve) il me surligne ma première ligne (à savoir "SaveEleve.numeroeleve = TxtNumEleve")
Voili voilà...
Je risque de ne plus répondre beaucoup ce soir. D'ici Vingt minutes je ne serai plus là. Je repasserai faire un tour dans la soirée ;)
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 6 mai 2006 à 17:32
Ce n'est pas le type ELEVE mais bien la variable SaveEleve (et SaveNote dans le second cas) .
Pour moi il n'est pas utile de preciser le module, si SaveEleve est déclarée en tete de module, en public, elle est visible dans l'ensemble du programme, si elle est déclaré en private, elle n'est visible que dans le module ou elle est déclarée. Et donc si elle est utilisée dans un autre module, il devrai normalement avoir une erreur de variable non déclarée (avec l'option explicit active).
Au sujet de Len, s'il s'agit de connaitre, non pas la taille de la variable, mais la taille de la mémoire réservée à la variable (passage à une dll en C par exemple), il faut utiliser LenB qui elle tient compte des éventuels alignement mémoires des éléments à l'intérieur de la structure