Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385

Закрыть модальную форму изнутри

08.08.2010, 23:13. Показов 4101. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поясню, откуда взялся такой вопрос.
Создаются некие картинки (каждая соответствует месяцу), эти картинки
показываются на модальной форме, юзер совершает с ними какие-то действия,
закрывает, берет следующий месяц и т.д.
Но тут выясняется, что действмя эти однотипны и юзеру нужно только
эадать набор этих действий, временной интервал, нажать на кнопочку
и получить результат.
Все это я прекрасно делаю, организовав цикл по месяцам, в обработчике
OnShow выполняю требуемое и говорю Close();
Форма не закрывается. Приходится щелкать по крестику.
Пробовал
C++
1
SendMessage(Handle, WM_DESTROY, 0, 0)
- результат тот же.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.08.2010, 23:13
Ответы с готовыми решениями:

Закрыть модальную форму
Столкнулся со следующей проблемой. У меня в проекте есть главная форма, с которой я по кнопке открываю модально вторую форму. void...

Закрыть форму и открыть форму
Как закрыть не главную форму и запустить заново с ее начальным состоянием. Поясню. В Form2 у компонента radiobutton изначально...

Закрыть форму(не главную)
Собственно на главной форме создается другая(использую как меню) Application->CreateForm(__classid(TForm2), &Form2); При попытке...

9
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
08.08.2010, 23:30
2 формы первая закрытая со второй работаем
1
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
09.08.2010, 00:49  [ТС]
Sasha, чуток не тот случай. Там из кода 2-й формы закрывалась 1-я. А мне нужно из данной - эту же. Наверное, все просто, но от жары не соображается

Добавлено через 9 минут
Переставил все хозяйство в обработчик EvActivate.
Вместо Close(); попробовал
C++
1
SendMessage(Handle, WM_CLOSE, 0, 0);
- не реагирует

Добавлено через 3 минуты
Т.е. - как заставить модальную форму саму себя щелкнуть по крестику?
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
09.08.2010, 02:12
Day, у меня такое впечатление, что вы где-то в другом месте ошиблись...

Если вы вызываете вторую форму методом ShowModal, то вполне спокойно можете закрыть её через:
C++
1
2
Close();
Perform(WM_CLOSE,0,0);
1
 Аватар для abiprofi
48 / 48 / 7
Регистрация: 04.08.2010
Сообщений: 110
09.08.2010, 04:58
Day, вот пример:

.h - Form1
C++
1
#include "Unit2.h"
.cpp - Form1
C++
1
2
3
4
5
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Form2->ShowModal();//можно Form2->Show();
}
.h - Form2
C++
1
2
private:
int count;
.cpp - Form2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//---------------------------------------------------------------------------
void __fastcall TForm2::FormShow(TObject *Sender)
{
 if(Timer1->Enabled){Timer1->Enabled = false;}
 Label1->Caption = "10";
 count = 10;
 Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
 count--;
 Label1->Caption = IntToStr(count);
 if(count == -1)
 {
  Timer1->Enabled = false;
  //закрываемся
  Close();
 }
}
Вложения
Тип файла: zip Project1.zip (765.1 Кб, 19 просмотров)
1
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
09.08.2010, 18:10  [ТС]
Пришлось поместить на форму таймер и по первому его тику делать Close();
Заработало.
Но теоретический вопрос остался - из обработчика какого СОБСТВЕННОГО события формы можно ее заставить покончить с собой? Или этого сделать принципиально нельзя?
Ведь по смыслу моей задачи никакой таймер не нужен - сделал свое дело - и застрелись.

Спасибо всем, кто принял участие.
0
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
09.08.2010, 22:31
У меня в OnShow тоже не работает, а так нормально
C++
1
2
3
4
5
6
7
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Canvas->MoveTo(10,10);
Canvas->LineTo(50,100);
Sleep(2000);
Close();
}
1
2 / 2 / 0
Регистрация: 10.08.2009
Сообщений: 13
10.08.2010, 21:54
Еще можно внутри формы присвоить переменной ModalResult ненулевое значение. Тогда можно будет задавать результат вызова "форма->ShowModal()"
1
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
10.08.2010, 22:09  [ТС]
Livito, ModalResult мы присваивали разные ненулевые значения.
Но форма изнутри все равно не клозится.
Видимо, всех тайн виндовских механизмов не знает и сам папаша Виндоус.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.12.2011, 21:45
Лучший ответ Сообщение было отмечено как решение

Решение

Только что столкнулся с такой же проблемой. Пришлось повозиться, но решение нашлось:dance3:
Можно в обработчике OnShow использовать функцию:
C++
1
PostMessage(this->Handle, WM_CLOSE,0,0);
- при этом форма моргает разок, но, по крайней мере, закрывается.
Только эти инструкции должны быть последними в своей цепочке логического ветвления алгоритма обработчика события, то бишь не предшествовать, по меньшей мере, функциям, вроде ShowMessage. Например, у меня так:
C++
1
2
3
4
5
    else {
        ShowMessage( "Broken link. Try again or... try something else ;)" );
        PostMessage(this->Handle, WM_CLOSE,0,0);
        return;
    }
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.12.2011, 21:45
Помогаю со студенческими работами здесь

Закрыть главную форму
Есть 2 формы - Form1(главная), Form2. (создаются в AutoCreate). ПРи нажатии на кнопку на форме1, форма1 должна закрыться, а форма2...

Как закрыть форму
как зделать чтобы при нажатии на кнопку закрывалась программа(если конкретние то на Panel)

Как закрыть форму с клавиатуры
Может подскажите какрыть форму с клавиатуры. С главной формы запускаю форму TfrProsmLiz, нужно ее закрыть нажав на клавишу ESC. void...

Как закрыть форму с очисткой памяти?
У меня есть Form4. Там проходит тест. После того как тест пройден, например, эту форму закрыли. Затем из формы3 заново открыли форму4....

Вы уверены , что хотите закрыть форму?
Такое дело. Когда юзер скрывает форму (OnHide), нам нужно отобразить MessageBox с текстом "Уверены?" Ясно дело, что при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru