Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2014, 16:20   #1
sexbatyr
 
Регистрация: 29.11.2012
Сообщений: 5
Печаль Ошибка при запуске программы в CLR

Код:
#include "stdafx.h"
#using "System.Drawing.dll"
#using "System.Windows.Forms.dll"
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
using namespace System::Threading;


delegate void Del(int x, int y);
 
    ref class Ball
	{
	public:

        int x, y;
        int dx, dy;
        bool life;
        Thread ^t;
		Form ^f;
		Color col;
		
	public:
		event Del ^ev;
		//col = Color::Blue;

		property int X { int get () { return x; } }
		property int Y { int get () { return y; } }

	public:
		Ball(int X, int Y, Form ^F, int Dx, int Dy)
        {
            x = X; y = Y; f = F;
            dx = Dx; dy = Dy;
            life = true;
			t = gcnew Thread(gcnew ThreadStart(this,&Ball::Run));
            t->Start();
        }
	private:
		void Run()
        {
            while (life)
            {
                x += dx;
                y += dy;
                if (x - 10 < 0 || x > f->Width - 60) { dx = -dx; ev(x, y); }
                if (y - 5 < 0 || y > f->Height - 65) { dy = -dy; ev(x, y); }
				Thread::Sleep(100);
                f->Invalidate();
            }
        }
	public:
		void Close() { life = false; }
        void BallHandler(int x, int y)
        {
			if (col == Color::Blue)
				col = Color::Red;
			else col = Color::Blue;
        }
	};

	ref class Ball2
	{
	public:
        int x2, y2;
        int dx2, dy2;
        bool life;
        Thread ^z;
		Form ^s;
        Color col;
	public:
		event Del ^ev;
        property int X2 { int get () { return x2; } }
        property int Y2 { int get () { return y2; } }
        property Color Col { Color get () { return col; } }

	public:
		Ball2(int X2, int Y2, Form ^S, int Dx2, int Dy2)
        {
			col = Color::Blue;
            x2 = X2; y2 = Y2; s = S;
            dx2 = Dx2; dy2 = Dy2;
            life = true;
			z = gcnew Thread(gcnew ThreadStart(this,&Ball2::Run));
            z->Start();
        }
	private:
		void Run()
        {
            while (life)
            {
                x2 += dx2;
                y2 += dy2;
                if (x2 - 5 < 0 || x2 > s->Width - 65) { dx2 = -dx2; ev(x2, y2); }
                if (y2 - 10 < 0 || y2 > s->Height - 60) { dy2 = -dy2; ev(x2, y2); }
				Thread::Sleep(50);
                s->Invalidate();
            }
        }
	public:
		void Close() { life = false; }
        void BallHandler(int x, int y)
        {
			if (col == Color::Blue)
				col = Color::Red;
			else col = Color::Blue;
		}
	};
  ref class First : public Form
    {
	public:
		Ball ^b;

	public:
		First()
        {
            this->Text = "First";
            this->Visible = true;
            this->Size = Drawing::Size(400, 400);
            b = gcnew Ball(10, 20, this, 10, 10);
        }

	protected:
		virtual void OnPaint(PaintEventArgs ^e) override 
        {
			First::OnPaint(e);
			e->Graphics->DrawEllipse(gcnew Pen(gcnew SolidBrush(b->col), 4), b->X, b->Y, 20, 20);
        }
        virtual void OnClosed(EventArgs ^e)override
        {
			First::OnClosed(e);
			b->Close();
        }
	public:
		void Handler(int x, int y)
        {
            Invalidate();
        }
	};
    ref class Second : public Form
    {
	public:
		Ball2 ^b2;
        int x1, y1;
	public: 
		Second()
        {
            this->Text = "Second";
            this->Visible = true;
            this->Size = Drawing::Size(200, 200);
            b2 = gcnew Ball2(10, 20, this, 10, 10);

        }
	protected:
		 virtual void OnPaint(PaintEventArgs ^e)override
        {
			Second::OnPaint(e);
            e->Graphics->DrawEllipse(gcnew Pen(gcnew SolidBrush(b2->col), 4), b2->X2, b2->Y2, 20, 20);
        }
         virtual void OnClosed(EventArgs ^e)override
        {
			Second::OnClosed(e);
            b2->Close();
        }

	public:
		void Hand(int X, int Y)
        {
            x1 = X;
            y1 = Y;
            Invalidate();
        }
        void BallHandler(int Y, int X)
        {
            y1 = Y;
            x1 = X;
		}};
	    void main(void)
            {   
				Ball ^b;
				Ball2 ^b2;
				First ^f = gcnew First();
                Second ^s = gcnew Second();
				f->b->ev += gcnew Del(b2,&Ball2::BallHandler);
				s->b2->ev += gcnew Del(b,&Ball::BallHandler);
				Application::Run();
			 }

Последний раз редактировалось sexbatyr; 03.06.2014 в 16:24.
sexbatyr вне форума Ответить с цитированием
Старый 03.06.2014, 17:04   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Текст ошибки угадывать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2014, 17:13   #3
sexbatyr
 
Регистрация: 29.11.2012
Сообщений: 5
По умолчанию

An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll

Additional information: Делегат метода экземпляра не может иметь нулевым
"this".
sexbatyr вне форума Ответить с цитированием
Старый 03.06.2014, 17:38   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А вопрос не в тему: b и b2 разве создавать не нужно через gcnew ?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2014, 17:52   #5
sexbatyr
 
Регистрация: 29.11.2012
Сообщений: 5
По умолчанию

они же через gcnew создаются в классах first и second)
sexbatyr вне форума Ответить с цитированием
Старый 03.06.2014, 18:15   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Как так??
Или я чего-то не понимаю, или Ball ^b; и Ball2 ^b2; никоим образом не относятся ни к каким классам, и являются локальными для main()
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2014, 18:22   #7
sexbatyr
 
Регистрация: 29.11.2012
Сообщений: 5
По умолчанию

если я уберу Ball ^b; и Ball2 ^b2; в мэйне у меня делегат не распознается) ты хочешь сказать, что мне нужно Ball ^b; и Ball2 ^b2 создать в мэйне,а не в в классах форм?)
sexbatyr вне форума Ответить с цитированием
Старый 03.06.2014, 19:36   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ты хочешь сказать, что мне нужно Ball ^b; и Ball2 ^b2 создать в мэйне,а не в в классах форм?)
Ну да... Я хоть и не спец в Си, но как-то с мировоззрением это не укладывается в любом случае. Впрочем было бы неплохо чтоб местные специ по сям тут отписались.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenMP и CLR ; /openpm /MTd /clr хочу все и сразу )) kic2512 Visual C++ 0 10.02.2013 22:44
c++/clr windowsforms Программа виснет при OpenFileDialog revaldo666 Windows Forms 1 19.07.2012 12:38
Visual C++/CLR string в структуре ошибка hvz- Помощь студентам 3 24.01.2012 21:18
Ошибка при закрытии программы cargo29 Общие вопросы Delphi 10 17.05.2011 23:31
Ошибка при инсталляции программы фЁдОр Помощь студентам 5 24.12.2007 11:27