我有一个登录表单、一个主菜单表单和一个设置表单。我已经阅读了有关在此处和 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 文件在本地存储密码是一个坏主意。但是,此程序不需要高级别的安全性。提前致谢