Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SetFocus [D5, Win95/98]


grig ©   (2002-07-04 15:31:00) 

Уважаемые мастера! У меня возникла вот какая проблемма:
Создаю в приложении форму и вызываю ее

Application.CreateForm(TForm1, Form1);
Form1.ShowModal;

и далее закрываю ее

Form1.Release;


В методе Activate формы идет создание и вызов другой формы

Procedure TForm1.FormCreate();
Begin
FirstActivate := True;
end;

Procedure TForm1.FormActivate();
Begin
If FirstActivate then begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
Form1.SetFocus; // Управление остается на вызвавшей форме

FirstActivate := false;
end;
end;

и закрытие

Procedure TForm1.Close;
begin
Form2.Release;
end;

Так вот, без использования SetSocus все работает без ошибок, а с использованием при закрытии Form1 возникает Exception. Из-за чего это может быть? Заранее благодарен.


Игорь Шевченко   (2002-07-04 16:45:00) [1]

qube © (04.07.02 15:45)

В данном случае без разницы, для какой формы вызывать Free, для созданной по TForm.Create(nil), TForm.Create(Application), Application.CreateForm (...)

Деструктор TForm самостоятельноудалит объект формы из списка компонент владельца.
Впрочем, это касается любого потомка TComponent, не обязательно формы.


Skier   (2002-07-04 16:38:00) [2]

>Johnmen
Да.
Но только в книгах (в большинстве случаях) форму
через TApplication.CreateForm(...) не создают.


Johnmen   (2002-07-04 16:25:00) [3]

>Skier ©
>TYourForm.Create(Application);
Что соответствует TApplication.CreateForm(...)


grig   (2002-07-04 16:09:00) [4]

Всем спасибо большое. Приколы были в управлении переменной FormActivate: Boolean; Sorry, мой недосмотр.


Skier   (2002-07-04 16:05:00) [5]

>grig
Можно конечно и так, но... в умных книгах
(в основном) формы так не создаются, поэтому советую
тебе переучится и создавать формы примерно так :


var
YourForm : TYourForm;
begin
YourForm := TYourForm.Create(Application);
try
// твой код...
finally
YourForm.Free;
end; //try
end;


grig   (2002-07-04 15:57:00) [6]

> qube и >Skiler
Конечно можно создавать форму вызовом TApplication.CreateForm и
потом ее удалять вызовами Release и Free. Я всю жизнь так и делаю и никогда нигде не глючило.


Skier   (2002-07-04 15:52:00) [7]

>qube

> Если ты создаешь форму вызовом TApplication.CreateForm,
> эту форму уничтожать вызовами типа ..., Free нельзя...


Враньё !


qube   (2002-07-04 15:45:00) [8]

Если ты создаешь форму вызовом TApplication.CreateForm, эту форму уничтожать вызовами типа Release, Free нельзя, ее уничтожит деструктор объекта Application. Для динамического создания формы и последующего удаления используй
MyForm := TMyForm.Create(nil);
...
MyForm.Release;


Skier   (2002-07-04 15:43:00) [9]

>grig

> Close ведь не освобождает форму


Если хочешь освободить форму, то :

1) Пиши Free вместо Release
2) Пиши Close вместо Release, но в обработчике OnClose
поставь : Action := caFree;


grig   (2002-07-04 15:39:00) [10]

2alexdbases и Skiller
Close ведь не освобождает форму, а только ее закрывает, а надо ее выгрузить из памяти


Skier   (2002-07-04 15:37:00) [11]

>grig
Если нет острой необходимости в испол-нии Form1.Release,
то лучше испол-ть Form1.Close


alexdbases   (2002-07-04 15:34:00) [12]

Release - Close....поробуй....:-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо