我非常感谢我为一个学校项目提供的帮助。你们认为可能出错了什么? 我和一位朋友说过,我必须确保在任何给定时间我只有1个表的活动属性设置为true。我试过这个,但它似乎没有什么区别。也许我做得不好?
这是我程序的代码:
procedure TForm1.btnChangePassUserClick(Sender: TObject);
var
sNewPass,sOldPass:string;
begin
sOldPass:= InputBox('Password verification','Please enter your current password','');
if sOldPass = sPassword then
begin
sNewPass := inputBox('Password change','Please enter a new Password with at least 1 number and letter','');
if isPasswordValid(sNewPass) then
begin
tblUsers.Active := True;
tblUsers.Edit;
tblUsers.Filtered := True;
tblUsers.Filter := 'UserID = ' +QuotedStr(sPassword);
tblUsers.First;
tblUsers['Password'] := sNewPass;
tblUsers.Post;
tblUsers.Filtered := False;
tblUsers.Filter := '';
if bRememberMe then
begin
ShowMessage('Password changed, please log in again for security purposes');
imgLogoutClick(Sender);
end;
sPassword := sNewPass;
end
else ShowMessage('Please ensure your password contains at least 1 letter and 1 number');
end
else ShowMessage('Incorrect Password');
end;
我得到的错误:
tblUsers:数据集未处于编辑或插入模式
答案 0 :(得分:5)
您对str = '000001234567'
str.match /0{5}\K\d{,5}/
#=> #<MatchData "12345">
,Edit
和Filter
的使用均不正确。只有在实际编辑行时才需要Filtered
;光标(记录指针)位置的任何更改都将取消或发布更改,使表格退出编辑模式(从而导致错误)。
您也不应使用Edit
来搜索要编辑的数据。请改用Filter
。这样的东西应该对你有用(虽然它可能不是我在我自己的代码中使用的):
Locate
答案 1 :(得分:0)
tblUsers.First
可能会导致滚动。我猜数据集已发布在该卷轴上。
在通过tblUsers.Edit
分配新密码之前尝试拨打tblUsers['Password'] := sNewPass;
。
正如MartynA所说,还有另一个问题会阻止您的代码正常工作,即使修复了上述问题。 tblUsers.Filter := 'UserID = ' +QuotedStr(sPassword);
很可能不是您想要做的。可能应该传递包含UserID
的变量而不是sPassword
。
如果我没记错的话,应该有一个名为Locate
的函数。它也应该比过滤器更快。