C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Проблемы с AccessViolation exception
dimidrol
Отправлено: 31.08.2004, 22:26


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Братья

проблема такая, создаю компоненти динамически: Мemo, Edit, BitBtn, Label

програмно их же стираю и при создании вылазит етот гребаный еррор
мол извини хлопец EAccessViolation error и дегуг кидает на файл проекта.
самое странное что может работать и нормально а потом бац и опять привет.

незнаете че можно сделать чтоб поправить, может кто встречался с такой проблемкой?

Заранее спасибо Всем!!!
klen
Отправлено: 31.08.2004, 23:54


Машинист паровоза

Группа: Участник
Сообщений: 239



"стираешь" это как понимть?
AVC
Отправлено: 01.09.2004, 07:52


Ветеран

Группа: Модератор
Сообщений: 1583



Проверьте порядок создания/удаления. Если все делать правильно ни чего не вылазит.
pagan
Отправлено: 01.09.2004, 08:11


Ученик-кочегар

Группа: Участник
Сообщений: 22



Правильно ли ты указываешь парента этих компонент?
И где происходит их удаление?
имхо правильнее было бы удалять их в деструкторе парента, хотя задачи бывают разные smile.gif
Konstantine
Отправлено: 01.09.2004, 08:20


Мастер участка

Группа: Модератор
Сообщений: 545



Народ, насоко Я знаю, если указывать парента (родителя т.е.) то энтот родитель и убивает этот объект. Попробуй протрассировать от создания объекта до уничтожения приложения. и проследи, сколько раз и откуда вызывается деструктор твоего объекта

а ещё лучше приведи этот кусок где вылазит (ещё лучше всю функцию-метод формы)


Отредактировано Konstantine — 01/09/2004, 09:24
AlexandrN
Отправлено: 01.09.2004, 08:50


Не зарегистрирован







Думаю не все телепаты...
Так что код в студию cool.gif
dimidrol
Отправлено: 01.09.2004, 11:20


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Други спасибо за поддержку, вот коды:


----------------------------------------------

Создаю таким образом:




vector vremia;

for ( int i =0; i < 5; i++)
{
vremia.push_back( new TEdit(this) );
vremia[index]->Parent = this;
vremia[index]->Name = "vremia" + IntToStr(i);
vremia[index]->Text = MyQuery1->FieldByName("nacalo_vremia")->AsString;
vremia[index]->SetBounds(100,100+i,150,23);

// сделано собитие на нажатие Enter
// прописанное в *.h формы
// его я описал ниже
vremia[index]->OnKeyUp = IzmenenijеVremia;
}




----------------------------------------------

*.h формa




class TForm9 : public TForm
{
__published:
TGroupBox *GroupBox3;
TBitBtn *BitBtn2;
TBitBtn *BitBtn4;
TDataSource *DataSource1;
TTable *Table1;
TBitBtn *BitBtn1;
TBitBtn *BitBtn3;
TMyTable *MyTable1;
TMyQuery *MyQuery1;
TBitBtn *BitBtn5;
TBitBtn *BitBtn6;
void __fastcall BitBtn2Click(TObject *Sender);
void __fastcall FormActivate(TObject *Sender);
void __fastcall BitBtn1Click(TObject *Sender);
void __fastcall BitBtn5Click(TObject *Sender);
void __fastcall BitBtn3Click(TObject *Sender);
void __fastcall BitBtn4Click(TObject *Sender);

void __fastcall IzmenenijеVremia( TObject *Sender, WORD &Key, TShiftState Shift );
......
и так далее
......




----------------------------------------------

Затем удаляю:




vremia.clear();

for ( int i=this->ComponentCount-1; i> 0; i-- )
{

if ( this->Components[i]->ClassNameIs("TEdit") ){
this->Components[i]->Free();
}
}




и когда надо заново создаю. Создание и удаление происходит в одной и той же форме она и является парентом, и не закрывается на протяжении всех вышеуказанных процессов.

А залом, сбой происходит после вызова удаления / создания динамических компонентов. я привел пример создания тока Edit, также создаются: Memo, Label, CheckBox, BitBtn. на форме уже естш созданые статически пару кнопок.
dimidrol
Отправлено: 01.09.2004, 11:22


Дежурный стрелочник

Группа: Участник
Сообщений: 36



сорри еще забыл поправить, в создании компонент в скобках массива вписивается конечно не index a i

smile.gif
xTrim
Отправлено: 01.09.2004, 11:54


Машинист паровоза

Группа: Участник
Сообщений: 208



может правильнее было бы удалять оттуда-же куда вствлял?
CODE

for(vector<TEdit*>::iterator i=vremia.begin();i!=vremia.end;i++)
delete (*i);
vremia.clear();

а вставку имхо лучше написать так
CODE

for ( int i =0; i < 5; i++)
{
TEdit* e = new TEdit(NULL);
e->Parent = this;
e->Name = "vremia" + IntToStr(i);
e->Text = MyQuery1->FieldByName("nacalo_vremia")->AsString;
e->SetBounds(100,100+i,150,23);
e->OnKeyUp = IzmenenijеVremia;
vremia.push_back(e);
}
dimidrol
Отправлено: 01.09.2004, 12:28


Дежурный стрелочник

Группа: Участник
Сообщений: 36



xTrim

изменил код как ты посоветовал, но непомогло тот же еррор.
тока мне недает борланд так создать компонент

TEdit* e = new TEdit(NULL);

дает тока так

TEdit* e = new TEdit( this );

может в етом загвоздка? хотя сомневаюсь, что ето может повлиять.
Guest
Отправлено: 01.09.2004, 12:51


Не зарегистрирован







И правильно не дает. Заметьте, что TEdit* e = new TEdit( this ); работае тока если вы эдиты бросаете на форму. А если на панель или исчё на что, то нужно указывать реальный parent.
xTrim
Отправлено: 01.09.2004, 14:06


Машинист паровоза

Группа: Участник
Сообщений: 208



CODE

std::vector<TEdit*> vremia;
void __fastcall TForm1::Button3Click(TObject *Sender)
{
for ( int i =0; i < 5; i++)
{
 TEdit* e = new TEdit(this); //и парвда описАлся
 e->Parent = this; // или Panel1, неважно
 e->Name = "vremia" + IntToStr(i); // будет ошибка если два раза создать без удаления, можно не делать
 e->Text = "nacalo_vremia";
 e->Top = e->Height*i;
 vremia.push_back(e);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
for(std::vector<TEdit*>::iterator i=vremia.begin();i!=vremia.end();i++)
 delete (*i);
vremia.clear();
}

никаких ошибок, видимо дело в чем-то еще

Вернуться в Вопросы программирования в C++Builder