fapchat
@fapchat

Как решить ошибку System.NullReferenceException?

Вот код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
   
    public partial class Form1 : Form
    {
        // Битовая картинка pictureBox
        Bitmap pictureBoxBitMap;
        // Битовая картинка динамического изображения
        Bitmap spriteBitMap;
        // Битовая картинка для временного хранения области экрана
        Bitmap cloneBitMap;
        // Графический контекст picturebox
        Graphics g_pictureBox;
        // Графический контекст спрайта
        Graphics g_sprite;
        int x, y; // Координаты автобуса
        int width = 451, height = 209; // Ширина и высота автобуса
        Timer timer;
        public Form1()
        {
            InitializeComponent();
        }

        void DrawSprite()
        {
            // Рисуем колеса
            g_sprite.DrawEllipse(new Pen(Color.Black, 2), 70, 150, 60, 60);
            g_sprite.FillEllipse(new SolidBrush(Color.Black), 70, 150, 60, 60);
            g_sprite.DrawEllipse(new Pen(Color.Black, 2), 350, 150, 60, 60);
            g_sprite.FillEllipse(new SolidBrush(Color.Black), 350, 150, 60, 60);
            // Рисуем корпус автобуса
            Point[] points = new Point[6] { new Point(1,1), new Point(430,1),
                new Point(450, 90), new Point(450, 180),
                new Point(1, 180), new Point(1, 1)
            };
            g_sprite.FillPolygon(Brushes.Yellow, points);
            g_sprite.DrawPolygon(new Pen(Color.Black, 2), points);
            // Рисуем четыре пассажирских окна
            for (int i = 0; i < 4; i++)
            {
                g_sprite.FillRectangle(Brushes.LightGray, 10 + i * 60 + i * 10, 10, 60, 80);
                g_sprite.DrawRectangle(new Pen(Color.Black, 2), 10 + i * 60 + i * 10, 10, 60, 80);
            }

            // Рисуем контур двери
            g_sprite.DrawRectangle(new Pen(Color.Black, 2), 290, 10, 60, 160);
            // Рисуем окно двери и контур окна
            g_sprite.FillRectangle(Brushes.LightGray, 295, 15, 50, 90);
            g_sprite.DrawRectangle(new Pen(Color.Black, 2), 295, 15, 50, 90);
            // Рисуем окно кабины и его контур
            Point[] point = new Point[5]{ new Point(360,10), new Point(420,10),
                new Point(438,90), new Point(360,90), new Point(360,10)
            };
            g_sprite.FillPolygon(Brushes.LightGray, point);
            g_sprite.DrawPolygon(new Pen(Color.Black, 2), point);
        }
        // Функция сохранения части изображения шириной
        void SavePart(int xt, int yt)
        {
            Rectangle cloneRect = new Rectangle(xt, yt, width, height);
            System.Drawing.Imaging.PixelFormat format =

            pictureBoxBitMap.PixelFormat;
            // Клонируем изображение, заданное прямоугольной областью
            cloneBitMap = pictureBoxBitMap.Clone(cloneRect, format);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer.Enabled = true;

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Создаём Bitmap для pictureBox1 и графический контекст
            pictureBox1.Image = Image.FromFile(@"fon.jpg");
            pictureBoxBitMap = new Bitmap(pictureBox1.Image);
            g_pictureBox = Graphics.FromImage(pictureBox1.Image);
            // Создаём Bitmap для спрайта и графический контекст
            spriteBitMap = new Bitmap(width, height);
            g_sprite = Graphics.FromImage(spriteBitMap);
            // Рисуем линию движения автобуса
            g_pictureBox.DrawLine(new Pen(Color.Black, 2), 0, 410,
            pictureBox1.Width - 1, 410);
            // Рисуем автобус на графическом контексте g_sprite
            DrawSprite();
            // Создаём Bitmap для временного хранения части изображения
            cloneBitMap = new Bitmap(width, height);
            // Задаем начальные координаты вывода движущегося объекта
            x = 0; y = 200;
            // Сохраняем область экрана перед первым выводом объекта
            SavePart(x, y);
            // Выводим автобус на графический контекст g_pictureBox
            g_pictureBox.DrawImage(spriteBitMap, x, y);
            // Перерисовываем pictureBox1
            pictureBox1.Invalidate();
            // Создаём таймер с интервалом 100 миллисекунд
            timer = new Timer();
            timer.Interval = 100;
            timer.Tick += new EventHandler(timer1_Tick);
        }

        // Обрабатываем событие от таймера
        private void timer1_Tick(object sender, EventArgs e)
        {
            // Восстанавливаем затёртую область статического изображения
            g_pictureBox.DrawImage(cloneBitMap, x, y);
            // Изменяем координаты для следующего вывода автобуса
            x += 6;
            // Проверяем на выход изображения автобуса за правую границу
            if (x > pictureBox1.Width - 1) x = pictureBox1.Location.X;
            // Сохраняем область экрана перед первым выводом автобуса
            SavePart(x, y);
            // Выводим автобус
            g_pictureBox.DrawImage(spriteBitMap, x, y);
            // Перерисовываем pictureBox1
            pictureBox1.Invalidate();
        }
        // Включаем таймер по нажатию на кнопку

    }
}


Так, тут у меня на строке 80, гдеtimer.Enabled = true; вылетает ошибочка
System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."

timer было null.

Как же её решить? Пытался что-то делать, менять этот код, таймер вручную в конструкторе формы использовать, но ничего не помогло. 61c30e8b0052b736625340.jpeg
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы