我有一个登录表单、一个主菜单表单和一个设置表单。我已经阅读了有关在此处和 about.com 上创建登录表单的教程。
我的菜单表单作为主表单加载,而其他表单需要创建。我希望用户能够退出主表单并返回登录表单,所以我遵循了这个问题的公认答案:Delphi application with login / logout - how to implement?
我的登录表单有一个名为CheckLogIn
. 它通过编辑框读取用户输入的信息。然后它会在本地 .ini 文件中找到相应的用户名,并读取存储的密码版本。然后它会整理存储的密码并将其与用户输入的密码进行比较。如果成功,用户应该能够登录。
当我没有尝试在主菜单表单之后创建登录表单时,此实现有效。现在我已经在运行时创建了登录表单,我在CheckLogin
程序开始时遇到了访问冲突错误。
我目前的代码如下:
{LOGIN SCREEN}
implementation
uses
ScrMenu;
{$R *.dfm}
procedure LogIn;
begin
with TfrmScrLogin.Create(nil) do
try
if ShowModal = mrOK then
Application.MainForm.Show
else
Application.Terminate;
finally
Free;
end;
end;
function CheckLogin(Sender: TObject):boolean;
var
iFile: TINIFile;
i, Count, PLength, Pos1, Pos2: integer;
User, Cypher, TempPass, Password: string;
begin
User := frmScrLogin.edtUsername.Text;
Password := frmScrLogin.edtPassword.Text;
iFile := TIniFile.Create('C:\MHData.ini');
Cypher := iFile.ReadString('Users', User, '');
if Cypher = '' then
ShowMessage('Username not found')
else
begin
Pos1 := Pos('|', Cypher);
Pos2 := Pos('\', Cypher);
PLength := StrToInt(Copy(Cypher, Pos1 + 1, Pos2 - Pos1 - 1));
Cypher := Copy(Cypher, 0, (Pos1-1));
Cypher := Copy(Cypher, 0, (Length(Cypher)-PLength));
for i := 0 to PLength-1 do
begin
Count := (i+1)*4;
TempPass := TempPass + Cypher[Count];
end;
if Password = TempPass then
begin
Showmessage('login successful');
frmScrLogin.ModalResult := mrOK;
Login;
end
else
begin
ShowMessage('Incorrect password');
frmScrLogin.edtPassword.Clear;
frmScrLogin.edtPassword.SetFocus;
end;
end;
end;
为不整洁的编辑道歉,我对格式规则不太熟悉。我也很欣赏许多其他登录问题的答案,人们说 .ini 文件在本地存储密码是一个坏主意。但是,此程序不需要高级别的安全性。提前致谢