Dostęp do komponentu w drugiej formie

0

Witam,

Mam dwie formy: w pierwszej jest funkcja, picturebox oraz przycisk, który uruchamia drugą. W drugiej jest trackbar, dzięki któremu chcę zmienić wygląd picturebox.image. Próbowałem zmienić w opcjach VisualStudio picturebox na **public ** lecz po tej zmiania i dziedziczeniu form2 z form 1 form2 przybiera kształt form1. Proszę o wskazówkę jak można uzyskać w inny sposób dostęp to picturebox.

0

Czemu chcesz dziedziczyć te formy? Przekaż jedną w konstruktorze drugiej i zapisz w polu.

A jeśli chodzi o pictureboxa, to najlepiej napisz metodę, która zrobi z nim to, co chcesz, zamiast go udostępniać na zewnątrz.

0

Próbowałem zmienić w opcjach VisualStudio picturebox na public lecz po tej zmiania i dziedziczeniu form2 z form 1 form2

To zły sposób - nie rób tak.
public owszem, ale ustaw go z okna Properties dla danej kontrolki - właściwość modifiers. Następnie w formie utwórz obiekt drugiej formy np:

Form2 frm2 = new Form2()

Będziesz mógł się później odwoływać do kontrolki:

frm2.trackbar.Value

Ogólnie to też nie jest najlepsze podejście, w każdym razie na początek zapoznaj się z podstawami. Jak interesuję Cię jak to powinno być prawidło robione - patrz wzorzec MVP.

0

Próbowałem przez konstruktor tym sposobem: http://forum.pcformat.pl/C-przekazywanie-danych-miedzy-formami-w-2-strony-t lecz niestety do wszystkiego mam dostęp z wyjątkiem picturebox.1. Dodam jeszcze, że forma ulega zmianie po przestawieniu w opcjach picturebox na public ale mam do niego dostęp.
Poniżej wrzucam kod z mojej 1 i 2 formy:
Form1

public partial class Form1 : Form
    {
        Bitmap newBitmap;
        Image file;
        int jasnosc;
        
        public Form1()
        {
            InitializeComponent();
        }
        //otwieranie
        private void otworzToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult dr = openFileDialog1.ShowDialog();

            if (dr == DialogResult.OK)
            {
                file = Image.FromFile(openFileDialog1.FileName);
                pictureBox1.Image = file;
                newBitmap = new Bitmap(openFileDialog1.FileName);
            }  
        }
        //zapisywanie
        private void zapiszToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult dr = saveFileDialog1.ShowDialog();

            if (file != null)
            {
                if (saveFileDialog1.FileName.Substring(saveFileDialog1.FileName.Length - 3).ToLower() == "bmp")
                {
                    file.Save(saveFileDialog1.FileName, ImageFormat.Bmp);
                }

                if (saveFileDialog1.FileName.Substring(saveFileDialog1.FileName.Length - 3).ToLower() == "jpg")
                {
                    file.Save(saveFileDialog1.FileName, ImageFormat.Jpeg);
                }

                if (saveFileDialog1.FileName.Substring(saveFileDialog1.FileName.Length - 3).ToLower() == "png")
                {
                    file.Save(saveFileDialog1.FileName, ImageFormat.Png);
                }
            }


        private void jasnośćToolStripMenuItem_Click(object sender, EventArgs e)
        {
            jasność j2 = new jasność(this);
            j2.Show();
            //jasność jasnosc = new jasność(this);
            //jasnosc.ShowDialog();
        }
        //jasność
        public static Bitmap Jasniej(Bitmap Image, int value)
        {
            Bitmap TempBitmap = Image;
            float wartosc = (float)value / 255.0f;
            Bitmap NewBitmap = new Bitmap(TempBitmap.Width, TempBitmap.Height);
            Graphics NewGraphics = Graphics.FromImage(NewBitmap);
            float[][] FloatColorMatrix = {
                                             new float[] {1, 0, 0, 0, 0},
                                             new float[] {0, 1, 0, 0, 0},
                                             new float[] {0, 0, 1, 0, 0},
                                             new float[] {0, 0, 0, 1, 0},
                                             new float[] {wartosc, wartosc, wartosc, 1, 1}
                                         };
            ColorMatrix NewColorMatrix = new ColorMatrix(FloatColorMatrix);
            ImageAttributes Atrybuty = new ImageAttributes();
            Atrybuty.SetColorMatrix(NewColorMatrix);
            NewGraphics.DrawImage(TempBitmap, new Rectangle(0, 0, TempBitmap.Width, TempBitmap.Height), 0, 0, TempBitmap.Width, TempBitmap.Height, GraphicsUnit.Pixel, Atrybuty);
            Atrybuty.Dispose();
            NewGraphics.Dispose();
            return NewBitmap;
        }
    }

 

jasność(Form2):

public partial class jasność : Form
    {
        private Form1 _forma1;
        public jasność(Form1 forma1)
        {
            InitializeComponent();
            this._forma1 = forma1;
            
          
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            label2.Text = trackBar1.Value.ToString();
            
        }
    } 
2

To może dodaj do Form1 metodę zmieniającą jasność public void UstawJasnosc() i tą metodę wywołuj z Form2.
Ja bym to jednak zrobił na zdarzeniach. Form2 wywołuje zdarzenie przy zmianie wartości, a Form1 je obsługuje i zmienia PictureBox

0
Sarrus napisał(a):

To może dodaj do Form1 metodę zmieniającą jasność public void UstawJasnosc() i tą metodę wywołuj z Form2.
Ja bym to jednak zrobił na zdarzeniach. Form2 wywołuje zdarzenie przy zmianie wartości, a Form1 je obsługuje i zmienia PictureBox

Utworzyłem funkcję, którą wywołuję z form2 lecz to nie działa. Proszę o wskazówkę co do drugiej metody.

0

O zdarzeniach musiałbyś doczytać, nie mam czasu żeby tu wykładać - a to dość spory temat.
Pokaż kod jaki masz, bo tak też powinno pójść. Poza tym precyzuj 'nie działa' bo nie wiemy czy się nie kompiluje, nie reaguje czy program wywala.
Kolejna rzecz to odświeżanie. Form sam z siebie się nie odświeża, chyba że np. przesłonisz okno innym. Możesz za to wymusić przerysowanie formatki np metodą Refresh()

0
Sarrus napisał(a):

O zdarzeniach musiałbyś doczytać, nie mam czasu żeby tu wykładać - a to dość spory temat.
Pokaż kod jaki masz, bo tak też powinno pójść. Poza tym precyzuj 'nie działa' bo nie wiemy czy się nie kompiluje, nie reaguje czy program wywala.
Kolejna rzecz to odświeżanie. Form sam z siebie się nie odświeża, chyba że np. przesłonisz okno innym. Możesz za to wymusić przerysowanie formatki np metodą Refresh()

Witam, a wieć mój kod wygląda następująco:

 
public partial class Form1 : Form
    {
        Bitmap newBitmap;
        
        
        public Form1()
        {
            InitializeComponent();
        }
        

        private void jasnośćToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 form2 = new jasność(this);
            form2.ShowDialog();
            
        }

        //jasność

        public static Bitmap Jasniej(Bitmap Image, int value)
        {
            ....
        }
        
        public void ustawJasnosc(int zmienna)
        {
            pictureBox1.Image = Jasniej(newBitmap, zmienna);
        }
    }

Form2:

public partial class Form2 : Form
    {
        private Form1 form1;
        public jasność(Form1 f1)
        {
            InitializeComponent();
            this.form1 = f1;
            
          
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            label2.Text = trackBar1.Value.ToString();
           
            //1 SPOSÓB - wywołanie funkcji

            int zmienna2 =Convert.ToInt32(label2.Text);
            ustawJasnosc(zmienna2); // ------- nie ma dostępu

            //2 SPOSÓB 

            zmienna2 =Convert.ToInt32(label2.Text);
            (this.Owner as Form1).ustawJasniej(zmienna2);// ------------- program się kompiluje ale po przesunieciu trackbar w form 2 wywala program z komunikatem **NullReferenceExeption was unhandled**

        }

        
    }
 

Przeszukałem mnóstwo tematów lecz nadal nie mogę tego rozgryźć.

1

because you doing it wrong
Jak myślisz co to jest i do czego:

private Form1 form1;

Ano do tego żeby z tego skorzystać :P :

int zmienna2 =Convert.ToInt32(label2.Text);
form1.ustawJasnosc(zmienna2); // ------- już ma dostęp

Przeanalizuj sobie ten kod po zmianach. Gdybyś nadal nie wiedział o co biega to napisz

PS. Nazwy metod wg. konwencji rozpoczynają się z wielkiej litery - w przeciwieństwie do javy
PS2. Pamiętaj o Refresh()

0
Sarrus napisał(a):

because you doing it wrong
Jak myślisz co to jest i do czego:

private Form1 form1;

Ano do tego żeby z tego skorzystać :P :

int zmienna2 =Convert.ToInt32(label2.Text);
form1.ustawJasnosc(zmienna2); // ------- już ma dostęp

Przeanalizuj sobie ten kod po zmianach. Gdybyś nadal nie wiedział o co biega to napisz

PS. Nazwy metod wg. konwencji rozpoczynają się z wielkiej litery - w przeciwieństwie do javy
PS2. Pamiętaj o Refresh()

Dzięki wielkie wszystko gra!

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