powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Простой вопрос по очередности событий
15 сообщений из 15, страница 1 из 1
Простой вопрос по очередности событий
    #32475189
Фотография grinya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Мне в момент загрузки основной формы при определенных условиях нужно делать выход из программы. Если делать это на событие OnShow - функция exit (из stdlib.h) ругается, что нельзя менять фокус ненарисованных объектов, а метод Application->Terminate() молчит, но и не завершает прогу.
Так что получается два вопроса:
- на какое все-таки событие корректнее вешать выход?
и
- какую функцию выхода правильнее использовать в такой ситуации?
Спасибо.
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32475239
keisik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PostQuitMessage
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32475314
Фотография grinya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, похоже событие OnShow не дает так просто выйти:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void __fastcall TFMain::FormShow(TObject *Sender)
{
       if(SetContact() ==  0 )     
       {   // PostQuitMessage( 1 );
           Application->Terminate();     }

       ShowMessage( "На выход то не попали!" ); //причем пошагово это место
      //   прохожу, но сообщение уже не выдается
      // ... ну и дальше все выполняется
}

...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32475442
Фотография grinya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче не очень я понял природы такого явления: в процессе обработки OnShow методы Application->Terminate(), Form->Close() и др. сразу не срабатывают, а только после завершения OnShow. Хотя наверно так и правильно.
Сделал, как надо, добавив условие
Код: plaintext
1.
2.
3.
4.
 if(SetContact() ==  0 )     
                  Application->Terminate();     


...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32475445
Фотография grinya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин...,
добавив условие
Код: plaintext
1.
2.
3.
4.
  if(SetContact() ==  0 )     
                  Application->Terminate(); 
           else
          {  .... все остальное .... }

Тогда все завершается, когда мне надо.
Все. вопрос закрыт.
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32475484
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А просто Close();

не подходит чтоли ?


i_i
(';')
(V),(V),,
JS
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32475984
dishlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое-то неудачное событие выбрано. То есть мы показываем форму и тут же ее убираем. Зачем это мелькание формой?
В таких случаях я использую OnCreate или конструктор, что логично, запуск приложения - инициализация - форма не показывается, а приложение полностью работает, в этот момент и проверяем условие.
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32476087
Фотография grinya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а про просто Close() я и не догадался :). Для интереса проверил - точно также сразу не закрывает, а только пройдя до конца OnShow.
2dishlo - а никакого мелькания нет.
Первым делом выводится диалог запроса пароля и пользователя, а дальше - либо сразу сброс, либо перезапрос пароля, либо (если все ОК) уже рисуется форма.
А OnCreate в моем случае не катит, т.к. форма главная, а там мне надо еще к элементам формы DataModul обращаться, получается Access Violation.

2All - в любом случае спасибо за ответы.
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32476412
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не может быть. Если ты делаешь выход в Show, то стопудово мелькание есть, просто у тебя слишком быстрая видеокарта и процессор. Посмотри на слабых тачках-заметишь. Лучше у нее visible убирать, а когда все ОК, включать IMHO
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32477051
_Sania
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если нужно закрывать все приложение целиком, то можно вставить проверку в сам запуск приложения:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("unit1.cpp", Form1);
USEFORM("unit2.cpp", DataModule1); /* TDataModule: File Type */
USEFORM("unit3.cpp", Login);
//---------------------------------------------------------------------------
#include "unit3.h"
#include "unit2.h"

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(Tdm), &DataModule1);
TLogin *Login = new TLogin(Application);
Login->... - Если нужно что-то запустить перед проверкой.
if(Login->ShowModal() == mrOk)
{
Application->CreateForm(__classid(TfrmMain), &Form1);
Application->Run();
}
delete Login;
}
catch (Exception &exception)
{
Application->ShowException(&exception);
if(Login != NULL) delete Login;
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
if(Login != NULL) delete Login;
}
return 0;
}
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32477124
dishlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторформа главная, а там мне надо еще к элементам формы DataModul обращаться, получается Access Violation
Вообще, можно без проблем сначала создавать дата модуль, а потом главную форму. В свойствах проекта поменяйте порядок создания.

Самый кашерный способ - это вставить в функцию WinMain свою проверку, после создания всех форм, как уже было предложено.
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32477178
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче не очень я понял природы такого явления: в процессе обработки OnShow методы Application->Terminate(), Form->Close() и др. сразу не срабатывают, а только после завершения OnShow.

Само собой :) это азы событийного программирования для Windows (да и не только) - ведь вся обработка событий происходит в одном потоке - так что это просто физически невозможно - "заморозить" выполнение одного события и выполнить следующее!
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32477207
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да там вобще капец с событиями.

Вот на прошлой неделе... Разруливал как раз очередь событий. Нотификация о потере фокуса приходит вне очереди(отчего весь головняк и был). MSDN советовал накатать своё сообщение, чтобы в очередь эту нотификацию поставить. Ага... у меня 30 классов и я сщас всё брошу пойду для каждого обработчики делать(MFC).. Решил в существующем(OnChar) сделать исключительную ситуацию. Не получилось. Точнее получилось, но винды в MFC это сообщение порезали. Ок. Беру SendMessage и напрямую посылаю в окно сообщение (WM_CHAR). Оно приходит тут же!!! Прям недоробатывая текущий обработчик! Ничё не пойму... Это MFC такое?
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32477294
Фотография grinya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем продолжающим отвечать! :) В принципе, разобрался уже с ситуацией, но комментарии читать было все равно полезно и интересно.
...
Рейтинг: 0 / 0
Простой вопрос по очередности событий
    #32477837
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОк. Беру SendMessage
каюсь, накасячил :)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Простой вопрос по очередности событий
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]