Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.24;
Скачать: CL | DM;

Вниз

Закрытие формы в её FormActivate   Найти похожие ветки 

 
Не знающий   (2003-07-09 23:53) [0]

Есть две формы. На превой форме лежит баттон, по нажатию на который открывается вторая форма.

procedure TForm1.Button1Click(Sender:TObject);
begin
ShowMessage("1");
Form2.ShowModal;
ShowMessage("2");
end;

procedure TForm2.OnActivate(Sender:TObject);
begin
{Чего-то делается}
{................}
Form2.Close;
end;

После нажатия на баттон получаю сообщ 1 и открывается вторая форма. После того как чего-то во второй форме выполняется выскакивает сообщение 2, но форма остаётся на экране, т.е. во второй форме всё проходит успешно, управление передаётся в форму 1. Почему так происходит (вторая форма не закрывается)?


 
Marat ©   (2003-07-10 01:27) [1]

Дело в том, что у неглавных форм вызов метода Close не
приводит к закрытию (уничтожению) формы, как это происходит
при вызове Close главной формы. У второй формы это равносильно
вызову метода Hide, т.е. она просто "прячется", но не
уничтожается. А события типа OnActivate,OnCreate,OnShow и т.д.
не позволяют менять свойство Visible (что и происходит при
вызове Close второй формы). Если бы ты вместо Form2.ShowModal
написал просто Form2.Show, то у тебя вообще бы исключение
выскочило.В данном случае вместо OnActivate засунь весь код в
OnPaint и всё будет работать нормально.


 
Германн ©   (2003-07-10 01:55) [2]

Еще один вариант - заменить "прямое" закрытие на "отложенное". Т.е. вместо
Form2.Close;
поставить
PostMessage(Handle,WM_Close,0,0);
при необходимости добавив Exit сразу после PostMessage;


 
Skier ©   (2003-07-10 08:52) [3]

>Не знающий (09.07.03 23:53)
Мне кажется в твоей программе неправильная логика.
И OnActivate тут ни при чём.
Дело в том что Form2.ShowModal это функция .
Попробуй это использовать...


 
ЮЮ ©   (2003-07-10 09:11) [4]

и модальная форма "изнутри" должна закрывается ModalResult := mrXXX, а не Close


 
Дин Каа   (2003-07-10 12:04) [5]

Кстати в хелпушнике на ShowModal очень подходящий пример есть.
Как раз такой случай


 
Не знающий   (2003-07-10 19:02) [6]

OK. Спасибо


 
FoxBox   (2003-07-14 09:22) [7]

Как вариант, по условию в onActivate
запускай таймер, если надо закрыть окно.

Timer1.Enabled := true;

а в таймере напиши:
Timer1.Enabled := false; // от греха подальше, достаточно одного вызова
Close;

Проблема решится...



Страницы: 1 вся ветка

Текущий архив: 2003.07.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
3-77755
Vovik
2003-07-01 15:43
2003.07.24
Уважаемые Мастера. Почему не создается ADOQuery?


1-77932
OlegNOE
2003-07-10 15:30
2003.07.24
Рамка вокруг ячейки


1-77993
kostya
2003-07-11 16:22
2003.07.24
Помогите с Bitmap...ом


1-77896
Skier
2003-07-11 12:54
2003.07.24
Left side cannot be assigned to


3-77796
Felixx
2003-07-03 08:30
2003.07.24
Список доступных SQL серверов...