希望实现一个最终用户对话框,要求他们创建自己的密码。
长度必须为9个字符。 1个字符必须是大写,1必须是小写,1必须是数字,['0'..'9'],一个必须来自一组6个预定义的ascii字符,如此。 [, '#', '%', '和,' '!', '*', '@']。
完成此操作。和工作。但是,我想要做的是使用onchange事件提供可见验证,如果满足所有要求,则将编辑框的颜色更改为绿色,否则更改为RED。对9个字符长度进行调整很容易,但是要检查9个不同的字符,以确保至少有1个上部,1个下部,1个数字和1个预定义,这证明有点困难。有人可以帮忙吗?谢谢。
这是代码:
procedure TPasswordForm.edtPassword1Change(Sender: TObject);
begin
if Length(edtPassword1.Text <> 9 then
edtPassword1.Color := clRed
else
edtPassword1.Color := clLime;
end;
答案 0 :(得分:6)
对于修复字符集功能可能非常简单。请注意,它不接受非拉丁字符。
function IsPasswordCrazy(const s: AnsiString): Boolean;
const
C_Upcase = 1;
C_Locase = 2;
C_Digit = 4;
C_SpecSym = 8;
C_All = C_Upcase or C_Locase or C_Digit or C_SpecSym;
var
i, keys: integer;
begin
if Length(s) <> 9 then begin
Result := False;
Exit;
end;
keys := 0;
for i := 1 to Length(s) do
case s[i] of
'A'..'Z': keys := keys or C_Upcase;
'a'..'z': keys := keys or C_Locase;
'0'..'9': keys := keys or C_Digit;
'!','#','%','&','*','@': keys := keys or C_SpecSym;
end;
Result := keys = C_All;
end;
答案 1 :(得分:3)
这可以使用正则表达式
来实现以下是错误消息的示例。
uses
System.RegularExpressions;
function ValidatePassword(aPassword: String; var ErrorMessage: String): Boolean;
begin
Result := false;
ErrorMessage := '';
if Length(aPassword) <> 9 then
begin
ErrorMessage := 'Password must be exactly 9 characters long';
exit;
end;
if not TRegEx.IsMatch(aPassword, '[a-z]') then
begin
ErrorMessage := 'At least 1 character in the password must be lowercase';
exit;
end;
if not TRegEx.IsMatch(aPassword, '[A-Z]') then
begin
ErrorMessage := 'At least 1 character in the password must be uppercase';
exit;
end;
if not TRegEx.IsMatch(aPassword, '\d') then
begin
ErrorMessage := 'At least 1 character in the password must be a digit';
exit;
end;
if not TRegEx.IsMatch(aPassword, '[!,#,%,&,*,@]') then
begin
ErrorMessage := 'At least 1 character in the password must be one of the following letters: !,#,%,&,*,@';
exit;
end;
Result := True;
end;