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 を追加しても、未定義の値のままです。

さらに、ループは、データベース テーブルに含まれるよりも多くのレコードを反復処理します。ループの上限にfor1 が減算されておらず、Highまたはの結果でないPred場合は、おそらく何か間違ったことをしています。

I+1行は実際にはループを終了しないため、テーブルの最後までトラバースすることになります。そのため、 を呼び出すと、tblLogin.Editアカウントの詳細が一致するレコードではなく、最後のレコードが編集モードになります。

インデントを修正すると、その関数のすべてのコードが含まれていないことも示されます。begin一致しない がendどこかにあります。

UPDATEデータベースで単一のステートメントを使用することで、このコードをすべて回避できます。

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