Поиск:

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


Новичок



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

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



Borland C++ Builder 6

Код

class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TTimer *Timer1;
 
        TButton *Button1;
        TButton *Button2;
        TButton *Button3;
        TButton *Button4;
        


        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
        TPanel  *Panel[100];
        __fastcall TForm1(TComponent* Owner);
};

Создаю через кнопку массив из 4 объектов динамически
Код


void __fastcall TForm1::Button3Click(TObject *Sender)
{

     for(int i = 0; i < 4; i++) {
         Panel[i] = new TPanel(Owner);
         MicrobsCount++;
         // TPanel *Panel3 = new TPanel(Owner);

        static int Name_Num;
       Name_Num++;
        Panel[i]->Parent = Form1;
        Panel[i]->Height = 9;
        Panel[i]->Width = 9;
        Panel[i]->Color = clActiveCaption;
        Panel[i]->Left = rand()%Form1->ClientWidth;
        Panel[i]->Top = rand()%Form1->ClientHeight;
        Panel[i]->Enabled = true;
        Panel[i]->Name = "Panel"+IntToStr(Name_Num+4);
        Panel[i]->Caption = "";
        Panel[i]->Visible=true;
   }        
}


Далее через другую кнопку даю разрешение на передвижение созданных объектов.
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
     MicrCreated_flag =true;       
}


В обработчике таймера выводит ошибка при нажатии Button2 в дебаг. С указанием строки (строка указана в коде)
Причем если в таймере обращаюсь не через массив а через индекс (2 например) то все работает.
Код

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{

  if(MicrCreated_flag) {
   for(int i = 0; i < MicrobsCount; i++){
        Form1->Panel[i]->Left +=1;                                  // тут выкидывает после нажаия кнопки Button2
        if (Form1->Panel[i]->Left >= Form1->ClientWidth)
        Form1->Panel[i]->Left = 0;

        Form1->Panel[i]->Top +=1;
        if (Form1->Panel[i]->Top >= Form1->ClientHeight )
        Form1->Panel[i]->Top = 0;

      //  Form1->Panel[2]->Left +=1;                            //тут все работает 
      //  Form1->Panel[2]->Top +=1;
     }
   }
 
}


Вопрос в чем ошибка? Как в Таймере обращиться  по очереди к объектам. 
PM MAIL   Вверх
volatile
Дата 24.4.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(kibr3 @  24.4.2011,  06:06 Найти цитируемый пост)
 for(int i = 0; i < MicrobsCount; i++){
        Form1->Panel[i]->Left +=1;                                  // тут выкидывает после нажаия кнопки Button2

Цитата(kibr3 @  24.4.2011,  06:06 Найти цитируемый пост)
    //  Form1->Panel[2]->Left +=1;                            //тут все работает 

Во-первых надо давать сообщение ошибки.
Второе - тут и без сообщения видно, что видимо, i выходит за пределы массива. (а что еще может быть?)
Несмотря на излишне приведенный код, я так и не увидел где инициализируется MicrobsCount.
скорей всего ошибка именно в инициализации MicrobsCount = 0

PM MAIL   Вверх
kibr3
Дата 24.4.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(volatile @ 24.4.2011,  12:25)
Цитата(kibr3 @  24.4.2011,  06:06 Найти цитируемый пост)
 for(int i = 0; i < MicrobsCount; i++){
        Form1->Panel[i]->Left +=1;                                  // тут выкидывает после нажаия кнопки Button2

Цитата(kibr3 @  24.4.2011,  06:06 Найти цитируемый пост)
    //  Form1->Panel[2]->Left +=1;                            //тут все работает 

Во-первых надо давать сообщение ошибки.
Второе - тут и без сообщения видно, что видимо, i выходит за пределы массива. (а что еще может быть?)
Несмотря на излишне приведенный код, я так и не увидел где инициализируется MicrobsCount.
скорей всего ошибка именно в инициализации MicrobsCount = 0

В том то и дело. Нет кода ошибки. Ошибка выпадает на этапе выполнения после нажатия кнопки Button2 (до того объекты уже созданы путем нажатия Button3). 
Инициализация MicrobsCount как глобальные. 
Код

TForm1 *Form1;
bool MicrCreated_flag = false;
int MicrobsCount = 2;


Но похоже что вы правы. Дело MicrobsCount. 
Если пишу 
Код

 for(int i = 0; i < 2; i++) 

Вместо
Код

 for(int i = 0; i < MicrobsCount; i++)

то все работает. 
Только вот не пойму у меня же и так MicrobsCount = 2 ??

Проблема решилась. Банальная невнимательность. Не заметил MicrobsCount++; (вызов 4 раза) в обработчике Button3. 
Тогда перефразирую вопрос. Как избежать подобных ошибок при при работе с массивом? 


Это сообщение отредактировал(а) kibr3 - 24.4.2011, 15:06
PM MAIL   Вверх
borisbn
Дата 24.4.2011, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(kibr3 @  24.4.2011,  14:52 Найти цитируемый пост)
Как избежать подобных ошибок при при работе с массивом?

не использовать массивы. использовать вектор и его ф-цию at


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

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

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

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

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


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

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


 




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


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

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