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
|
Правильно ли ты указываешь парента этих компонент?
И где происходит их удаление?
имхо правильнее было бы удалять их в деструкторе парента, хотя задачи бывают разные |
|
Konstantine |
Отправлено: 01.09.2004, 08:20 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
Народ, насоко Я знаю, если указывать парента (родителя т.е.) то энтот родитель и убивает этот объект. Попробуй протрассировать от создания объекта до уничтожения приложения. и проследи, сколько раз и откуда вызывается деструктор твоего объекта
а ещё лучше приведи этот кусок где вылазит (ещё лучше всю функцию-метод формы)
Отредактировано Konstantine — 01/09/2004, 09:24
|
|
AlexandrN |
Отправлено: 01.09.2004, 08:50 |
|
Не зарегистрирован
|
Думаю не все телепаты...
Так что код в студию |
|
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
|
|
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();
}
|
никаких ошибок, видимо дело в чем-то еще
|
|