Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отмена создания формы в OnCreate, как прервать выполнение?  
:(
    Опции темы
sergey_85
Дата 18.8.2008, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: 1
Всего: 1



Привет!

Есть 2 формы в коде 1 формы динамически создаётся 2 и открывается:

Код

    TFrmInspectors *frmInspector = new  TFrmInspectors(this);
    frmInspector->ShowModal();
    delete frmInspector;
    frmInspector = 0;


Так вот,  в событии OnCreate 2 формы происходит кое-какая проверка и если она завершается неудачей (например нет файла) то форма не должна старовать т.е. она и не нужна больше.
Для этого делаю вызов в событии OnCreate this->Close(); но ничего не происходит, форма открывается.



--------------------
A good design always pays off.
PM MAIL   Вверх
mrbrooks
Дата 18.8.2008, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Масло маслянное имхо. Не проще ли проверять условие до создания формы? И уже по результатам - создовать или нет.
PM MAIL   Вверх
sergey_85
Дата 18.8.2008, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: 1
Всего: 1



Да думаю так и сделаю - другого выбора нет!

А всё-таки, как убить форму в событии OnCreate OnShow?


--------------------
A good design always pays off.
PM MAIL   Вверх
mrbrooks
Дата 18.8.2008, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(sergey_85 @ 18.8.2008,  09:18)
А всё-таки, как убить форму в событии OnCreate OnShow?

Убивать форму при создании?  smile Это очень оригинально. Я пожалуй умою руки - но с удовольствием прослежу за ответами комрадов  smile 
PM MAIL   Вверх
volvo877
Дата 18.8.2008, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 13
Всего: 116



Цитата(sergey_85 @  18.8.2008,  09:18 Найти цитируемый пост)
А всё-таки, как убить форму в событии OnCreate
Ну, убить-то можно, например, так:
Код

PostMessage(Handle, WM_CLOSE, 0, 0);
, но не по людски это... Условие надо проверять заранее, до попытки создания...
PM MAIL   Вверх
HappyLife
Дата 18.8.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



delete this;
PM MAIL   Вверх
586
Дата 18.8.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(mrbrooks @  18.8.2008,  10:23 Найти цитируемый пост)
Цитата(sergey_85 @  18.8.2008,  10:18 Найти цитируемый пост)
А всё-таки, как убить форму в событии OnCreate OnShow? 

Убивать форму при создании?   smile Это очень оригинально.


Да. Любители мелькать формами.  smile 

Создай метод, который будет вызываться перед ShowModal, или перегрузи метод ShowModal (он кстати виртуальный)
Код
class TForm2 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
public:        // User declarations
    __fastcall TForm2(TComponent* Owner);
    virtual int __fastcall ShowModal();
};



int __fastcall TForm2::ShowModal()
{
    //return -1;

    return TForm::ShowModal();
}

PM   Вверх
Vyacheslav
Дата 19.8.2008, 12:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(sergey_85 @  18.8.2008,  06:42 Найти цитируемый пост)
Так вот,  в событии OnCreate 2 формы происходит кое-какая проверка и если она завершается неудачей (например нет файла) то форма не должна старовать т.е. она и не нужна больше.
Для этого делаю вызов в событии OnCreate this->Close(); но ничего не происходит, форма открывается.


Итак. Запомните раз и   навсегда, что С++Builder - это С++, а не Delphi и соответственно пользоваться  событиями
OnCreate  и OnDestroy - это моветон. Они просто унаследованы из Delphi для совместимости. Вместо них в С++  нужно использовать конструкторы и деструкторы. Причем эти рекомендации ясно прописаны в хелпе по  событиям OnCreate  и OnDestroy, но почему- то все упорно продолжают запихивать в OnCreate  и OnDestroy код, которому самое место в конструкторе и деструкторе

А что в таких случаях делают в С++, если на момент создания стало ясно, что объект не нужен? Единственный  и стандартный способ - это сгенерить исключение
Мой код бы выглядел в этом случае так
Код

TFrmInspectors *frmInspector;
try{
  frmInspector = new TFrmInspectors(this);
  frmInspector->ShowModal();
  delete frmInspector;
}
catch( Exception*  exp)
{
    // здесь можно выдать на экран сообщение о том, что послужило причиной ошибки или просто невозможности вывести форму
    ShowMessage( exp->Message);
   // а можно просто ничего не выводить
} 
 

А с учетом , что я вообще стараюсь перехватывать все исключения   централизовано, используя ApplicationEvent  и  при использовании stl
весь код  превращается в
Код

 __ fastcall TFrmInspectors(Component* Owner) :TForm( Owner )
{
     if (... )
     {
             throw Exception("File is not  found");
     }
     
}


Код

{
 std::auto_ptr<TFrmInspectors> (new TFrmInspectors(NULL) )->ShowModal();
}



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
HappyLife
Дата 19.8.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Vyacheslav, 
Моветон не моветон, однако есть два момента на мой взгляд несказанные Вами.
1. При двойном клике по форме, увы и ах IDE предлагает работать именно с OnCreate и ни с чем больше. Что и заставляет начинающих использовать именно его.
2. Является существенным плюсом, что есть такое событие как OnDestroy. Правда у меня, скажу честно не разу не возникло необходимости этим плюсом воспользоваться. Может быть оно и к лучшему. А плюс в том, что мы можем ВНЕ формы определить некие операции при её удалении.
Код


__fastcall TForm1::TForm1(TComponent* Owner)
        : TFrame(Owner)
{
      TForm * frm = new TForm(this);
      frm->OnDestroy = Kirdyk;
     delete frm;
}

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

void __fastcall TForm1::Kirdyk(TObject *Sender)
{
    ShowMessage("Кина не будет:(");
}


Это сообщение отредактировал(а) HappyLife - 19.8.2008, 16:05
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.