Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2017, 02:15   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Закрыть форму при открытии новой с Show

Доброе время суток форумчане. Есть три формы

Unit1

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  Form2.ShowModal;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form3 := TForm3.Create(Self);
  Form3.ShowModal;
end;
Unit3

Код:
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form1.Button1Click(Sender);
  Form3 := nil;
end;
Когда в Form1 нажимается кнопка Button2, открывается Form3. При закрытии Form3, открывается Form2.
Мне нужно, чтоб при закрытии Form3, не только открывалась Form2, но и ЗАКРЫВАЛАСЬ Form3. Сейчас она не закрывается, а остается висеть, находясь за Form2. Все формы должны открываться «ShowModal», метод «Show» не подходит.

Тут на одном из сайтов видел:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm2.Create(nil) do
  try
    ShowModal;
  finally
    Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with TForm3.Create(nil) do
  try
    ShowModal;
  finally
    Free;
  end;

  Button1Click;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
end;
Но в этом коде, после создания формы, они все равно равны "nil", а я проверяю сущесьвование формы - мне не подходит

Заранее спасибо за ответ.

Последний раз редактировалось KBO; 30.03.2017 в 02:17.
KBO вне форума Ответить с цитированием
Старый 30.03.2017, 09:16   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Вар 1. Форма сама должна знать как вести себя при ее закрытии
Delphi Help
Цитата:
OnClose event (TCustomForm)
Occurs when the form closes.
CloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;
Цитата:
The TCloseEvent type points to a method that handles the closing of a form. The value of the Action parameter determines if the form actually closes. These are the possible values of Action:

Value Meaning

caNone The form is not allowed to close, so nothing happens.
caHide The form is not closed, but just hidden. Your application can still access a hidden form.
caFree The form is closed and all allocated memory for the form is freed.
caMinimize The form is minimized, rather than closed. This is the default action for MDI child forms.
CaNone значение по умолчанию
а тебе надо СaFree.
TForm2, TForm3, ... назначаем указанный обработчик события (вкладка events of ObjectInspector) и ПРИСВАИВАЕМ нужное значение.

Вар 2. Управляем формой полностью сами.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  f: TForm; // используем ЛОКАЛЬНЫЕ переменные
begin
  f:= TForm2.Create(Self); // создали
  f.ShowModal; // показали и дождались 
  f.Release; // ВЕЖЛИВО попросили об удалении (РЕКОМЕНДОВАНО 
 ИЛИ!!!
  f.Free; // СТРОГО сказали удалить
end;
хотя обычно в таких случаях делают дополнительные действия в зависимости от ВАРИАНТов закрытия
Код:
if f.ShowModal =mrOK then begin
....здесь мы ЕЩЕ можем использовать какие-то свойства нашей закрытой , но ПОКА не уничтоженной f: TForm2;
end
else begin
....
end;
f.Release; // а вот ПОСЛЕ этого уже не сможем
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.03.2017 в 09:30.
evg_m вне форума Ответить с цитированием
Старый 30.03.2017, 09:39   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Попробуйте так
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm2.Create(nil) do
  try
    ShowModal;
  finally
    Free;
    Button2Click(nil);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with TForm3.Create(nil) do
  try
    ShowModal;
  finally
    Free;
  end;
end;
Ну или с доп проверкой
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm2.Create(nil) do
if ShowModal <> mrOK then
begin
    Free;
    Button2Click(nil);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with TForm3.Create(nil) do
  if ShowModal <> mrOK then
    Free;
end;
Чтобы уничтожались формы при закрытии, нужно прописать так в формах
Код:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;

в самом проекте уберите создание этих форм
Код:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);

//Убрать это
 //Application.CreateForm(TForm2, Form2);
  //Application.CreateForm(TForm3, Form3);

  Application.Run;
end.

Последний раз редактировалось Aliens_wolfs; 30.03.2017 в 09:49.
Aliens_wolfs вне форума Ответить с цитированием
Старый 30.03.2017, 09:39   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Но в этом коде, после создания формы, они все равно равны "nil", а я проверяю сущесьвование формы - мне не подходит
А чего им быть не nil, если ни чего не записываешь в переменную? TForm2.Create(nil) сама по себе ни чего не запишет в переменную Form2. Вариант Form2:=TForm2.Create(nil) запишет. Form2.Free тоже nil не запихнет в Form2. Или ручками или FreeAndNil. Ну и Create(nil) не использовал бы. Create(Application)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.03.2017, 09:53   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Можно еще попробовать так nil сделать в событии уничтожения формы

Код:
procedure TForm3.FormDestroy(Sender: TObject);
begin
Sender:= nil;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
Sender:= nil;
end;
Ну или так как подсказал Аватар
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2:= TForm2.Create(nil);
if Form2.ShowModal <> mrOK then
begin
   FreeAndNil(Form3);
    Button2Click(nil);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form3:= TForm3.Create(nil);
  if Form3.ShowModal <> mrOK then
    FreeAndNil(Form3);
end;

Последний раз редактировалось Aliens_wolfs; 30.03.2017 в 10:03.
Aliens_wolfs вне форума Ответить с цитированием
Старый 30.03.2017, 18:39   #6
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

спасибо получилось
KBO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрыть форму Alt+F4 zvygin1964 Общие вопросы Delphi 15 05.06.2016 08:11
Закрыть и открыть форму Swatch Microsoft Office Access 1 31.05.2010 23:04
Как закрыть форму при показе RIO Общие вопросы Delphi 4 28.08.2009 07:54
при добавлении новой записи через форму подставлолось значение из другой таблицы Baxxter Microsoft Office Access 1 07.01.2009 22:23
Закрыть форму при нажатии на Button Ellita Помощь студентам 5 26.09.2007 20:49