0

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

4

1 回答 1

4

您正在自己制造问题

with TfrmScrLogin.Create(nil) do

这将创建一个 TfrmScrLogin 实例,但不会将结果分配给您在 CheckLogin 中使用的 frmScrLogin 变量。因此,该变量在 CheckLogin 中将为 Nil,这就是导致 AV 的原因。

相反,做

frmLogin := TfrmScrLogin.Create(...

顺便说一句,“with”语句让一个人逍遥法外是一种耻辱

with TSomething.Create

因为它会引发像你这样的错误。

于 2013-08-13T11:28:59.657 回答