5

在我的 Delphi 程序中,我有一个登录表单,它在创建主表单之前显示,但我面临的问题是我想在主表单中处理登录检查,这意味着登录表单将使用检查和继续的主要表格,

请阅读以下评论:

过程 LogInButtonClick(Sender: 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

我通常OnCreateMainForm; 或者从 的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

大卫的回答类似,但行为略有不同,我之前回答了这个能够在应用程序生命周期中重用的解决方案。

于 2013-01-23T21:31:33.873 回答