Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаленеие массива динамических объектов, Как удалить динамические объекты  
:(
    Опции темы
greykardinal
Дата 3.12.2010, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Столкнулся с проблемой smile 
Создаю на форме массив динамических объектов  TComboBox. Размер массива заранее неизвестен. Решил воспользоваться vector
Кинул на форму две кнопки: одна создает массив, другая его разрушает.
Код

#include <vcl.h>
#pragma hdrstop
#include <vector>
#include <math.h>
#include "UDinMask.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
using namespace std;

AnsiString *S;
std::vector<TComboBox*> edt;
int NumChannels;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btnCreateClick(TObject *Sender)
{
Init();
Draw(NumChannels,grbMask->Width,grbMask->Height,20,10);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btnDestroyClick(TObject *Sender)
{
NumChannels=0;
delete []S;
edt.clear();
if (edt.empty()) Application->MessageBox("","",ID_OK);
Form1->Update();
}

void TForm1::Draw(int N,int Wi,int Hei,int a,int b)
{
S = new AnsiString[N];
for (int i=0;i<N;i++) S[i]=IntToStr(i);
div_t j = div(N,8);   
int delta=0;
int Num = j.quot;     
if (j.rem!=0) Num+=1;      
TComboBox *ff;
for (int i=0;i<N;i++)
        {
        ff= new TComboBox(this->grbMask);
        edt.push_back(ff);
        edt[i]->Parent=this->grbMask;
for (int j=0;j<N;j++) edt[i]->Items->Append(S[j]);
        edt[i]->Height=10;
        edt[i]->Width=(Wi-(Num+1)*b)/Num;
        delta=(Hei-2*a-8*edt[i]->Height)/8;      
        int k=i/8;      
        edt[i]->Left=(k)*edt[i]->Width+b*(k+1);
        edt[i]->Top=grbMask->Top+a+(edt[i]->Height+delta)*(i-8*k);
        edt[i]->Visible=true;
        }

}
//---------------------------------------------------------------------------


Проблема в том что массив создается, но не удаляется. Нажимай-не нажимай, TComboBox по прежнему на форме.
Подскажите, где моя ошибка
PM MAIL   Вверх
borisbn
Дата 3.12.2010, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Перед clear вектора необходимо пройтись по всем его элементам и delete их
Код

std::vector<TComboBox*>::iterator i;
for(i = edt.begin(); i != edt.end(); ++i)
    delete (*i); 



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Игорь1024
Дата 3.12.2010, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

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



Ещё NumChannels не инициализирован.


Это сообщение отредактировал(а) Игорь1024 - 3.12.2010, 08:15
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
greykardinal
Дата 3.12.2010, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



borisbn, спасибо, помогло.

Добавлено через 10 минут и 30 секунд
Возникла ещё одна проблема: при повторном создании массива на той же форме вылетает ошибка "Access violation ..." 
Ошибка вылетает на строке 
Код

edt[i]->Parent=this->grbMask;

Заглянул внутрь библиотеки vector.h - ругается на строку  
Код

reference operator[](size_type __n) { return *(begin() + __n);


Кто знает, в чем дело?
PM MAIL   Вверх
Игорь1024
Дата 3.12.2010, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

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



Ну так вы элементы удалилил, вот и access violation writing location выскакивает. Пишите не туда.
сделайте edt.resize().

Это сообщение отредактировал(а) Игорь1024 - 3.12.2010, 09:43
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
greykardinal
Дата 3.12.2010, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Игорь 1024, спасибо smile 
PM MAIL   Вверх
borisbn
Дата 3.12.2010, 11:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



greykardinal, я бы тебе посоветовал перед использованием кнопочек, комбобоксиков и т.п. тщательно изучить STL. ну, хотя бы не всю, а часть про контейнеры (векторы, стеки, списки). Поверь, на любой среде разработки Си++ пригодится.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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