przekazanie wartości między formami i słowo kluczowe static

0

Witam :)

Problem jak w temacie.

-mam główne okno mdi w Form1
-okno w którym użytkownik może pracować Form3
-plik z kodem ( plik sterowanie.cs ), gdzie umieszczam wszystkie funkcje sterujące programem.

Rozwiązanie to spisuje się świetnie tyle tylko że pojawił się pewien problem :) W mdi umieściłem opcję Plik/Zapisz...
funkja ta poprzez odwołanie sterowanie.zapiszProjekt() ma przygotować dane w postaci tabeli do wrzucenia do pliku

funkcja w pliku sterowanie.cs znajduje się w pewnej klasie ( )
deklaracja klasy wygląda tak:

namespace WindowsFormsApplication1
{
public class sterowanie {

.......

       private static List<zapisOdczyt> tablicaZapisu = new List<zapisOdczyt>();

        public static void dodajDoTablicyZapisu(String TNazwa, String TTyp, String TWartosc, Boolean TAktywnosc)
        {
            Boolean zapisano = new Boolean();
            zapisano = false;
            for (int i = 0; i < Convert.ToInt32(tablicaZapisu.Count); i++)
                if (tablicaZapisu[i].Nazwa == TNazwa)
                {
                    tablicaZapisu[i] = new zapisOdczyt(TNazwa, TTyp, TWartosc, TAktywnosc);
                    i = Convert.ToInt32(tablicaZapisu.Count);
                    zapisano = true;
                }
            if (zapisano == false)
                tablicaZapisu.Add(new zapisOdczyt(TNazwa, TTyp, TWartosc, TAktywnosc));
        }
public static List<zapisOdczyt> ZapiszProjekt()
        {
            List<zapisOdczyt> tablica = new List<zapisOdczyt>();
            Form3.wypelnijTabliceZapisu();
            return tablica;
        }
}

gdzie zapisOdczyt to struktura publiczna. i tu tkwi problem. Funkcja Form3.wypelnijTabliceZapisu(); wygląda tak:

        public static void wypelnijTabliceZapisu()
        {

            sterowanie.dodajDoTablicyZapisu("TextBoxBzb", "TextBox", TextBoxBzb.Text, TextBoxBzb.Enabled);

........

        }
......
}
 

i niestety jak się domyślacie występuje problem z poziomem dostępności ( w funkcji static nie mogę uŻyć odwołania TextBoxBzb.Text

Jakiś pomysł jak to obejść??

Pozdrawiam
Piotrek :)

1

Zmień nazwy WindowsFormsApplication1, Form1 i Form3 na jakieś sensowne.
Nazwy klas zaczynaj wielką literą, czyli tak: ZapisOdczyt. Klasy nazywaj sensownie, bo ta nazwa jest zwyczajnie do d**y.
Podobnie z nazwami metod.
Nazwy argumentów funkcji zaczynaj mała literą i nie rozpoczynaj ich od jakiegoś wysranego z Delphi prefiksu T.
Po co w każdym kroku pętli robisz to: Convert.ToInt32(tablicaZapisu.Count)? Raz, że takie rzeczy robi się przed pętlą, a nie w każdym kroku, dwa, że to w ogóle jest niepotrzebne, bo Count jest typu Int32?
Dlaczego metoda ZapiszProjekt niczego nie zapisuje tylko zwraca listę, która nazywa się tablica?

Jak rozumiem, chcesz zapisać stan kontrolek do pliku. W tym celu mógłbyś chyba użyć wbudowanych mechanizmów, a nie bawić się we własne, ale jak wolisz.

Twój problem wynika z tego, że nie rozumiesz programowania obiektowego, nie rozumiesz tego, że Form3 jest klasą i rządzi się takim samymi prawami jak wszystkie inne klasy, a co za tym idzie może mieć miliard instancji, a nie tylko jedną. Dlatego chcesz używać jakichś dziwnych metod statycznych.

Tak czy siak - musisz przestać myśleć w kategoriach programowania proceduralnego i zacząć myśleć po obiektowemu. Program to zestaw obiektów, a nie plików z kodem! Niech metody przyjmują obiekty klas i na nich operują, coś w tym rodzaju:

namespace WindowsFormsApplication1
{
public class Sterowanie 
{
public static List<ZapisOdczyt> ZapiszProjekt(Form3 form3)
        {
            List<ZapisOdczyt> tablica = new List<zapisOdczyt>();
            this.form3.WypelnijTabliceZapisu(this);
            return tablica;
        }
}

Oraz:

class Form3 : Form
{
    public void WypelnijTabliceZapisu(Sterowanie ster)
    {
        ster.DodajDoTablicyZapisu("Cośtam", "Jeszcze coś", this.textBox1.Text, this.textBox1.Enabled);
    }
}

Chociaż takie wzajemne powiązanie jest dziwne, chyba lepiej gdyby jedna klasa miała pole będące referencją do drugiej. Ale nie wiem, bo za mało kodu podałeś.
Generalnie cały Twój projekt jest do przeróbki.

1

Witaj,
zrobiłbym tak jak powyżej w sensie: this.textBox1.Text a jeżeli upierasz się na metodę statyczną to kontrolka textBox1 też powinna być statyczna (zmień i zobacz) :)

0

Nie było również pytania o obowiązujące konwencje, ale widzę odpowiedź się niestety znalazła. Więc i będzie komentarz.
WindowsFormsApplication1 - w małych projektach z jedną przestrzenią nazw jej brzmienie nia ma absolutnie żadnego znaczenia.
Form1 bardziej określa znaczenie danej klasy niż np BardzoFarjnyFormularz.
Jeżeli piszesz dla siebie to nazwy klas i metod mają być przede wszystkim zrozumiałe dla Ciebie a nie dla innych czytelników forum, choćbyś postanowił przed każdą metodę rozpoczynać od słowa "kupa".

A co do samego problemu to uważam że nad używasz metod statycznych, bo jeśli Form3 będzie miał więcej niż jedną instancje to będzie problem. Powinieneś raczej zdefiniować zdarzenie. Nie jest niestety napisane gdzie tworzone są instancje poszczególnych klas ale z kodu wnioskuje że w klasie sterowanie raczej form3 nie ma więc propozycja" "this.form3.WypelnijTabliceZapisu(this);" jest równie trafna jak "Convert.ToInt32(tablicaZapisu.Count);". Jak dla mnie to powinno to wyglądać mniej więcej tak, zakładając że instancje Form3 i sterowanie dostępne są w innej klasie:

 
//tu metoda tworząca instancje
Form3 form3;
sterowanie s;
private void metoda()
{
this.form3 = new Form3();
this.s = new sterowanie();
this.s.jakisevent += new jakisdelegat(this.form3.wypelnijTabliceZapisu);
}


public delegate void jakisdelegat();

public class sterowanie {
 
.......
       public event jakisdelegate jakisevent;
 
       private static List<zapisOdczyt> tablicaZapisu = new List<zapisOdczyt>();
 
        public static void dodajDoTablicyZapisu(String TNazwa, String TTyp, String TWartosc, Boolean TAktywnosc)
        {
            Boolean zapisano = new Boolean();
            zapisano = false;
            for (int i = 0; i < Convert.ToInt32(tablicaZapisu.Count); i++)
                if (tablicaZapisu[i].Nazwa == TNazwa)
                {
                    tablicaZapisu[i] = new zapisOdczyt(TNazwa, TTyp, TWartosc, TAktywnosc);
                    i = Convert.ToInt32(tablicaZapisu.Count);
                    zapisano = true;
                }
            if (zapisano == false)
                tablicaZapisu.Add(new zapisOdczyt(TNazwa, TTyp, TWartosc, TAktywnosc));
        }
public static List<zapisOdczyt> ZapiszProjekt()
        {
            List<zapisOdczyt> tablica = new List<zapisOdczyt>();
            this.jakisevent();
            return tablica;
        }
}
 

class Form3
{
        
        public void wypelnijTabliceZapisu()
        {
 
            sterowanie.dodajDoTablicyZapisu("TextBoxBzb", "TextBox", TextBoxBzb.Text, TextBoxBzb.Enabled);
 
........
 
        }
......
}

1
grangu napisał(a)

Nie było również pytania o obowiązujące konwencje, ale widzę odpowiedź się niestety znalazła. Więc i będzie komentarz.
WindowsFormsApplication1 - w małych projektach z jedną przestrzenią nazw jej brzmienie nia ma absolutnie żadnego znaczenia.
Form1 bardziej określa znaczenie danej klasy niż np BardzoFarjnyFormularz.
Jeżeli piszesz dla siebie to nazwy klas i metod mają być przede wszystkim zrozumiałe dla Ciebie a nie dla innych czytelników forum, choćbyś postanowił przed każdą metodę rozpoczynać od słowa "kupa".

O, pan anarchista, jakże miło. W pracy też robisz burdel w kodzie? Czy może jeszcze się nią nie skalałeś, dlatego takie szkodliwe bezeceństwa wypisujesz?

1
grangu napisał(a)

Jeżeli piszesz dla siebie to nazwy klas i metod mają być przede wszystkim zrozumiałe dla Ciebie
Ciekawe czy będziesz za pół roku pamiętać co oznaczało Label25...
Analogicznie ja przy swoich początkach programowania jeszcze w pascalu miałem deklaracje zmiennych globalnych(!): a,b,c,d,i,j,k,l,m,n,x,y,z. Przecież pisałem w końcu dla siebie. Gdy później przestałem się łapać we własnych programach, to dość szybko zmieniłem przyzwyczajenia i dzisiaj zmienne lokalne nawet nie mają nazw jednoliterkowych (wyjątkiem są zmienne iteracyjne). somekind ma rację. Zmień jak najszybciej takie nawyki, a zobaczysz, że świat stanie się piękniejszy :)

0

Nie mówię że ja zostawiam domyślne nazwy bo oczywiście tak nie jest, no może z wyjątkiem From1, bo co to za projekt bez Form1, mi ta domyślna nazwa mówi więcej niż cokolwiek innego więc zawsze zostaje i nikomu nie dam się przekonać że mam ją zmienić czy to w projektach własnych czy też zespołowych. Pozostałe nazwy zazwyczaj zmieniam na bardziej przyjazne, oczywiście pewnie jak prawie każdy wyrobiłem ten nawyk na własnych błędach. Ale nie uważam żeby ktokolwiek miał prawo mieszać się do konwencji stosowanych prze zemnie w moich własnych zamkniętych projektach. Oczywiście jeśli pracuje się w grupie lub ma się świadomość że ktoś inny będzie korzystał z efektów naszej pracy pewne standardy są wymogiem. Ale nie zawsze dokładnie takie jak ktoś tutaj przedstawił.

A co do statycznych kontrolek których ludzie, którzy "się dobrze czują" nie używają to muszę powiedzieć że kiedyś z takowej skorzystałem, nie dlatego żeby mieć do niej dostęp ale dlatego żeby we wszystkich instancjach mieć textboxa, który wyświetla tą samą informacje. Mechanizm ten nie został wprowadzony jako zakazane jabłko i może być bardzo użyteczny jeśli ktoś potrafi z niego korzystać.

0
grangu napisał(a)

A co do statycznych kontrolek których ludzie, którzy "się dobrze czują" nie używają to muszę powiedzieć że kiedyś z takowej skorzystałem, nie dlatego żeby mieć do niej dostęp ale dlatego żeby we wszystkich instancjach mieć textboxa, który wyświetla tą samą informacje.

Widzisz analogię między tym co opisujesz, a problemem autora wątku?

Mechanizm ten nie został wprowadzony jako zakazane jabłko i może być bardzo użyteczny jeśli ktoś potrafi z niego korzystać.

Brawo.

0
somekind napisał(a)

Zmień nazwy WindowsFormsApplication1, Form1 i Form3 na jakieś sensowne.
Nazwy klas zaczynaj wielką literą, czyli tak: ZapisOdczyt. Klasy nazywaj sensownie, bo ta nazwa jest zwyczajnie do d**y.
Podobnie z nazwami metod.
Nazwy argumentów funkcji zaczynaj mała literą i nie rozpoczynaj ich od jakiegoś wysranego z Delphi prefiksu T.
Po co w każdym kroku pętli robisz to: Convert.ToInt32(tablicaZapisu.Count)? Raz, że takie rzeczy robi się przed pętlą, a nie w każdym kroku, dwa, że to w ogóle jest niepotrzebne, bo Count jest typu Int32?
Dlaczego metoda ZapiszProjekt niczego nie zapisuje tylko zwraca listę, która nazywa się tablica?

Jak rozumiem, chcesz zapisać stan kontrolek do pliku. W tym celu mógłbyś chyba użyć wbudowanych mechanizmów, a nie bawić się we własne, ale jak wolisz.

Twój problem wynika z tego, że nie rozumiesz programowania obiektowego, nie rozumiesz tego, że Form3 jest klasą i rządzi się takim samymi prawami jak wszystkie inne klasy, a co za tym idzie może mieć miliard instancji, a nie tylko jedną. Dlatego chcesz używać jakichś dziwnych metod statycznych.

Tak czy siak - musisz przestać myśleć w kategoriach programowania proceduralnego i zacząć myśleć po obiektowemu. Program to zestaw obiektów, a nie plików z kodem! Niech metody przyjmują obiekty klas i na nich operują, coś w tym rodzaju:

}

> Chociaż takie wzajemne powiązanie jest dziwne, chyba lepiej gdyby jedna klasa miała pole będące referencją do drugiej. Ale nie wiem, bo za mało kodu podałeś.
> Generalnie cały Twój projekt jest do przeróbki.

Zdaje sobie sprawę, że moje pomysły nie powalają lotnością oraz ich amatorskość przeraża ( i niektórych napawa niesmakiem :) ). Już w chwili obecnej widzę baardzo dużo błędów leżących u podstaw tworzenia mojej aplikacji szczególnie, że się rozrasta.. I tak dużo rzeczy już przebudowałem. Ten projekt pewnie zostanie jak jest, jak zaczne tworzyć następne postaram się lepiej je zaplanować. Niestety, jest to pierwsza tak duża aplikacja jaką tworzyłem dlatego uczę się teraz na własnych błędach. co do nie zwracania niczego przez funkcję 'ZapiszProjekt'... narazie stworzyłem tylko wywołanie, docelowo będzie tam oczywiście cała obsługa która przechwyci tablicę i zrobi z nią co należy :) 

**grangu** również ma trochę racji. Nazwy różnych kontrolek muszą mi coś mówić a nie innym programistom z tego forum ( szczególnie że jestem zwykłym amatorem ). Ale postaram się wiecej uwagi przykładać do tego nazwnictwa.

Bardzo dziękuję za pomoc. Postaram się jakoś sensownie wybrnąć na podstawie tego co piszecie z sytuacji. :)

Pozdrawiam
Piotrek

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