Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Ошибка при закрытии многооконного приложения


Автор: php5 14.1.2009, 20:20
Есть многооконного приложения для роботы с БД
Когда открывается окно при событии FormActivate происходит загрузка данных с БД
Код

AnsiString  sql="запрос ";
IBQuery1->Close();
IBQuery1->SQL->Clear();
IBQuery1->SQL->Add(sql);
IBQuery1->Open();

Так вот если открыть таких окон 2 и больше то при закрытии окна происходит ошибка (Смотри прикрепленный файл )

в обработчике события FormActivate 
Как это лечить ? 

Автор: artsb 15.1.2009, 00:16
А больше в FormActivate ничего нет? Просто при закрытии формы активируется предыдущая и происходит это событие опять. Может лучше операторы из него перенести в OnShow()?

Автор: Mpak 15.1.2009, 05:16
OnShow() вроде тоже срабатывает при переключении окон..
если требуется один раз в форму подгрузить данные из БД, то может стоит использовать событие OnCreate()?

Автор: Dem_max 15.1.2009, 06:23
Да лучше в OnCreate.

Автор: php5 15.1.2009, 11:40
Эта ошибка явно не связана с БД т.к она происходит если   в этом событии  делать  Form->Caption="Form";

Автор: orthrus 15.1.2009, 11:54
Событие FormClose обрабатывается?

Добавлено через 2 минуты и 58 секунд
И вообще приведи сюда весь код этого класса, а то ясновидящие и экстрасенсы в отпуске.

Автор: php5 15.1.2009, 12:07
код прост, для FormStyle  стаит fsMDIChild     
Код

#include <vcl.h>
#pragma hdrstop

#include "myForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)

#pragma resource "*.dfm"
TForm8 *Form8;
//---------------------------------------------------------------------------
__fastcall TForm8::TForm8(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm8::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=caFree;
}
//---------------------------------------------------------------------------

void __fastcall TForm8::FormActivate(TObject *Sender)
{
  Form8->Caption="Form";
}
//---------------------------------------------------------------------------


Автор: mrbrooks 15.1.2009, 12:15
Цитата(php5 @  14.1.2009,  20:20 Найти цитируемый пост)
Так вот если открыть таких окон 2 и больше то при закрытии окна происходит ошибка (Смотри прикрепленный файл )

это что - выходит несколько окон работают с одной БД?

Автор: xvr 15.1.2009, 13:24
В порядке эксперимента, замени 
Код

void __fastcall TForm8::FormActivate(TObject *Sender)
{
  Form8->Caption="Form";
}

на
Код

void __fastcall TForm8::FormActivate(TObject *Sender)
{
  Caption="Form";
}

Автор: artsb 15.1.2009, 13:29
Цитата(Mpak @  15.1.2009,  05:16 Найти цитируемый пост)
OnShow() вроде тоже срабатывает при переключении окон..

Разве?..

Автор: php5 15.1.2009, 13:37
О  xvr,  вроде  помогло , а в чем прикол ?  smile 
кстати при переключении окон OnShow не срабатывает 


Автор: artsb 15.1.2009, 14:13
Цитата(php5 @  15.1.2009,  13:37 Найти цитируемый пост)
кстати при переключении окон OnShow не срабатывает

Ну хоть в чём-то я прав smile

Добавлено @ 14:15
Цитата(php5 @  15.1.2009,  13:37 Найти цитируемый пост)
а в чем прикол ?

А как вы формы создаёте?
У них разные имена?

Вы видать пытаетесь обратиться не к текущей форме, а к Form8. 
Посмотрите имена разных форм. Например так:
Код

// в OnShow() формы
ShowMessage(Name);

Автор: php5 15.1.2009, 14:26
Да наверное весь прикол в создании формы, я их создаю   так :
Application->CreateForm(__classid(TForm8), &Form8);
 Form8->Show();

Т.е у всех экземпляров одно и тоже имя 

Автор: xvr 15.1.2009, 14:27
Цитата(php5 @ 15.1.2009,  13:37)
О  xvr,  вроде  помогло , а в чем прикол ?  smile 

Никакого прикола, голая правда жизни  smile Переменная Form8 указывает на автоматически создаваемый при старте программы экземпляр формы. При закрытии/уничтожении формы (из за Action=caFree; в FormClose) собственно форма уничтожается, а переменная Form8 начинает указывать на мусор, оставшийся от уничтоженной формы. При следующей попытке через нее что то позвать программа падает.

Автор: Vyacheslav 15.1.2009, 15:04
Цитата(php5 @  15.1.2009,  14:26 Найти цитируемый пост)
Да наверное весь прикол в создании формы, я их создаю   так :
Application->CreateForm(__classid(TForm8), &Form8);
 Form8->Show();

Т.е у всех экземпляров одно и тоже имя 


Можно вопрос.
А чего Вы за этот  CreateForm уцепились?

Автор: artsb 15.1.2009, 15:49
php5, попробуйте создавать формы как в примере:

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)