1

德尔福 v7

此代码旨在允许用户更改其密码。它似乎正确执行,但新密码未保存在密码数据字段中。我一定做错了什么,但我看不到。

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;
4

1 回答 1

8

我对格式化代码的评论只是我在开玩笑,但实际上我认为它确实帮助你自己找到错误。正确缩进,你的第一个循环是这样的:

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

该注释表明您希望该行导致循环终止。但那条线不在循环中。如果它在循环中,您的代码将永远不会编译,因为您不允许在循环内修改循环控制变量。即使在循环之外,编译器也应该警告您当前的值I是未定义的。这是因为一旦循环终止,编译器就不能保证循环控制变量的最终值。将 1 添加到未定义的值仍然是未定义的值。

此外,您的循环迭代的记录多于数据库表包含的记录。如果循环的上限for没有减去 1 并且不是Highor的结果Pred,那么您可能做错了什么。

由于您的I+1行实际上并未终止循环,因此您最终会一直遍历到表的末尾,因此当您调用 时tblLogin.Edit,您将最终记录置于编辑模式,而不是具有匹配帐户详细信息的记录。

修复缩进也会表明您甚至没有包含该函数的所有代码。有一个begin没有匹配的end地方。

您可以通过在数据库上使用单个UPDATE语句来避免所有这些代码:

UPDATE tblLogin SET Password = ? WHERE Username = ? AND Password = ?
于 2012-05-25T21:42:31.403 回答