Błąd podczas zmiany rozmiaru okna

0

Witam
Mam kod który powinien w miarę zmiany rozmiaru okna (podczas działania programu) zmieniać położenie i rozmiar buttona umieszczonego w oknie, ale gdy uruchomię ten program i zmienię rozmiar okna program wyrzuca wyjątek 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 WindowsFormsApplication1
{
    public partial class win : Form
    {
        private Rectangle button;
        private Size formOrginalSize;
        public win()
        {
            InitializeComponent();
        }

        private void win_Load(object sender, EventArgs e)
        {
            formOrginalSize = this.Size;
            System.Console.Write(formOrginalSize.ToString());
            button = new Rectangle(b.Location.X, b.Location.Y, b.Width, b.Height);
          
        }

        private void resize(Rectangle orginal, Control control)
        {
            float xRatio = (float)(this.Width) / (float)(formOrginalSize.Width);
            float yRatio = (float)(this.Height) / (float)(formOrginalSize.Height);

            int newX = (int)(orginal.X * xRatio);
            int newY = (int)(orginal.Y * yRatio);

            int neWidth = (int)(orginal.Width * xRatio);
            int newHeight = (int)(orginal.Height * yRatio);

            control.Location = new Point(newX, newY); //Tu rzuca wyjątek
            control.Size = new Size(neWidth, newHeight);

            
        }

        private void resize_child()
        {
            resize(button, b);
        }

        private void res(object sender, EventArgs e)
        {
          //  resize_child();
            System.Console.Write("zmiana rozmiaru");
        }

        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(187, 162);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            // 
            // win
            // 
            this.ClientSize = new System.Drawing.Size(515, 407);
            this.Controls.Add(this.button1);
            this.Name = "win";
            this.Resize += new System.EventHandler(this.res);
            this.ResumeLayout(false);


           

        }
    }
}

I problem jest taki że nie wiem dlaczego, ani jak zrobić tak żeby działało, ktoś może ma jakieś cenne uwagi

0

A czemu nie posłużysz się po prostu Anchorami?

Poza tym czym jest b? Nie ma tego nigdzie zadeklarowanego. Czym jest button? Też nie widzę deklaracji. Widzę tylko button1.

W ogóle mam wrażenie, że dałeś tylko JAKIŚ fragment kodu. Przecież na pierwszy rzut oka to się nawet nie skompiluje. Daj cały POTRZEBNY kod i najlepiej użyj Anchors.

1

Wydaje mi się że nie utworzyleś zmiennej b typu control, którą przekazujesz do metody resize

0
Biały Ogrodnik napisał(a):

Wydaje mi się że nie utworzyleś zmiennej b typu control, którą przekazujesz do metody resize

Tak tu był problem, ale teraz wraz ze zmianą okna znika button, może na to masz jakąś uwagę

Teraz kod wygląda tak:

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 WindowsFormsApplication1
{
    public partial class win : Form
    {
        private Rectangle button;
        private Size formOrginalSize;
        public win()
        {
            InitializeComponent();
        }

        private void win_Load(object sender, EventArgs e)
        {
            formOrginalSize = this.Size;
            System.Console.Write(formOrginalSize.ToString());
            button = new Rectangle(button1.Location.X, button1.Location.Y, button1.Width, button1.Height);
          
        }

        private void resize(Rectangle orginal, Control control)
        {
            float xRatio = (float)(this.Width) / (float)(formOrginalSize.Width);
            float yRatio = (float)(this.Height) / (float)(formOrginalSize.Height);

            int newX = (int)(orginal.X * xRatio);
            int newY = (int)(orginal.Y * yRatio);

            int neWidth = (int)(orginal.Width * xRatio);
            int newHeight = (int)(orginal.Height * yRatio);

            control.Location = new Point(newX, newY);
            control.Size = new Size(neWidth, newHeight);

            
        }

        private void resize_child()
        {
            resize(button, button1);
        }

        private void res(object sender, EventArgs e)
        {
            resize_child();
            System.Console.Write("zmiana rozmiaru");
        }

        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(187, 162);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            // 
            // win
            // 
            this.ClientSize = new System.Drawing.Size(515, 407);
            this.Controls.Add(this.button1);
            this.Name = "win";
            this.Resize += new System.EventHandler(this.res);
            this.ResumeLayout(false);


           

        }
    }
}

0

A nie możesz sobie zdebugować krok po kroku metody resize ? Musisz patrzeć na wartości jakie tam otrzymujesz. Może pozycja buttona wyszła po za formę. Albo size na 0 się ustawił

0

xRatrio i yRatio wychodzi infinity, dlaczego nieskończoność...?

0

Z kodu nie wynika, że metoda win_Load się wykonuje. Dlatego też formOriginalSize jest niezainicjowany. Serio, zacznij używać debuggera.

0

Dobra, już działa wszystko, i mam wniosek z tego doświadczenia - Nie ufajcie tutorialon na yt, a i jeszcze miło by było jak byście polecili jakieś dobre książki do nauki c# i WindowsForm

0

Rusz głową C#.

1 użytkowników online, w tym zalogowanych: 0, gości: 1