2012-05-25 3 views
1

Delphi v7Modifier le mot de passe Delphi v7

Ce code est conçu pour permettre à l'utilisateur de changer son mot de passe. Il semble s'exécuter correctement, mais le nouveau mot de passe n'est pas enregistré dans le champ de données du mot de passe. Je dois avoir fait quelque chose de mal, mais je ne peux pas le voir.

procedure TForm4.btnPswordClick(Sender: TObject); 
var 
    I: integer; 
begin 
tblLogin.First;; 
for I := 0 to tblLogin.RecordCount do 
Begin 
If tblLogin.FieldByName('Username').Value = Edit1.Text then 
if tblLogin.FieldByName('Password').Value = Edit2.Text then 
sign2.Visible := True; //Test in this case tells the application to make Label1 
visible if the //username and password are correct 
tblLogin.Next; 
end; 
I:= I+1; //ends search loop of records so program can move on 
If sign2.Visible = False then 
begin 
MessageDlg('Error Username, or Password not correct', 
mtConfirmation, [mbCancel], 0); 
end 
else 
if edit3.Text <> edit4.Text then 
begin 
MessageDlg('Error New Password does not match', 
mtConfirmation, [mbCancel], 0); 
end 
else 
begin 
tblLogin.Edit; 
tblLogin.FieldByName('Password').Value := Edit3.Text; 
tblLogin.Post; 
//form1.Show; 
//form4.Close; 
end; 
+10

Peut-être que votre code indenter serait sensiblement vous aider à voir. –

+0

@Robert, n'oubliez pas d'accepter les réponses qui vous aideront à résoudre vos questions [de cette façon] (http://meta.stackexchange.com/a/5235/179541). Vous pouvez également voter pour eux en utilisant la flèche vers le haut au-dessus de la case à cocher Accepter comme une récompense ;-) – TLama

Répondre

8

Mon commentaire sur le formatage du code était juste moi être sarcastiques, mais en fait je pense que vraiment aurait vous ont aidé à trouver l'erreur vous. Correctement en retrait, votre première boucle est la suivante:

tblLogin.First;; 
for I := 0 to tblLogin.RecordCount do 
Begin 
    If tblLogin.FieldByName('Username').Value = Edit1.Text then 
    if tblLogin.FieldByName('Password').Value = Edit2.Text then 
     sign2.Visible := True; //Test in this case tells the application to make Label1 visible if the 
          //username and password are correct 
    tblLogin.Next; 
end; 

La ligne de code suivante est celle-ci:

I:= I+1; //ends search loop of records so program can move on 

Le commentaire indique que vous attendez de cette ligne pour provoquer la boucle de mettre fin. Mais cette ligne n'est pas dans la boucle. S'il était dans la boucle, votre code n'aurait jamais été compilé car vous n'êtes pas autorisé à modifier la variable loop-control à l'intérieur d'une boucle. Même en dehors de la boucle, le compilateur aurait dû vous avertir que la valeur actuelle de I n'est pas définie. En effet, le compilateur ne garantit pas la valeur finale d'une variable de contrôle de boucle une fois la boucle terminée. L'ajout de 1 à une valeur indéfinie est toujours une valeur indéfinie.

En outre, votre boucle parcourt plus d'enregistrements que votre table de base de données. Si la limite supérieure d'une boucle for n'en a pas été soustraite et n'est pas le résultat de High ou Pred, alors vous êtes probablement en train de faire quelque chose de mal.

Depuis votre I+1 ligne ne se termine pas en fait la boucle, vous finissez par parcourir tout le chemin jusqu'à la fin de la table, donc quand vous appelez tblLogin.Edit, vous mettez la finale enregistrement en mode édition, non l'enregistrement avec les détails du compte correspondant.

La correction de l'indentation montrera également que vous n'avez même pas inclus tout le code pour cette fonction. Il y a un begin sans un end correspondant quelque part.

Vous pouvez éviter tout ce code en utilisant une seule instruction UPDATE sur votre base de données:

UPDATE tblLogin SET Password = ? WHERE Username = ? AND Password = ? 
+0

Donc, ma couverture est soufflé. Je ne suis pas un très bon programmeur :-) Je suis en fait un shérif adjoint essayant de créer des outils pour nous aider à faire ce que nous faisons. Je viens lui apprendre et j'apprécie votre contribution. Ce que vous avez suggéré est un peu difficile à comprendre pour moi, mais maintenant j'ai un endroit pour commencer et je vais le comprendre. – Robert

+0

+1. @Robert, commencez par activer les astuces et les avertissements ('Project-> Options, Compilateur Delphi, Astuces et Avertissements 'dans les versions récentes de Delphi). Le compilateur vous donnera beaucoup d'informations si vous les lisez. :) –

+0

J'ai indenté mon code, allumé Hints et Warnings (H/W), édité tout le H/W et maintenant il n'y a plus de H/W. Toujours en train de mettre à jour la base de données. – Robert

Questions connexes