5

私のDelphiプログラムでは、ログインフォームがあり、メインフォームが作成される前に表示されますが、直面している問題は、メインフォームでログインチェックを処理したいということです。つまり、ログインフォームが使用されます確認して続行するメインフォーム、

に置かれたコメントを読んでください:

手順 LogInButtonClick(送信者: TObject) ;

ここに TLoginForm コードがあります ( delphi.about.com から):

    unit login;

 interface

 uses
   Windows, Messages, SysUtils, Variants, Classes,
   Graphics, Controls, Forms, Dialogs, StdCtrls;

 type
   TLoginForm = class(TForm)
     LogInButton: TButton;
     pwdLabel: TLabel;
     passwordEdit: TEdit;
     procedure LogInButtonClick(Sender: TObject) ;
   public
     class function Execute : boolean;
   end;

 implementation
 {$R *.dfm}

 class function TLoginForm.Execute: boolean;
 begin
   with TLoginForm.Create(nil) do
   try
     Result := ShowModal = mrOk;
   finally
     Free;
   end;
 end;

 procedure TLoginForm.LogInButtonClick(Sender: TObject) ;
 begin
   if passwordEdit.Text = 'delphi' then
   {
   Here how it's possible to use :
    if MainForm.text=passwordEdit.Text then 
    ModalResult := mrOK
    }

     ModalResult := mrOK
   else
     ModalResult := mrAbort;
 end;

 end. 

メインプログラムの初期化フローは次のとおりです。

program PasswordApp;

 uses
   Forms,
   main in 'main.pas' {MainForm},
   login in 'login.pas' {LoginForm};

 {$R *.res}

 begin
   if TLoginForm.Execute then
   begin
     Application.Initialize;
     Application.CreateForm(TMainForm, MainForm) ;
     Application.Run;
   end
   else
   begin
     Application.MessageBox('You are not authorized to use the application. The password is "delphi".', 'Password Protected Delphi application') ;
   end;
 end.

ありがとうございました

4

3 に答える 3

12

メインフォームを最初に作成する必要がある場合は、最初に作成します。

begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);//created, but not shown
  if TLoginForm.Execute then//now the login form can refer to the main form
    Application.Run//this shows the main form
  else
    Application.MessageBox('....');
end;

それはあなたが尋ねた質問に対する直接的で素朴な答えです。もっと広く考えると、ログインテストをメインフォームから移動することをお勧めします。高レベルのコードが必要とするものなら何でも使用できる場所に置いてください。現在取り組んでいる設計には、不健全な結合があります。

于 2013-01-21T21:24:52.803 に答える
4

私は通常、からこれOnCreateを行いMainFormます; または、のからOnCreateDataModuleもしあれば。例えば:

TMainForm.OnCreate(Sender: TObject);
var F: TLoginForm;
begin
  F := TLoginForm.Create(Self);
  try
    F.ShowModal;
  finally F.Free;
  end;
end;

私はファイルをいじりDPRすぎるのは好きではありません。これは機能し、フォームを正しい順序で表示しますTMainForm。Delphiによって自動作成された場合、MainForm変数はすでに割り当てられており、起動時に使用できるようになっていOnCreateます。

PS:MainForm変数にアクセスすることは実際には悪い設計ですが、必要に応じてそこにあります。

于 2013-01-21T21:32:12.550 に答える
0

David's answerに似ていますが、動作が少し異なりますが、以前に、アプリケーションの存続期間中に再利用できるこのソリューションに回答しました。

于 2013-01-23T21:31:33.873 に答える