Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Не завершается процесс программы.


Автор: Boyur 30.5.2012, 17:03
Есть пример программки с авторизацией, простейший.
Она, работает но проблема в том, что если откроется окно приветствие, то после закрытия его, форма закроется а приложение будит весеть в задачах.
В чем тут проблема?


Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
Const
  login='vasya';
  pass='pass';

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (Edit1.Text=login) and (Edit2.Text=pass)
    then
      begin
       Form2.Show;
       Form1.Visible:=false;
      end
    else
    ShowMessage('Ошибка!');
end;

end.


Код

unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Label1: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

end.

Автор: northener 30.5.2012, 17:26
Цитата(Boyur @  30.5.2012,  17:03 Найти цитируемый пост)
проблема в том, что если откроется окно приветствие, то после закрытия его, форма закроется а приложение будит весеть в задачах.

А как нужно сделать?

Автор: kami 30.5.2012, 17:36
Во-первых, нужно сделать так, чтобы форма логона не была главной.
Наверное, тогда и во-вторых не понадобится smile

Кстати,
Цитата(Boyur @  30.5.2012,  17:03 Найти цитируемый пост)
то после закрытия его,

в коде нет закрытия первой формы.

Автор: Boyur 30.5.2012, 17:38
Чтобы при закрытии программы... она закрывалсь полностью.. а не оставалась в процессах. (В 1 окне логина закрывается нормально, а в Приветствии остается в процессах).

Автор: kami 30.5.2012, 17:48
Цитата(Boyur @  30.5.2012,  17:38 Найти цитируемый пост)
В 1 окне логина закрывается нормально

Зачем обманываешь? Не закрывается оно. Сам же писал:
Код

Form1.Visible:=false;

Автор: Boyur 30.5.2012, 17:54
Ну просто если в первой форме нажать крестик, то все нормально закроется и процесс закроется.
А если из второй формы, то процесс не закрывается.

Если в первой форме добавить Form1.Close; то после нажатия кнопки то закрывается все и вторая форма.

Добавлено через 8 минут и 8 секунд
Разобрался...
Во второй форме добавил:
Код

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.Close;
end;


Теперь все нормально.

Автор: kami 30.5.2012, 18:03
Цитата(Boyur @  30.5.2012,  17:54 Найти цитируемый пост)
Ну просто если в первой форме нажать крестик, то все нормально закроется и процесс закроется.А если из второй формы, то процесс не закрывается.

Естественно. Потому что первая форма - главная. Ее закрытие означает, что приложение должно завершить работу.
Поэтому форма логина не должна быть главной.

http://delphiworld.narod.ru/base/show_splash3.html и сделай так же, только вместо LogoForm - свою форму логона.

Добавлено через 2 минуты и 30 секунд
Цитата(kami @  30.5.2012,  18:03 Найти цитируемый пост)
Потому что первая форма - главная.

Поправка - она главная в выложенном коде.

Добавлено через 6 минут и 11 секунд
Upd:
наверное, даже лучше http://delphiworld.narod.ru/base/show_splash.html. В особенности - читать текст, а не только код.

Автор: Boyur 30.5.2012, 19:03
Вот хочу воспользоваться кодом который ты показал:
Код

logoform := TLogoform.Create(nil);
{ ВНИМАНИЕ! show!   НЕ showmodal }
logoform.Show;

{ Здесь может размещаться код инициализации приложения,
  например, открытие базы данных... }

{ После блока кода, создающего все ваши формы и перед
  строчкой Application.Run напишите: }

logoform.Hide;
logoform.Release;


У меня это все выглядит так:
Код

begin
Form_login := TForm_login.Create(nil);
Form_login.Show;

//---------------
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm_general, Form_general);
  Application.CreateForm(Tdm, dm);
  Application.CreateForm(TForm_prihod_prod, Form_prihod_prod);
  Application.CreateForm(TForm_select_prod, Form_select_prod);
  Application.CreateForm(TForm_rashod_prod, Form_rashod_prod);
  Application.CreateForm(TForm_select_prod_rashod, Form_select_prod_rashod);
//Application.CreateForm(TForm_login, Form_login);
//---------------------
Form_login.Hide;
Form_login.Release;
  Application.Run;
end.


Что нужно написать перед инициализацией, чтобы основаня программа запустилась после нажатие на кнопку Form_login.Button1Click?

Автор: kami 30.5.2012, 19:20
Цитата(Boyur @  30.5.2012,  19:03 Найти цитируемый пост)
Form_login.Show;

1. В данном случае не Show, а ShowModal.
2. Application.Initialize должно идти первой строкой.
3. В обработчике OnClick кнопки OK вместо
Код

 if (Edit1.Text=login) and (Edit2.Text=pass)
    then
      begin
       Form2.Show;
       Form1.Visible:=false;
      end
    else
    ShowMessage('Ошибка!');

пишем
Код

 if (Edit1.Text=login) and (Edit2.Text=pass)
    then
      begin
       ModalResult:=mrOk;
      end
    else
      ModalResult:=mrCancel;


Всякие Hide и Release убрать.

Добавлено через 2 минуты и 9 секунд
Ах, да: 
код показа формы логина (в .dpr) будет выглядеть так:
Код

if IsNegativeResult(Form_login.ShowModal) then
  exit;

Автор: Boyur 30.5.2012, 19:42
Пишет [DCC Error] storage.dpr(27): E2003 Undeclared identifier: 'IsNegativeResult'
Незнает что такое IsNegativeResult

Автор: kami 30.5.2012, 19:53
Ну напиши
Код

if Form_login.ShowModal = mrCancel then


Добавлено через 4 минуты и 38 секунд
А вообще сложно нажать F1 на проблемной функции, чтобы посмотреть - в каком модуле она объявлена?

Автор: Boyur 30.5.2012, 20:08
Cпасибо те большое, все работает. F1 решает )))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)