2012-01-09 2 views
0

в моем приложении у меня есть две форм, скажем, 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; 

Thankyou

+0

Bounty: "В поисках ответа рисунка из заслуживающих доверия и/или официальных источников." Я прав. ;-) – GolezTrol

ответ

6

Вы можете получить here Исходный код отличной статьи Display a LogIn/Password Dialog Before the Main Form is Created от Zarko 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. 
+1

+1 Имеет смысл добавить метод Execute к форме TLogin. Поскольку это довольно конкретная форма, метод класса будет работать, но я предпочел бы, чтобы метод экземпляра был в большей степени совместим с другими диалоговыми окнами. Тем не менее хорошее решение. Статьи из delphi.about.com обычно имеют смысл. :) – GolezTrol

10

Не делайте 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' работает хорошо. Вы активно не хотите переменную, чтобы вы могли быть уверены, что ее никогда не ссылают за пределы этого небольшого блока. Было бы разумно указать, что автоматически созданная переменная 'LoginForm: TLoginForm' в' fLoginForm' должна быть удалена. –

+2

Я бы добавил некоторую логику в TLoginForm, то есть: if (ShowModal = mrOK), тогда ... ', только если логин был успешным, вам нужно создать' MainForm'. – kobik

+0

@kobik. Может быть, хотя приложение может по-прежнему хотеть показать основную форму с немного другим пользовательским интерфейсом. Или форма входа в систему могла, например, вызвать Application.Terminate, поэтому основная форма никогда не отображалась. Но я должен признать, что я даже не пытался решить эту проблему в своем ответе. – GolezTrol