Form ShowDialog a Show - pytanie


(Nowypunktwidzenia) #1

Hej,

mam pytanie z zakresu tworzenia nowej formy - na początku mam Form1 i po kliknięciu przycisku chcę wyświetlić Form2 (to jest proste do zrobienia).

Nasuwa mi się jednak wątpliwość co do działania - jeżeli metoda ShowDialog() - powoduje, że kod programu zatrzymuje się na tym wywołaniu i czeka na zamknięcie Form2 o tyle samo Show() przechodzi do końca funkcji.

Zastanawiam się więc jak spowodować aby zadziałał poniższy przykład z wykorzystaniem samego Show() - na ShowDialog działa, ale chciałbym poznać jak to będzie w innym przypadku.

Działanie programu jest proste :

mam dwie formy : Form1 i Form2 na pierwszej jest label i przycisk, po naciśnięciu którego uruchamia Form2.

W Form2 istnieje pole TextEdit (do wpisania jakiegoś tekstu) oraz przycisk, po naciśnięciu którego przekazuję tekst z pola TextEdit do Form1.

I teraz Form1 powinien odczytać, że przycisk został naciśnięty na Form2 i zmienić tekst w labelu na ten z Form1.

A oto kod programu :

Form1 - po naciśnięciu przycisku wyświetlającego Form2:

Gdyby tam było formatka.ShowDialog() - to wszystko byłoby ok :slight_smile: ale chce poznać sposób jak poradzić sobie w innym przypadku mianowicie Show();

private void button1_Click(object sender, EventArgs e)

        {


            Form2 formatka = new Form2();

          [b] formatka.Show(); [/b]

                if (formatka.zwroc_wcisniety())

                {


                    label1.Text = formatka.tekst();

                }

Form2 :

private bool wcisniety = false;


  public bool zwroc_wcisniety(){


            return wcisniety;

        }


   public string tekst() {


            return textBox1.Text;

        }


  public Form2()

        {

            InitializeComponent();

            wcisniety = false;

        }


   private void button1_Click(object sender, EventArgs e)

        {


            wcisniety = true;

        }

I ostatnie pytanie - zastanawiam się jeszcze w jaki sposób mogę przechowywać na stałe wpisaną wartość w form2 tzn. użytkownik coś tam wpisze, zamknie okno i przy ponownym uruchomieniu formy2 (za pomocą przycisku z form1) wpisana poprzednio wartość nadal tam będzie. Jak to zrobić ? Prosiłbym o w miarę czytelny opis ewnt. modyfikację powyższego programu albo jakiś przykład :slight_smile:

Dziękuje za cierpliwość i odpowiedzi :slight_smile:

Pozdrawiam,


(scripter1) #2

O ile się nie mylę to rozwiązaniem będzie zastosowanie globalnych zmiennych.

Przechowywały by one tekst do wyświetlenia i ich zawartość byłaby modyfikowana poprzez funkcje wywoływane w odpowiednich miejscach.

Aby po zmodyfikowaniu zawartości zmiennej wystarczy ponownie ją wczytać tam gdzie ma być wyświetlony ten tekst.


(Tomek Matz) #3

AD 1.

  • Użyj ShowDialog(this) i nie kombinuj :slight_smile:

  • Zamiast formatka.tekst(); użyj publicznej właściwości (C# to nie JAVA), czyli będziesz miał formatka.Tekst;

  • Staraj się nie używać polskiego nazewnictwa; nazwy metod i właściwości pisz wielką literą

AD 2. Użyj http://www.codeproject.com/KB/cs/UserSettings.aspx


([alex]) #4

formatka.Show();- pokazuje formatkę i natychmiast idzie dalej, więc:

formatka.zwroc_wcisniety(); - zwróci to, co pojawiło się w momencie otwarcia (nie po wciśnięciu czegoś przez użytkownika).

Jak napisał matzu w tym przypadku potrzebujesz:

formatka.ShowDialog();

Dla odtworzenia wartości pół można przy zamknięciu formatki zapisać wartości pół do pliku (lub rejestrów jeżeli chodzi o Windows) zaś przy otwarciu wczytać z pliku (rejestrów).

Druga metoda to dodanie do formatki dwóch metod:

setFields(DaneFormatki df);

getFields(DaneFormatki df);

Można też zawsze wywoływać te metody przy otwarciu i zamknięciu formatki.

Obiekt klasy DaneFormatki tworzysz przy starcie programu, lub przy starcie okienka rodzicielskiego o ile formatka wywoływana z jednego miejsca.

Oczywiście da się to połączyć z pierwszą metodą, dołączając odczyt/zapis w konstruktorze/destruktorze klasy DaneFormatki.


(Nowypunktwidzenia) #5

Tylko, że nie mogę tak zrobić ponieważ wywołuję tutaj metodę :

public string tekst()

chyba, że nie do końca się rozumiemy ? Chodziło o zamianę w tym kodzie :

label1.Text = formatka.tekst();

na

label1.Text = formatka.tekst;

jeżeli tak to takie coś nie przejdzie - zgłasza błędy.

Korzystam z Visual Studio 2010 Express i nigdzie nie mogę znaleźć tej opcji Settings Designer....

Czy to rzeczywiście jest w stanie zapamiętać wprowadzony przez użytkownika tekst i zmienne, tak aby po otwarciu okna ponownie one tam były ?

W takim razie chyba najlepszą opcją będzie przechowywanie gdzieś zmiennych pól i wpisywanie je do programu - ale to będzie trochę ciężko, jeżeli program będzie bardzo rozbudowany (ustawiać wszystko we właściwych miejscach).


(Tomek Matz) #6

AD 1. Tak chodziło o taką zamianę. Sęk w tym, że ta zamiana zacznie działać dopiero wtedy, gdy utworzysz publiczną właściwość Tekst w klasie form-y. Poza tym zwracaj uwagę na treść komunikatu błędu, bo na pewno zostało w nim wyjaśnione na czym polega problem :slight_smile:

AD 2. Ja akurat nie korzystam z wersji Express, ale jakoś ciężko mi uwierzyć, że nie ma w niej Settings Designer-a.

Gdyby nie było w stanie, to bym Ci nie kazał z tego korzystać :). Zresztą na stronie, której podałem, jest przykładowy projekt, który pokazuje jak to działa w praktyce. Przeczytaj ten link co podałem, bo dużo jest tam wyjaśnione. Generalnie idea jest taka, że ustawienia, które utworzysz za pomocą tego designer-a, zapisywane są w pliku XML w katalogu aplikacji i katalogu użytkownika. Istotne jest to, że nie musisz ręcznie przeprowadzać żadnych operacji na tym pliku, bo to dzieje się w tle. Materiałów w sieci na temat user settings i application settings jest cała masa i nie ma sensu, żebym się tu rozpisywał.


(Nowypunktwidzenia) #7
AD 1. Tak chodziło o taką zamianę. Sęk w tym, że ta zamiana zacznie działać dopiero wtedy, gdy utworzysz publiczną właściwość Tekst w klasie form-y. Poza tym zwracaj uwagę na treść komunikatu błędu, bo na pewno zostało w nim wyjaśnione na czym polega problem

Zrobiłem tak jak napisałeś tzn. zmieniłem zarówno label oraz edittext na publiczne i nadal występuje błąd.

Cannot convert method group 'tekst' to non-delegate type 'string'. Did you intend to invoke the method?

Trochę nie rozumiem, wydaje mi się że skoro to metoda to powinienem wywoływać ją z nawiasami

label1.Text = formatka.tekst();

Tekst to jest metoda, która wyciąga z form2 (edittext) wpisany przez użytkownika tekst - zwraca go w wyniku.

Odnośnie screena i kolejnej części - faktycznie jest to w programie, szukałem w złym miejscu :slight_smile:

Ale zastanawiam się nad działaniem tego sposobu - on przechowuje treść wszystkich form, które stworzę czy tylko głównej - i kiedy zapisuje to do pliku XML - w momencie zamknięcia całego programu ?

Dzięki także za pomoc w temacie http://forum.dobreprogramy.pl/komponent-form-zmiana-ksztaltu-t464545.html - odnośnie zapamiętywania danych to trochę mnie zaskoczyła jedna sytuacja - jeszcze bez sposobu o którym pisałeś.

Mianowicie stworzyłem sobie 2 formy : form1 i form2.

Form1 posiadał : button (uruchamiajacy form2) oraz label (etykiete).

Form2 posiadał : button (do zapisywania na form1) i edittext (do wpisywania tekstu, który ma być zapisany w labelu form1)

I teraz w przypadku gdy otwiera mi się forma form2 ( po naciśnięciu buttona form1) i wpisuje coś do edittexta a następnie zamknę krzyżykiem form2 i ponownie za pomocą buttona form1 uruchomię poprzednio zamknięty form - to tekst wpisany w komponencie edittext nadal jest ! (ten który wpisałem) - jak to możliwe ? (wydaje mi się że wcześniej go nie miałem...)


(Tomek Matz) #8

AD 1. Nie kazałem Ci ruszać modyfikatorów dostępu kontrolek. Miałeś sobie utworzyć publiczną właściwość (właściwość to nie to samo co metoda). Nie odbierz tego źle co teraz napiszę (bo nie o to mi chodzi) - musisz sobie kupić jakąś książkę do .NET.

AD 2. W pliku XML przechowywane są tylko te ustawienia, które sobie stworzysz przy użyciu Settings Desginer-a. Zapisywanie do pliku XML należy załatwić w zdarzeniu zamykającym formę poprzez wywołanie metody Save. Wszystko jest opisane w linku, który podałem (jest tam też przykładowy projekt - ściągnij go sobie).

AD 3. Mogło to zostać zapamiętane tylko w sytuacji, gdy w form1 trzymasz referencję do form2, bo masz utworzone takie pole klasy. Sęk w tym, że jak zamkniesz program to ta wartość przepadnie (bo jest przechowywana w pamięci operacyjnej), a w sytuacji, gdy użyjesz rozwiązania, o którym przed chwilą mówiłem, to tak się nie stanie, tzn. wartość nie przepadnie (bo jest przechowywana w pliku XML).


(Nowypunktwidzenia) #9

Aha rozumiem - chodziło o get i set ? W budowie to raczej przypomina metodę :slight_smile: Odnośnie książki to faktycznie bym coś kupił do Visual Studio C# (najlepiej z opisami komponentów) - możesz coś polecić ?


(Somekindsoftware) #10

Bo to jest szczególny rodzaj metody tylko ładniej wygląda przy realizacji dostępu do pól.

To nie do mnie pytanie, ale ja mogę polecić takie coś: http://helion.pl/ksiazki/c-i-net-stephe ... cshnet.htm

Rozdziały 6 i 7 opisują kontrolki, rozdział 12 ich wiązanie z danymi. Ale najwięcej i najświeższe informacje o kontrolkach są na MSDN podane w sposób zrozumiały dla ludzi, którzy w miarę język znają.


(Nowypunktwidzenia) #11

somekind tobie również dziękuję za pomoc :slight_smile: odnośnie książki to ciekawa propozycja - a co myślicie o Visual Studio C# 2010 - korzystał ktoś z tej książki ?