Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 4 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Junior
Статус: Не в сети
Регистрация: 14.06.2011
Откуда: ХМАО
В теме о С++ Builder последний пост был в прошлом году, так что создаю отдельную тему.

В C++ совсем новичок, сейчас пишу программу, суть такова: создаём некоторое количесво кружочков, отрисовываем на форме с помощью TShape, выбираем интересующий нас кружок и двигаем его по форме, меняем размеры и т.д.

Сначала всё было довольно просто, пока я не начал создавать объекты во время выполнения. Для того чтобы реализовать поиск среди динамически созданных объектов, создал динамический список, добавил в него все созданные объекты, реализовал выбор по щелчку на Shape. Со статическими объектами и без списка всё работает как часы, только указывать для перемещения их приходится "в лоб", например
Код:
Selected = &b1
. Но как только появился список и я начинаю двигать найденные с его помощью кружочки, появляется Access Violation в методах Up/Down/Left/Right класса Ball. Что интересно, если включать в тот же список только статические кружочки, всё равно возникает та же ошибка. Прошу помощи, третий день сижу над программой.

Вот код:
Код:
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}

class Ball //****************Ball
{
   static int Count;
   int x, y;
   int R;
   COLORREF BrushColor;
   COLORREF PenColor;
   bool HaveShape;

public:
   int N;
   Ball *Next;

   Ball();
   Ball(int x1, int y1, int Rad, COLORREF BC, COLORREF PC);
   ~Ball();
   void Resize(int Rad);
   void Up(int Offset);
   void Down(int Offset);
   void Left(int Offset);
   void Right(int Offset);
   void GiveShape();
   friend int GetR(Ball a);
   friend void Draw(Ball *a);
};

int Ball::Count = 0;

Ball::Ball()
{
   this->N = Count;
   Count++;
   x = N * 100;
   y = 100;
   R = 10;
   BrushColor = RGB(255, 255, 255);
   PenColor = RGB(0, 0, 0);
   HaveShape = false;
   Next = NULL;
};

Ball::Ball(int x1, int y1, int Rad, COLORREF BC, COLORREF PC)
{
   this->N = Count;
   Count++;
   x = x1;
   y = y1;
   R = Rad;
   BrushColor = BC;
   PenColor = PC;
   HaveShape = false;
   Next = NULL;
};


void Ball::Resize(int Rad)
{
   this->R = R + Rad;
};

void Ball::Up(int Offset)
{
   y-=Offset;
};

void Ball::Down(int Offset)
{
   y+=Offset;
};

void Ball::Left(int Offset)
{
   x-=Offset;
};

void Ball::Right(int Offset)
{
   x+=Offset;
};


void Ball::GiveShape()
{
   this->HaveShape = true;
};

Ball::~Ball()
{
   this->N = NULL;
   this->x = NULL;
   this->y = NULL;
   this->R = NULL;
   this->BrushColor = NULL;
   this->PenColor = NULL;
};



struct DynList
{
   Ball *Head;
   Ball *Tail;

public:
   DynList()
   {
      this->Head = NULL;
   };

   bool IsListEmpty()
   {
      return (this->Head == NULL);
   };

   void IncludeBall(Ball *x)
   {
      if (IsListEmpty())
         this->Head = x;
      else
         this->Tail->Next = x;
      this->Tail = x;
   };

   Ball* Search(int n)
   {
      while (this->Head != NULL)
      {
         if (this->Head->N == n)
            return this->Head;
         this->Head = this->Head->Next;
      }
      return this->Head;
   };
};


void Draw(Ball *a)

{
   if (a->HaveShape == true)
   {
      TShape *Shape = (TShape*)Form1->FindComponent("Shape" + AnsiString(a->N));
      Shape->Width = a->R * 2;
      Shape->Height = a->R * 2;
      Shape->Left = a->x;
      Shape->Top = a->y;
      Shape->Brush->Color = a->BrushColor;
      Shape->Pen->Color = a->PenColor;
   }
   else
   {
      TShape *Shape = new TShape(Form1);
      Shape->Parent = Form1;
      Shape->Name = "Shape" + AnsiString(a->N);
      Shape->Shape = stCircle;
      Shape->Width = a->R * 2;
      Shape->Height = a->R * 2;
      Shape->Left = a->x;
      Shape->Top = a->y;
      Shape->Brush->Color = a->BrushColor;
      Shape->Pen->Color = a->PenColor;
      Shape->Visible = true;
      Shape->Enabled = true;
      Shape->OnMouseDown = Form1->SelectBall;
      Shape->Tag = a->N;
      a->GiveShape();
   }
};


DynList DL;
Ball b1(150, 200, 50 , RGB(21,135,253), RGB(20,20,20));
Ball b2;
Ball *Selected = &b1;



void __fastcall TForm1::SelectBall(TObject *Sender, TMouseButton Button, TShiftState Shift,
        int X, int Y)
{
   Selected = DL.Search(((TShape*)Sender)->Tag);
};

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Draw(&b1);
  Draw(&b2);
  DL.IncludeBall(&b1);
  DL.IncludeBall(&b2);
  for (int i = 0; i < 2; i++)
  {
     Ball *b = new Ball();
     Draw(b);
     DL.IncludeBall(b);
  };


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

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  switch (Key)
  {
      case VK_UP:
      {
         Selected->Up(10);
         Draw(Selected);
         break;
      };
      case VK_DOWN:
      {
         Selected->Down(10);
         Draw(Selected);
         break;
      };
      case VK_RIGHT:
      {
         Selected->Right(10);
         Draw(Selected);
         break;
      };
      case VK_LEFT:
      {
         Selected->Left(10);
         Draw(Selected);
         break;
      };

      default:;
  }
}



Партнер
 

Member
Статус: Не в сети
Регистрация: 27.03.2007
Во первых это overclockers.ru.
Во вторых необходимо оставить только класс Ball без Ball *Next и воспользоваться std::list<Ball> и std::list<Bal>::iterator


 

Member
Статус: Не в сети
Регистрация: 28.12.2008
Откуда: Новороссийск
Цитата:
DynList DL;
Ball b1(150, 200, 50 , RGB(21,135,253), RGB(20,20,20));
Ball b2;
Ball *Selected = &b1;

Какбы логичней тут Ball *Selected = NULL;(да и остальным переменным выделять динамически память) а присваивание делать где нибудь в formcreate, скорей всего когда происходит присваивание, b1 еще не создан и selected == NULL, перед вызовом методов left, right... поставь точку остановки и посмотри на что ссылается selected.

_________________
BFBC2: Nomand
BF3: N0mand


 

Member
Статус: Не в сети
Регистрация: 10.10.2005
Откуда: Н. Новгород
включи, чтоб борланд ексепшены своим дебаггером хватал. он программу и прервет на точке где ошибка. посмотришь, который указатель плохой, дальше по программе уже смотри почему.

_________________
Зовите меня просто 45194


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 4 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan