ログインフォーム、メインメニューフォーム、設定フォームがあります。こことabout.comでログインフォームの作成に関するチュートリアルを読みました.
メニュー フォームはメイン フォームとして読み込まれますが、他のフォームを作成する必要があります。ユーザーがメイン フォームからログアウトしてログイン フォームに戻れるようにしたいので、この質問に対する受け入れられた回答に従いました:ログイン/ログアウトを使用した Delphi アプリケーション - 実装方法?
私のログインフォームには、という名前のプロシージャがあります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 ファイルを使用するのは良くないという回答が、他の多くのログインに関する質問にもありました。ただし、このプログラムは高度なセキュリティを必要としません。前もって感謝します