Odwołąnie się do obiektu innej klasy *.cs

0

Cześć wszystkim mam takie problem nie rozumiem tego za bardzo jak odwołać się do innej klasy i wykonać instrukcje w niej zawarte? bo coś mi to nie działa ;(

Mam

Format.cs

public class Format
    {

        public void Format1()
        {
            Form1 form1 = new Form1();

            form1.btnConnect.BackColor = Color.LightBlue;
            form1.btnConnect.Enabled = true;
            form1.btnConnect.Text = "Połącz ponownie";

        }

    }

Form1.cs:

Format format = new Format();
format.Format1();

W Form1.Designer.cs mam ustawiony:

public System.Windows.Forms.Button btnConnect;

Chciałbym wykonać tą instrukcję z klasy Format wywołując ją w Form1. Z góry dziękuje za pomoc.

3

wydaje sie ze opisujesz problem XY

Zamiast co chcesz wywolac, powiedz mi (z punktu biznesowego) co chcesz osiagnac

class Foo {public string text {get;set;} = "test";  }
class Bar{
  private Foo foo {;get ;set;} = new Foo();
}

tutaj w klasie Bar masz dostep do obiektu Foo. Jak stworzyc obiekt Bar

var bar = new Bar();

to mozesz teraz odwolac sie do Foo

bar.Foo.text;

ale watpie by to rozwiazalo Twoj problem z ktorym sie teraz wzmagasz, dlatego po prosze napisac co chcesz osiagnac z biznesowego punktu widzenia (nietechniczengo, w sensie klasy i ich zaleznosci nie maja opisywac sie w opisie, po prostu jaka checsz funkcjonalnosc zrobic)

1
fasadin napisał(a):

wydaje sie ze opisujesz problem XY

a patrzenie przez plik mi *.cs to gwarantuje.

@PYJTER już samo nazywanie klas i metod Form1 i Format1 wskazuje, ze nie projektujesz tego, tylko niesie Cię fala przypadkowych (nawet nie) decyzji.
Dopóki nie zejdziesz do pytania zadanego samemu sobie, czym NAPRAWDĘ są w/w byty, to jeszcze nie zacząłeś.

Klasa to nie "pojemnik na wszystko co udało się wymyślić", tylko ma wyrazisty zakres odpowiedzialności, czyli naturalnie się pojawia DOBRA nazwa.
Czy naprawdę jest klasa? Jabłkiem? Gruszką? Truskawką? Koszykiem na owoce? Mikserem do truskawek?
Czym klasa JEST (to szerszy wariant pytania co klasa ROBI), która klasa od której ZALEŻY i w jaki spoób?
Jestem niemal pewien że problem by się sam rozwiązał, gdybyś zaczął takie rzeczy określać.

1

Od razu powiem że nie jestem profesjonalnym DEV nie kończyłem żadnej szkoły a jedynie trochę tego co sam się nauczyłem z youtube i książek ;) Proste programy pisze tylko dla siebie bo mają ułatwić mi życie i tyle resztę jak mam pomysł zawsze i ma ujrzeć światło dzienne zlecam. Fakt nazwy, które zastosowałem to skrajny nieprofesjonalizm. Ale koniec tłumaczenia mój błąd. A to jest moja bolączka nazywanie odpowiednio wszystkiego. Ale staram się z tym walczyć ;)
Wracając do tematu źle postawiłem to pytanie i napiszę o co mi chodziło tak naprawdę...
Mam instrukcję if else (wiem mogę zastosować case) i takich warunków mam 12... i teraz w części try{} pojawia się ten sam zestaw 6 instrukcji w w pozostałych 6 inny. I żeby nie powielać wszędzie tego samego tylko mieć to w jednym miejscu chciałem to umieścić w osobnej klasie. Kod działa bardzo dobrze tylko chciałem go poprawić by był bardziej przejrzysty xDD

            if (cmbData.SelectedIndex == 0 && (adresMAc.Length == 4) && OnlyHexInString(adresMAc))
                    {
                        //sprawdzenie czy jest zaznaczony Limit Power
                        if(cbxPowerLimit.Checked == true)
                        {
                            text = wireless.WiFi_with_limit(adresMAc, adresmac_short);
                        }
                        else
                        {
                            text = wireless.WiFi_no_limit(adresMAc, adresmac_short);
                        }
                    }

                    try
                        {

                            MemoryStream mStrm2 = new MemoryStream(Encoding.UTF8.GetBytes(networkConfig.network_WiFi()));
                            scpClient.Upload(mStrm2, path + filname);

                            txtLog.Text = "Poprawnie wysłano konfigurację";
                            btnConnect.BackColor = Color.LightBlue;
                            btnConnect.Enabled = true;
                            btnConnect.Text = "Połącz ponownie";
                            scpClient.Disconnect();
                            label1.Enabled = false;
                            label2.Enabled = false;
                            txtMAC.Enabled = false;
                            cmbData.Enabled = false;
                            btnSend.Enabled = false;

                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                            txtLog.Text = ex.ToString();
                        }

            else if (....

I pytanie powinno brzmieć czy dobrze kombinuję czy źle ?? I jak powinno się robić jeśli część instrukcji nam się powtarza w kodzie....

Jeszcze raz przepraszam za mój poprzedni post ;)

1

nie musisz przepraszac za swoj poprzedni post :D wszystko wporzadku, po to jest forum by sie uczyc (a Ci co wiedza udzielali porad) takze wyluzuj :)

Mam instrukcję if else (wiem mogę zastosować case) i takich warunków mam 12... i teraz w części try{} pojawia się ten sam zestaw 6 instrukcji w w pozostałych 6 inny. I żeby nie powielać wszędzie tego samego tylko mieć to w jednym miejscu chciałem to umieścić w osobnej klasie

ok, to teraz juz bardziej wiadome co trzeba zrobic.

mozesz wkleic wszystkie te 12 ifow? Wtedy pokaze Ci co mozna pogrupowac i jak to wydzielic do osobnej klasy / funkcji

0

One niczym się nie różnią poza tym że w każdej jest cmbData.SelectedIndex == 0, cmbData.SelectedIndex == 1, cmbData.SelectedIndex == 2, cmbData.SelectedIndex == 3 itd... i dla nich jest konfiguracja: wireless.WiFi_with_limit, wireless.WiFi_with_limit1 ,wireless.WiFi_with_limit2 ,wireless.WiFi_with_limit3, wireless.WiFi_with_limit4 lub no limit kolejne numery. A od 6 konfiguracji czyli 05 dochodzi dodatkowa instrukcja w try{}

                if (cmbData.SelectedIndex == 0 && (adresMAc.Length == 4) && OnlyHexInString(adresMAc))
                    {
                        //sprawdzenie czy jest zaznaczony Limit Power
                        if(cbxPowerLimit.Checked == true)
                        {
                            text = wireless.WiFi_with_limit(adresMAc, adresmac_short);
                        }
                        else
                        {
                            text = wireless.WiFi_no_limit(adresMAc, adresmac_short);
                        }

                        try
                        {

                            MemoryStream mStrm = new MemoryStream(Encoding.UTF8.GetBytes(text));
                            scpClient.Upload(mStrm, path + filname2);

                            txtLog.Text = "Poprawnie wysłano konfigurację";
                            btnConnect.BackColor = Color.LightBlue;
                            btnConnect.Enabled = true;
                            btnConnect.Text = "Połącz ponownie";
                            scpClient.Disconnect();
                            label1.Enabled = false;
                            label2.Enabled = false;
                            txtMAC.Enabled = false;
                            cmbData.Enabled = false;
                            btnSend.Enabled = false;

                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                            txtLog.Text = ex.ToString();
                        }
                    }

                else if (cmbData.SelectedIndex == 1 && (adresMAc.Length == 4) && OnlyHexInString(adresMAc))
                    {
                        //sprawdzenie czy jest zaznaczony Limit Power
                        if(cbxPowerLimit.Checked == true)
                        {
                            text = wireless.WiFi_with_limit_01(adresMAc, adresmac_short);
                        }
                        else
                        {
                            text = wireless.WiFi_no_limit_01(adresMAc, adresmac_short);
                        }

                        try
                        {

                            MemoryStream mStrm = new MemoryStream(Encoding.UTF8.GetBytes(text));
                            scpClient.Upload(mStrm, path + filname2);

                            txtLog.Text = "Poprawnie wysłano konfigurację";
                            btnConnect.BackColor = Color.LightBlue;
                            btnConnect.Enabled = true;
                            btnConnect.Text = "Połącz ponownie";
                            scpClient.Disconnect();
                            label1.Enabled = false;
                            label2.Enabled = false;
                            txtMAC.Enabled = false;
                            cmbData.Enabled = false;
                            btnSend.Enabled = false;

                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                            txtLog.Text = ex.ToString();
                        }
                    }

                    else if (cmbData.SelectedIndex == 2 && (adresMAc.Length == 4) && OnlyHexInString(adresMAc))
                    {
                        //sprawdzenie czy jest zaznaczony Limit Power
                        if(cbxPowerLimit.Checked == true)
                        {
                            text = wireless.WiFi_with_limit_02(adresMAc, adresmac_short);
                        }
                        else
                        {
                            text = wireless.WiFi_no_limit_02(adresMAc, adresmac_short);
                        }

                        try
                        {

                            MemoryStream mStrm = new MemoryStream(Encoding.UTF8.GetBytes(text));
                            scpClient.Upload(mStrm, path + filname2);

                            txtLog.Text = "Poprawnie wysłano konfigurację";
                            btnConnect.BackColor = Color.LightBlue;
                            btnConnect.Enabled = true;
                            btnConnect.Text = "Połącz ponownie";
                            scpClient.Disconnect();
                            label1.Enabled = false;
                            label2.Enabled = false;
                            txtMAC.Enabled = false;
                            cmbData.Enabled = false;
                            btnSend.Enabled = false;

                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                            txtLog.Text = ex.ToString();
                        }
                    }

                ....

                    else if (cmbData.SelectedIndex == 5 && (adresMAc.Length == 4) && OnlyHexInString(adresMAc))
                    {
                        //sprawdzenie czy jest zaznaczony Limit Power
                        if(cbxPowerLimit.Checked == true)
                        {
                            text = wireless.WiFi_with_limit_05(adresMAc, adresmac_short);
                        }
                        else
                        {
                            text = wireless.WiFi_no_limit_05(adresMAc, adresmac_short);
                        }

                        try
                        {
//dodatkowa instrukcja
                            MemoryStream mStrm2 = new MemoryStream(Encoding.UTF8.GetBytes(networkConfig.network_WiFi()));
                            scpClient.Upload(mStrm2, path + filname);

                            MemoryStream mStrm = new MemoryStream(Encoding.UTF8.GetBytes(text));
                            scpClient.Upload(mStrm, path + filname2);

                            txtLog.Text = "Poprawnie wysłano konfigurację";
                            btnConnect.BackColor = Color.LightBlue;
                            btnConnect.Enabled = true;
                            btnConnect.Text = "Połącz ponownie";
                            scpClient.Disconnect();
                            label1.Enabled = false;
                            label2.Enabled = false;
                            txtMAC.Enabled = false;
                            cmbData.Enabled = false;
                            btnSend.Enabled = false;

                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                            txtLog.Text = ex.ToString();
                        }
                    }
                ....
3
class Foo {
    public Foo(int requiredIndex) {
        RequireSelectedIndex = requiredIndex;
    }
    public int RequireSelectedIndex {get; init;} // cmbData.SelectedIndex == 0 to property jest tutaj Twoim 0

    public bool IsCorrect(int selectedIndex, ??? adresMAc) 
    {
        return SelectedIndex == RequireSelectedIndex && (adresMAc.Length == 4) && OnlyHexInString(adresMAc);
    }

    public bool OnlyHexInString(??? adresMAc) 
    {
        //przenies tutaj OnlyHexInString
    }
}

wiec ta klasa zalatwi Ci powtarzalnosc ifow. Wystarczy teraz ze wywolasz

var Foo = new Foo(0);
if(foo.IsCorrect(cmbData.SelectedIndex, adresMAc))
{

}

to byla ta część prostsza. Teraz to trudniejsze. W zaleznosci od ifa przypisujesz do textu wireless.WiFi_with_limit0X, to sie srednio da zautomatyzowac w stanie jakim kod teraz wyglada. Podam Ci dwie wersje, jedna ktora sam bym wybral, druga to taki quick fix

przepisalbym tworzenie WiFi_with_limit_0X i powiazalbym (np dzieki Dictionary) z kontrolka w ktorej ma byc uzywane. Nie podam przykladu, bo tak jak pisze, przepisalbym to :)

quick fix

class Bar {
    public string WifiWithLimit {get; init;}
    public string WifiWithoutLimit {get;init;}

    private ?? _scpClient = new ();

    public Bar(string wifiWithLimit, string wifiWithoutLimit) {
        WifiWithLimit = wifiWithLimit;
        WifiWithoutLimit = wifiWithoutLimit;
    }

    public string GimmeText(bool isLimited) {
        return isLimited ? WifiWithLimit : WifiWithoutLimit
    }

    public bool Connect(??? networkConfig) { // networkConfig.network_WiFi()
        try 
        {
            var networkConfigStream = new MemoryStream(Encoding.UTF8.GetBytes(networkConfig));
            scpClient.Upload(networkConfigStream, path + filname);

            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
}

robisz dalej cos na zasadzie

if(bar.Connect) {
    txtLog.Text = "Poprawnie wysłano konfigurację";
            btnConnect.BackColor = Color.LightBlue;
            btnConnect.Enabled = true;
            btnConnect.Text = "Połącz ponownie";
            bar.Disconnect(); // zostawiam CI do zaimplementowania ;)
            label1.Enabled = false;
            label2.Enabled = false;
            txtMAC.Enabled = false;
            cmbData.Enabled = false;
            btnSend.Enabled = false;
}

i ten fragment moze byc funkcja w Twojej obecnej klasie (np SetupUIBasedOnConnection)

1
PYJTER napisał(a):

Od razu powiem że nie jestem profesjonalnym DEV nie kończyłem żadnej szkoły a jedynie trochę tego co sam się nauczyłem z youtube i książek ;) Proste programy pisze tylko dla siebie bo mają ułatwić mi życie i tyle resztę jak mam pomysł zawsze i ma ujrzeć światło dzienne zlecam. Fakt nazwy, które zastosowałem to skrajny nieprofesjonalizm. Ale koniec tłumaczenia mój błąd. A to jest moja bolączka nazywanie odpowiednio wszystkiego. Ale staram się z tym walczyć ;)

Podejście o jakim pisałem, z "projektowaniem" nie jest niedostępne dla początkujących. Zgadzamy się, ze dobre nazwy to ważne, nazwa ma pozytywnie kierować myślenie.
A zła nazwa ma uwierać jak kamyk w bucie (Jabłko gdy w rzeczywistości jest to Koszyk jabłek)- nazwa nic nie znacząca jest unikiem od tego "przeczuwam, że będzie mnie uwierało".
Moze jest tak, że praktycy wkładają ekspresję w wyrażenie sekwencji algorytmu, ale trzeba zdjąć ręce z klawiatury, łyknąć kawy i pomyśleć "czym to jest"

Może druga zasada, bezpiecznik w głowie na za długie metody. Nie zmuszam do proponowanego przez "super profi" 5-10 linii, ale przy 50 liniach powinna migać pomarańczowa, a przy 100 świecić czerwona.

Jeszcze raz przepraszam za mój poprzedni post ;)

Nie masz za co przepraszać, od tego jest forum.

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