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

问题描述:

在我的应用程序有两种形式让我们说,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; 

三江源

+0

赏金: “寻找一个答案从可信和/或官方渠道画画。”我很可信。 ;-) – GolezTrol 2012-08-16 10:27:57

您可以通过Zarko Gajic 获取here优秀文章Display a LogIn/Password Dialog Before the Main Form is Created的源代码。

摘录:

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. 
+1

+1向TLogin表单添加Execute方法是有意义的。既然它是一个非常具体的形式,类方法就可以做,但我宁愿让它成为一个更符合其他对话框的实例方法。尽管如此,一个很好的解来自delphi.about.com的文章通常是有意义的。 :) – GolezTrol 2012-08-16 10:31:53

不要让LoginForm的主要形式。如果使用 LoginForm := TLoginForm.Create而不是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. 

您还可以创建自己的应用程序的主循环来检查被打开的具体形式,但是这是一个有点困难,多一点比上面的解决方案脆弱。

+6

+1这是'TMyObject.Create(..)do'运行良好的一个很好的例子。你主动不想要一个变量,这样你就可以确定它从来没有被引用超过这个小块。指出在fLoginForm中自动创建的'LoginForm:TLoginForm'变量应该被删除。 – 2012-01-09 18:31:12

+2

我会为TLoginForm添加某种逻辑,即:'if(ShowModal = mrOK)then ...'只有当登录成功时,您才需要创建'MainForm'。 – kobik 2012-01-09 22:29:55

+0

@kobik。也许,虽然应用程序可能仍然希望用略有不同的UI显示主窗体。例如,登录表单可能会调用Application.Terminate,从而导致主窗体永远不会显示。但我不得不承认,我甚至没有试图在我的回答中解决这个问题。 – GolezTrol 2012-08-15 08:06:46