Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Zdziwiony

[C#/WPF] Problem z oczekiwaniem na 2 okno/klasę

Rekomendowane odpowiedzi

Witam. Robię sobie prosty kaklulator okienkowy i napotkałem na problem:

 

Oto fragment kodu z klasy MainWindow

 private void potega()
       {
           Jakapotega okienkowykladnika = new Jakapotega();
           Class1 klasa = new Class1();

           try
           {
               //pobierz liczbę z TextBlocka
               liczba1 = Convert.ToInt32(Blok1liczby.Text);
               //wyświelt okienko z TextBoxem w którym wczytuje wartośc wykładnika potęgi
               (new Jakapotega()).ShowDialog();
               //wylicz
               Blokwynik.Text = klasa.potega(liczba1, okienkowykladnika.podajwykladnik(0,0)).ToString();
               //w tym liczba1 jest podstawą potęgi, a zwrócona wartość przez funkcje "okienkowykladnika.podajwykladnik(0,0)" jest wykładnikiem potęgi
           }
           catch
           {
               MessageBox.Show("Błąd potęgowania!");
           }
       }

 

A to fragment kodu drugiego okienka/klasy

 private void okwykladnik_Click(object sender, RoutedEventArgs e)
       {
           podajwykladnik(0, 0);
       }

       public double podajwykladnik(double a, double b)
       {
           try
           {
               this.Close();
               //zwróć wartość z textBoxa
               return Convert.ToDouble(wykladnikpotegi.Text);
           }
           catch (System.OverflowException)
           {
               MessageBox.Show("Wystąpił błąd! Nie można obliczyć tak dużej liczby!", "Błąd!", MessageBoxButton.OK, MessageBoxImage.Error);
           }
           catch
           {
               MessageBox.Show("Wystąpił błąd! Proszę nie wpisywać tekstu!", "Błąd!", MessageBoxButton.OK, MessageBoxImage.Error);
           }
           this.Close();
           return 0;
       }

 

Chodzi tu o to, że po wykonaniu tej linijki:

(new Jakapotega()).ShowDialog();

program nie czeka na zamknięcie tego okienka tylko kontynuuje działanie przez co nie mogę przekazać z funkcji "podajwykladnik" wartości wykładnika do tej linijki:,

//wylicz
Blokwynik.Text = klasa.potega(liczba1, okienkowykladnika.podajwykladnik(0,0)).ToString();

bo program zwyczajnie wczytał sobie zawartość textboxa przed tym jak klikłem "ok" w okienku z klasy "Jakapotega"

 

Reasumując chodzi mi o to co zrobić, żeby po wywołaniu okienka

(new Jakapotega()).ShowDialog();

, pierwsze okno (macierzyste czekało na jego zamknięcie i dopiero wtedy kontynuowało działanie)

 

Mam nadzieje że za bardzo nie zagmatwałem :P

 

Proszę Was o pomoc :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wrzuć cały projekt, bo z takich zlepków trzeba się domyślać, co i jak.

 

U mnie blokowanie ShowDialog() działa bez problemu, możesz jeszcze wywołanie ShowDialog() zawrzeć w ifa i wykonywać tylko wtedy, gdy zwrócono true.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Popatrz na DialogResult, cos jak... if ((new Jakapotega()).ShowDialog()==DialogResult.OK) {tutaj cos robisz}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam ponownie. Piszę dopiero dziś bo nie było mnie kilka dni w domu :)

Wczoraj nad tym jeszcze raz myślałem i okazało się, że to nie ShowDialog() było problemem, (bo program rzeczywiście się zatrzymywał) a pisanie z innej klasy po innej klasie i "przerzucaniu" między nimi zmiennych. Doszedłem do wniosku, że lepiej będzie mi zrobić potęgowanie w osobnym okienku (zarówno podanie wykładnika jak i podstawy potęgowania, oraz wyświetlenie wyniku) i to mi wyszło :P

 

Wracając do tematu:

Wygląda to tak:

Ten fragment kodu pobiera z okna MainWindow liczbę którą chcę podnieść do potęgi

//pobierz liczbę z TextBlocka
liczba1 = Convert.ToInt32(Blok1liczby.Text);

Tu wyświetlam okienko w którym użytkownik wpisuje wykładnik potęgi:

//wyświelt okienko z TextBoxem w którym wczytuje wartośc wykładnika potęgi
(new Jakapotega()).ShowDialog();

No i tu pojawia się problem... Bo po wywołaniu tego okna, wpisaniu wykładnika i kliknięciu "ok" wywołuje funkcję

"podajwykladnik()" w klasie drugiego okna i funkcje ta nie zwraca wartości dla klasy MainWindow, tylko dla klasy drugiego okna...

 public double podajwykladnik(double a, double b)
       {
           try
           {
               this.Close();
               //zwróć wartość z textBoxa
               return Convert.ToDouble(wykladnikpotegi.Text);
           }
           catch (System.OverflowException)
           {
               MessageBox.Show("Wystąpił błąd! Nie można obliczyć tak dużej liczby!", "Błąd!", MessageBoxButton.OK, MessageBoxImage.Error);
           }
           catch
           {
               MessageBox.Show("Wystąpił błąd! Proszę nie wpisywać tekstu!", "Błąd!", MessageBoxButton.OK, MessageBoxImage.Error);
           }
           this.Close();
           return 0;
       }

 

a konkretnie dla tej linijki jest zwracana wartość:

private void okwykladnik_Click(object sender, RoutedEventArgs e)
       {
           podajwykladnik(0, 0);
       }

 

Po tym wszystkim okno się zamyka a ja dopiero wtedy wywołuje z klasy MainWindow tę funkcję

Blokwynik.Text = klasa.potega(liczba1, okienkowykladnika.podajwykladnik(0,0)).ToString();

. Tylko, że w tym momencie okno jest już zamknięte i funkcja ta zwraca mi zawsze wartość "2", a to dlatego że taką wartość początkową ustawiłem dla TextBoxa, w klasie drugiego okna:

private void potega()
       {
           Jakapotega okienkowykladnika = new Jakapotega();
           Class1 klasa = new Class1();

           try
           {
               //pobierz liczbę z TextBlocka
               liczba1 = Convert.ToInt32(Blok1liczby.Text);
               //wyświelt okienko z TextBoxem w którym wczytuje wartośc wykładnika potęgi
               (new Jakapotega()).ShowDialog();
               //TU JEST PROBLEM
               Blokwynik.Text = klasa.potega(liczba1, okienkowykladnika.podajwykladnik(0,0)).ToString();
               //w tym liczba1 jest podstawą potęgi, a zwrócona wartość przez funkcje "okienkowykladnika.podajwykladnik(0,0)" jest wykładnikiem potęgi
           }
           catch
           {
               MessageBox.Show("Błąd potęgowania!");
           }
       }

 

No właśnie... Próbowałem to jakoś ostatnio rozwiązać, ale nie udawało mi się, (nie będę tutaj wrzucał wszystkich moich kolejnych kodów bo zaśmiecę tylko forum :E), więc dałem sobie spokój i zrobiłem to potęgowanie w całości w osobnym okienku...

 

Jednak mój problem pozostaje, bo nie radzę sobie z podobnymi sytuacjami jak wyżej...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

masz powalony ten kod. Po pierwsze Jakapotega okienkowykladnika=new Jakapotega() to jedna instancja okna (ktora nigdy nie jest wyswietlona). (new jakapotega()).showdialog tworzy nowa instancje okienkowykladnika i to okno jest pokazane. Wiec tak naprawde musisz pokazac chyba okienkowykladnika. wiec powinno byc okienkowykladnika.showdialog(). To w sumie nic ci nie da bo jak zamkniesz okno (znaczy wywolasz Close()) zniszczysz ta instancje okna i tym samym odwolanie Blokwynik.text=.... zwroci blad. jak chesz cos zwrocic z drugiego okienka poczytaj sobie o przekazywaniu argumentow. W twoim przypadku mozesz dodac nowy konstruktorpublic Jakapotega (ref int a) czyli bedziesz mial 2 konstruktory jeden bezparametrowy drugi z 1 parametrem. Wtedy w tym okienku (jakapotega) w momencie zamykania ustawiasz a=int.parse(twojTextBox.Text);.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
masz powalony ten kod.

Po krótce też to zauważyłem :E

To co się dzieje między klasami muszę sobie jeszcze poćwiczyć ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...