Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.016 c
1-77986
Tahion2
2003-07-09 15:38
2003.07.24
32bit icons and TImageList


1-77843
edicon
2003-07-12 17:03
2003.07.24
Еще про защиту...


1-77958
Separator
2003-07-11 05:35
2003.07.24
Создание и уничтожени обьектов.


14-78075
Кен
2003-07-07 07:24
2003.07.24
А есть ли в Дельфи стэк ? По аналогии с тем, что использует проце


1-77990
Boss
2003-07-11 14:04
2003.07.24
Теория расписаний, помогите чем можете!!!




   Наверх