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

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:

Kopiuj
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:

Kopiuj
        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 :)

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Wrocław
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:

Kopiuj
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:

Kopiuj
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.

B3
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 10 lat
  • Postów:21
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) :)

Zobacz pozostały 1 komentarz
somekind
Czy Ty się dobrze czujesz?
B3
Uzasadnij dlaczego mam się źle czuć? To, że jest możliwość zrobienia czegoś takiego, nie znaczy że jest to dobrą praktyką. Napisałem tak bo autor napalił się na statyczną metodę. Więc, zawsze jest to jakieś rozwiązanie. Co nie oznacza, że muszę się zaraz źle czuć. Dodam, że moje samopoczucie jest całkiem dobre.
somekind
To czemu proponujesz coś, co nie jest dobrą praktyką?
B3
Bo w pytaniu nie ma "co jest dobrą praktyką"
somekind
To chyba logiczne, że autorowi pytania chodzi o rozwiązanie dobre, a nie złe.
GR
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 8 lat
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:

Kopiuj
 
//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);
 
........
 
        }
......
}

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Wrocław
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?

UB
przy okazji pytanie - ja również jak somekind staram sie nazywać obiekty, klasy i metody wg. podręcznika. no i takie pytanie, do jakiej długości powinny być nazwy zmiennych/obiektów? bo ja czasem daje takie żebym wiedział o co chodzi i wiedział co to za typ obiektu jeśli chodzi o kontrolki np. questionsAmountExamNUD (czyli kontrolka Numeric Up Down) czy to przesada? do ilu znaków wy robicie?
somekind
Gdyby nazwa klasy zajmowała całą szerokość ekranu, to bym się zaczął zastanawiać. Nie oszczędzam na znakach. Ale takie pytanie lepiej zadaj w nowym wątku gdzieś indziej, to więcej osób będzie miało szanse się wypowiedzieć.
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:3 dni
  • Postów:2512
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 :)

GR
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 8 lat
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ć.

siararadek
bo co to za projekt bez Form1 - made my day.
somekind
Ja od dzisiaj do każdej dllki dodaję Form1.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Wrocław
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:

}

Kopiuj
> 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
siararadek
Nazwy są nieważne, gdy nie pokażesz go nikomu innemu, a Ty je rozumiesz. W innym przypadku (czyli w 99% przypadków) są ważne.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)