Odwoływanie się do komponentu z klasy.

0

Witam.

Problem jest banalny ale to moje początki z C# (jakoś przesiadka z Delphi mi nie idzie....)

Próbuje zrobić banalny kod zmieniający zawartość label, ale przez funkcję zawartą w klasie publicznej (tak aby można było z niej korzystać z innych form).

Mam coś takiego:

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 class MyClass
    {
        public void Zmien_label(string tekst)
        {
            MessageBox.Show(tekst);
            
        }
    }

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

        private void button1_Click(object sender, EventArgs e)
        {
            MyClass TEST = new MyClass();
            TEST.Zmien_label("NOWY TEXT");
        }
    }
}
 

Po kliknięciu przycisku MessageBox się pokazuję lecz nie mam pomysłu jak odnieść się do label1 który znajduje się na tej formie...

0

Musisz do klasy przekazać referencję na Formę (na obiekt jej klasy)

0

Zrób to dokładnie w ten sam sposób w jaki zrobiłbyś to w Delphi z którego nie idzie ci przesiadka.

0

Kombinuje ale nie wiem jak to zrobić....

próbowałem stworzyć konstruktor klasy

   public MyClass(Form GlForma)
    {
        
    } 

Jednak nie zdało to rezultatu bo i tak zapis w stylu GlForma.label1 jest nie prawidlowy...

W Delphi wklepał bym zwyczajnie Form1.label1 := tekst tutaj Form1.label1 "nie istnieje" chyba....

0

Ponieważ label1 jest znany w Form1 ale nie jest znany w Form.

0

A Form nie jest typem ?
A przy tworzeniu
MyClass TEST = new MyClass(); powinniśmy wskazać na konkretną formę (choć tu też form1 "nie działa")....

0

Form jest typem ale nie zawierającym label1.

MyClass TEST = new MyClass(this);
0
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MyClass TEST = new MyClass(this);
            TEST.Zmien_label("NOWY TEXT");
        }
    }

    public class MyClass
    {
        public MyClass(Form1 FORMA)
        {
                    
        }

        public void Zmien_label(string tekst)
        {
            MessageBox.Show(tekst);           
        }
    }
} 

Mimo tego że label1 jest na formie to nie ma czegoś takiego jak FORMA.label1.

0

W Zmien_label nie istnieje FORMA.
Zaś w konstruktorze istnieje i FORMA i FORMA.label1 też.

0

Po zmianie Modifiers w label1 na Public rzeczywiście w konstruktorze udało się do niego odwołać.

Coś takiego zadziałało:

 namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MyClass TEST = new MyClass(this);
            TEST.Zmien_label("NOWY TEXT");
        }
    }

    public class MyClass
    {
        public Form1 GlForma = null; 
        public MyClass(Form1 FORMA)
        {
            GlForma = FORMA;       
        }

        public void Zmien_label(string tekst)
        {
            GlForma.label1.Text = tekst;
        }
    }
}

Teraz pozostała kwestia korzystania z Zmien_label z poziomu innych form.
Da się w C# wykorzystać zmienną TEST (utworzoną w form1) na innych formatkach ?

0

Tak jeżeli ten obiekt przekażesz do tych innych formatek. One nie powstają w próżni więc możesz to zrobić tworząc je na przykład (podając na parametrze konstruktora)

0

Nie do końca rozumiem....
Pierwsza rzecz:
W Delphi w oddzielnym pliku mogłem trzymać jakieś tam klasy i wystarczyło dodać ten plik do uses aby z tych klas korzystać - jak w c# skorzystać z klasy zapisanej w oddzielnym module?

Dwa :
W Delphi mając np unit1 i unit2, wystarczyło że w unit2 w implementation uses dodałem unit i mogłem odwoływać się bezpośrednio do komponentów z tej formy.
Rozumiem, że w c# tak się nie da?
Trzeba przekazać referencję do form1 przy otwieraniu form2 tak ?

Ok... chyba zaczynam powolutku rozumieć jak to robić w c# ....
Dziękuję za pomoc póki co :)

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