Form ShowDialog a Show - pytanie

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,

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.

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

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.

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

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

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…)

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

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ć ?

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

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 ?