如何在不关闭整个程序的情况下关闭窗口?

Raf*_*ari 0 delphi login tform

在我的应用程序中,我有两种形式,比如LoginForm和AccountForm

LoginForm被设置为主窗体,它是用户能够从他的帐户登录时的表格(两个TEdits和登录按钮).当用户键入其登录详细信息并进行连接时,将打开一个新表单AccountForm.

如何在不关闭整个应用程序的情况下关闭登录成功的LoginForm?或者用这种语言如何使用下面的代码来关闭登录表单但不关闭应用程序.

if (not IncludeForm.sqlquery1.IsEmpty) and (isblacklisted='0') and (isactivated='1')  then
begin // Login Successful *** Show the account window
AccountForm.Show;
LoginFrom.Close; // <----The problem is in this line, using this line causes the whole application to close***}
end;
Run Code Online (Sandbox Code Playgroud)

谢谢

Gol*_*rol 10

不要将LoginForm作为主窗体.如果使用LoginForm := TLoginForm.Create而不是使用创建loginform Application.CreateForm,则表单将不会设置为应用程序主窗体.使用Application.CreateForm创建的第一个表单将是主窗体.您可以编辑项目文件(.dpr)以将其更改为:

program YourApp;

uses
  Forms,
  fLoginForm in 'fLoginForm.pas' {LoginForm},
  fMainForm in 'fMainForm.pas' {MainForm};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  with TLoginForm.Create(nil) do
  try
    ShowModal;
  finally
    Free;
  end;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)

您还可以创建自己的应用程序主循环来检查正在打开的特定表单,但这比上面的解决方案更难,更脆弱.

  • +1这是一个很好的例子,其中`with TMyObject.Create(..)do`运行良好.你主动不想要一个变量,这样你就可以确定它永远不会被引用到这个小块之外.明智的是,应该删除`fLoginForm`中自动创建的`LoginForm:TLoginForm`变量. (6认同)
  • 我会在TLoginForm中添加一些逻辑,即:`if(ShowModal = mrOK)然后......`只有登录成功时才需要创建`MainForm`. (2认同)

men*_*raz 6

你可以取这里的优秀文章的源代码显示登录/密码对话框主窗体创建之前扎克Gajic .

摘抄:

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.
Run Code Online (Sandbox Code Playgroud)