Login

Résolu
MaitreTeTe Messages postés 37 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 1 décembre 2018 - 11 oct. 2016 à 00:52
MaitreTeTe Messages postés 37 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 1 décembre 2018 - 12 oct. 2016 à 17:56
Bonjours.
J'ai commencer a apprendre le vb.net ! Je connaissais déjà le VB6 mais un dois ce mettre a jour un jour !
J'ai un problème. Je télécharge un fichier Login de sur mon serveur et je le compare avec les 2 entré dans mon programme pour savoir si le Login est accepté. Le problème est que si j'écrit le mot de passe qui est TR78 sa ne passe pas. Si je lit le fichier par un bouton et que je rentre les information par le fichier texte, TR78 est accepté. Voici mon code:
Dans un Module:
    Public Username As String
Public Userpass As String
Public Usertype As String


Dans la form:
FileOpen(1, Application.StartupPath & "\System\User\Login.nasd", OpenMode.Input)
Do While Not EOF(1)
Input(1, Username)
Input(1, Userpass)
Input(1, Usertype)

If Username = DataUtilisateur.Text Then
MessageBox.Show("User Pareil")
If Userpass = DataPass.Text Then
MessageBox.Show("Passe Pareil")
FileClose(1)
GoTo Trouver
End If
End If
Loop
FileClose(1)
MessageBox.Show("Connection Impossible. Vérifiez vos informations !")
Exit Sub
Trouver:
Nascar.Show()
Nascar.ActiveForm.Focus()
Me.Close()


Alors pour le nom d'utilisateur, sa passe toujours. Mais pour le mot de passe sa ne passe jamais sauf si J'utilise ce code :
        FileOpen(1, Application.StartupPath & "\System\User\Login.nasd", OpenMode.Input)
Input(1, DataUtilisateur.Text)
Input(1, DataPass.Text)
FileClose(1)


Je ne comprend pas dutout pourquoi que si j'écrit exactement la même chose que ce que le programme lit et met dans la textbox sa ne fonctionne jamais!

Merci de m'aider !

10 réponses

MaitreTeTe Messages postés 37 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 1 décembre 2018
11 oct. 2016 à 00:54
J'ai oublier de mentionner que le fichier que j'ouvre est un fichier *.txt standar avec seulement ceci d'écrit dedans:

Marc
TR78
2
0
MaitreTeTe Messages postés 37 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 1 décembre 2018
11 oct. 2016 à 00:58
Alors Désolé, j'ai résolut le problème. Je ne sais pas du tout c'est quoi qui c'est passé. J'ai refait un fichier Login et le tout a fonctionné. Après avoir galéré pendant des heures et chercher et chercher..... j'ai aucune idée ce qui c'est passé dans le fichier txt !!!

Merci pareil de votre aide éventuelle
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
11 oct. 2016 à 07:40
Bonjour

vouloir évoluer est une très bonne chose, la première étape à passer est de ne pas trainer des casseroles.
Goto était déjà déconseillé en VB1, en VB.Net c'est "interdit".
Tu me diras, pourquoi Microfsoft l'a laissé? Je n'en sais rien, mais ils ont bien appelé ce langage VB.Net alors qu'il n'a plus grand chose à voir avec VB....

           Do While Not EOF(1)
                Input(1, Username)
                Input(1, Userpass)
                Input(1, Usertype)

                If Username = DataUtilisateur.Text Then
                    MessageBox.Show("User Pareil")
                    If Userpass = DataPass.Text Then
                        MessageBox.Show("Passe Pareil")
                        FileClose(1)
                        Nascar.Show()
                        Nascar.ActiveForm.Focus()
                        Me.Close()
                        Exit Sub
                    End If
                End If
            Loop
            FileClose(1)
            MessageBox.Show("Connection Impossible. Vérifiez vos informations !")


devrait faire la même chose sans goto.


Cependant, ça n'est pas non plus la chose à faire, car ce code n'est pas du VB.Net. C'est une tolérance (encore une bizarrerie de Microsoft) de pouvoir utiliser certaines instructions VB6 dans .Net.
Le problème c'est que cette tolérance entraine parfois des comportements inattendu.
Voir ce petit article
http://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net

Si tu appliques les conseils en conclusion de cet article, ton code ne compile pas.

Pour lire un fichier en .Net, il y a 2 options:
  • utiliser un streamReader, plutôt axé vers le flux continu, de l'accès à distance (réseau par exemple), mais ça marche aussi sur un fichier présent sur le PC
  • Utiliser la classe File avec les méthode, ReadQuelqueChose


Par exemple
    Function FichierMaitreTete(FileName As String) As Boolean
        'on vérife que le fichier existe
        If File.Exists(FileName) Then
            Dim lesLignes As String() = File.ReadAllLines(FileName)
            If lesLignes(0) = "Pseudo" && lesLignes(1) = "Mot de passe"
                Return True
            End If
        End If

        Return False
    End Function
0
MaitreTeTe Messages postés 37 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 1 décembre 2018
11 oct. 2016 à 12:51
Bonjours.
Merci de votre réponse assez claire et précise. Je vais allez voir le lien aussitôt que je rentre du travail!

Oui effectivement le goto peu être très facilement retirer dans cette condition là, chose que je vais faire et tenté de l'utiliser plus du tout !

La Fonction décrite pour le mot de passe avec file.readalllines dois être apeller dans le bouton ou peu être inclus dans le code du bouton ? Et si je comprend bien, cette commande lit la ligne 0 et 1 puis les compare avec les entré dans les textbox puis si'il n'est pas pareil, lit les 2 lignes suivantes et les recompare etc.... ? Entend donné que je vais avoir plusieurs utilisateur différent!

Si je veux par la suite utiliser cette fonction mais en Write plustot qu'en read, j'utilise File.WriteAllLines puis Writeline "NewPass" ?

Merci de votre clarification sur ce détail! Celon mets test, FileOpen fonctionnais mais si je peux faire en sorte que mon code sois 2016 plutôt que 2000 :P
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
Modifié par Whismeril le 11/10/2016 à 21:17
is si je peux faire en sorte que mon code sois 2016 plutôt que 2000
et ben non, même si .Net est la dernière technologie de Microsoft, ça date quand même de 2001 (2 ans après l'abandon de VB6).

Et même si, la framework évolue et que chaque mise à jour amène son lot de nouvelle fonctionnalité, la lecture de fichier était dès le début.

file.readalllines [....] cette commande lit la ligne 0 et 1 puis les compare avec les entré dans les textbox puis si'il n'est pas pareil, lit les 2 lignes suivantes et les recompare etc.... ?


Pas exactement, ReadAllLines, comme son nom l'identique copie toutes les lignes dans un tableau, une ligne par case.

Je t'ai fais un exemple qui ne regarde que les 2 premières lignes car tu as décrit ton fichier ainsi
Marc
TR78
2

Donc j'ai appliqué mon exemple à ça, pas à ça n fois.
Mais ça n'est pas bien plus compliqué:

option 1, une boucle For

    Function FichierMaitreTete(FileName As String) As Boolean
        'on vérife que le fichier existe
        If File.Exists(FileName) Then
            Dim lesLignes As String() = File.ReadAllLines(FileName)
            For index = 0 To lesLignes.Count() Step 3 'puisque y'a une troisième ligne dans ton exemple
                If lesLignes(index) = "Pseudo" && lesLignes(index+1) = "Mot de passe"
                    Return True
                End If
            Next
        End If

        Return False
    End Function


option 2, framework 3 ou 3.5 (2008!), une requête Linq
   Dim lesLignes() As String = File.ReadAllLines(FileName)
   Dim loginAvecIndex = lesLignes.Select(Function(login, index) New With {Key login, Key index}).Where(Function(item) item.login = "Pseudo") 'retourne tous les lignes (avec leur index initial) qui correspondent au pseudo, normalement il ne devrait en avoir qu'une, mais on ne sait jamais.
   Dim lesMotsDePassesCorrespondentIls As IEnumerable(Of Boolean) = loginAvecIndex.Select(Function(item) lesLignes(item.index + 1) = "Mot de passe") 'retourne la collection des tests de correspondance avec le mot de passe
   Return lesMotsDePassesCorrespondentIls.Any(Function(ouiOuNon) ouiOuNon = True) 'retourne s'il existe au moins un test réussi

Là tu voies, avant de l'écrire, il faut bien maitriser la notion d'objet, et avoir déjà un peu joué avec Linq.
Ca passe même sur une ligne, mais c'est franchement pas utile.

L'idée de l'option 2, n'est pas que tu copies/colles ce code sans le comprendre, mais te montrer que la framework évolue, toutefois des trucs de base, comme une boucle for marchent toujours.


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
MaitreTeTe Messages postés 37 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 1 décembre 2018
11 oct. 2016 à 23:52
Don si je comprend Bien le code de l'option 1:
On inscrit ce code dans un module pour faire une Apelle a la fonction "FIchierMaitreTeTe"

' Fonction qui retourne True ou False
 Function FichierMaitreTete(FileName As String) As Boolean

'on vérife que le fichier existe
If File.Exists(FileName) Then

' Assigne la valleur "LesLignes" au fichier texte complet
Dim lesLignes As String() = File.ReadAllLines(FileName)

'Indique de lire les ligne 1 et 2 et sauter la troisième ligne
For index = 0 To lesLignes.Count() Step 3

'Si la valleur LesLignes (ligne1) est égale a "Pseudo" et LesLignes (ligne2) est égale au password
If lesLignes(index) = "Pseudo" && lesLignes(index+1) = "Mot de passe"

' On retourne True
Return True

'Fin du SI (Comparaison des données)
End If

'Recommencer et lire les 3 lire suivantes pour comparaison
Next

'Fin di SI (SI le fichier existe)
End If

'retourne False si on a pas trouver d'utilisateur
Return False

End Function


Ce que je ne comprend pas avec le code c'est que si il return True est ce que le script s'arrete et abandonne la suite du fichier et quitte le script ?

Donc si le fichier text est construit comme suit:

Marc
TR78
2
Phil
19
0
Alain
04
0
Richard
22
0
....... etc ......

Il lira chaque ligne et sautera toujours la 3ieme ligne a chaque retour du IF !
0
MaitreTeTe Messages postés 37 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 1 décembre 2018
Modifié par MaitreTeTe le 12/10/2016 à 02:41
Bonjours.
Alors j'ai trouver comment faire pour appliquer ces notions a mon programme. Voici mon codage et dite mois ce que vous en pensez !

Form:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

User = TextBox1.Text

Pass = TextBox2.Text
TextBox3.Text = Login("D:\Nascar 2017\Nascar 2017\System\User\Login.nasd")
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub
End Class


Et dans le module:
Module Module1

Public User As String
Public Pass As String
Public index As Integer
Public TypeC As Integer

Function Login(Filelog As String) As Boolean
If System.IO.File.Exists(Filelog) Then
index = 0
Dim lesLignes As String() = System.IO.File.ReadAllLines(Filelog)
For index = 0 To lesLignes.Count() Step 3
If lesLignes(index) = User And lesLignes(index + 1) = Pass Then
Return True
End If
If lesLignes.Count() = index + 3 Then
Return False
End If
Next
End If
Return False
End Function

End Module


J'ai réussit a faire fonctionner le tout mais sans trop comprendre pourquoi que je lit le fichier Login , je lit la ligne 1 et 2 et si c'est pas bon, je relit la ligne 2 et la 3. Je dois ajouter
If lesLignes.Count() = index + 3 Then
Return False
End If


Sinon je dépasse la limite de mon fichier !
0
MaitreTeTe Messages postés 37 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 1 décembre 2018
12 oct. 2016 à 03:52
Bon enfin. j'ai tout compris le code a force de le manipuler.

Bref, on démarre l'index a 0. On lit la ligne 1 et 2 et les comparre on donné entré par l'utilisateur, s'ils ne sont pas pareil, je fais un calcule que si index+3 = maximun de ligne du fichier texte on retourne la valeur False puisque je suis a la fin du fichier. si je n'ajoute pas ce If la, avec la troisième ligne qui est le type de compte n'est pas compter donc on n'est pas a la fin du fichier même si c'est le dernier utilisateur enregistrer. alors le code relit 2 ligne et la sa dépasse la limite du fichier. Alors avec ce IF, je m'assurer que le tout est bien calculer.

Donc a partir du fais que utilisateur et le mot de passe ne concorde pas, et que je ne suis pas au dernier utilisateur enregistré dans le fichier, en bien on retourne en haut, index = 0 devient par "to" LesLignes.Count + 3 donc index = 2 (puisque index 0 est une ligne dans le fichier). Donc on recommence a lire la ligne 3 et 4 avec toujours la ligne 5 qui est le type utilisateur. Si sa concorde toujours pas, on verifie si c'est la fin du fichier et si non, on retourne en haut, index 3 devient index 5.

Je ne sais pas si je m'exprime bien et que vous comprenez bien ce que j'essaie d'écrire, mais l'important c'est que je comprend et que sa fonctionne :P
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
12 oct. 2016 à 08:36
Bonjour,

Alors oui en .Net le premier index d'une collection c'est 0.
Cette fois ça n'est pas une bizarrerie, à part Vb6 (ou antérieur) et VBA (ou il est possible de choisir entre 0 et 1), tous les languages que je connaisse sont comme ça.
Ça s'explique par le fait qu'au final le pc travaille en binaire.
Admettons qu'un index soit codé sur 2 bits (pour que l'exemple soit court) il y a 4 possibilités:
00
01
10
11
Si tu exclus 00, tu n'en as plus que 3.

Tu n'a se pas besoin d'initialiser index avant la boucle For, puisque cette boucle le fait (c'était déjà comme ça en vb6).

Pour le dépassement de capacité, c'est une erreur bête de ma part.

lesLignes.Count() retourne le nombre d'enregistrement, 4 si on reprend l'exemple au dessus. Mais comme le premier index est 0, le dernier est 3, pas 4.

Je ne fais du VB.net que pour le forum.
Je code normalement en c#.
Une boucle For est définie comme suit
(for int index =0; index < lesLignes.Count();index += 3)

On retrouve bien les mêmes informations:
  • on initialisé une variable index de type entier à la valeur 0,
  • on fait des pas de 3, +=3 signifiant j'ajoute 3 à la valeur de la variable,
  • et on tourne tant que index est inférieur à lesLignes.Count


C'est le 3eme point où je me suis fais avoir en transcrivant en Vb.net.
La boucle For de vb6 avait le même but, à savoir parcourir un enfant collection du premier au dernier enregistrement, non pas de 0 à 3 mais selon l'option de 1 à 4. Donc to ne signifie pas inférieur mais inférieur ou égal...
En .Net, il a gardé cette signification.

Pour s'en affranchir il suffit de faire
For index = 0 to lesLignes.Count() -1 Step 3

Et j'en n'y ai pas pensé en tapant le message.
Du coup, le test que tu as ajouté ne sert plus
0
MaitreTeTe Messages postés 37 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 1 décembre 2018
12 oct. 2016 à 12:44
For index = 0 To lesLignes.Count() - 1 Step 3

Éffectivement, c'est tout a fait logique. De cette façon lorsque qui lit le dernier utilisateur, il tombe donc a (12-1) sois 11 donc égale au maximum !

Le Lengagage C++ et c# Est-ce que c'est très semblable? parce que je vous dirais que le c# ressemble beaucoup as du VB. De la a réussir a fais des traduction je ne serais pas capable, mais c'est une question de logique qui dois s'installer !
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
12 oct. 2016 à 17:17
Je t'ai montré le code c#, pour t'expliquer pourquoi je m'étais trompé dans la traduction, pas pour te faire passer par là.

Même si au final, je pense qu'il est préférable d'aborder .Net par le c#.
Il y a une filiation entre c++ et c#, il n'y a plus de pointeur (des types sont valeur et les autres référence) et c# est tout objet.
0
MaitreTeTe Messages postés 37 Date d'inscription jeudi 4 février 2016 Statut Membre Dernière intervention 1 décembre 2018
12 oct. 2016 à 17:56
Merci pour vos réponse claire et précise!
0
Rejoignez-nous