C# Otwórz formatkę

Moim problemem jest to że w projekcie posiadam dwie formatki ( Form1, Form2).

Na Form1 mam przycisk, który realizuję następujący kod :

form2 Moja = new Form2();

Moja.Show();

Form2 pokazuje się ale problem tkwi w tym że chce aby blokować próbę otworzenia tej samej formatki drugi raz.

Próbowałem znaleść metodę actived lub visibly ale na formsach nie mam tych wartości.

Zrób Moja jako składową klasy Form1 i przy naciśnięciu przycisku sprawdzaj czy Moja == null(tworzysz i pokazujesz) i Moja != null && Moja.Visible == false(tylko pokazujesz).

można też tak

private bool stworzonoFormatke = false;

form2 Moja = new Form2();

//button event :

if (!stworzonoFormatke)

{

Moja.Show();

stworzonoFormatke=true;

//mozesz zablokowac button >> button.enable=false;

}

else

{

MessageBox.Show(“Formatka istnieje”);

}

Tak nie można, bo przycisk się nie odblokuje po zamknięciu formatki.

Wymysliłem takie coś :slight_smile:

Zrobiłem klase z zmienna Visible.

Forms.cs

class Forms

    {

        public static bool Visible = false;

    }

w Form1.cs w Evencie Button Click

Form2 frm2 = new Form2();

            if (Forms.Visible == false)

            {

                frm2.Show();

                Forms.Visible = true;

            }

            else

            {

                MessageBox.Show("Form2 is already visible!");

            }

w Form2 w evencie FormClosed

Forms.Visible = false;

Tutaj jest filmik jak to działa. (348KB do pobrania)

Oczywiście jeżeli Formatek jest więcej to zmiennych też niestety powinno być więcej bo po 1 dla każdej formy… :slight_smile:

Ale po co, jeśli System.Windows.Forms.Form ma właściwość Visible?

//Zmienne Form

Form2 frm = null;


//ctor Form

Form()

{

frm = new Form2();

}


//Event

{

if(!frm.Visible)

   frm.Show();

}

EDIT: Ale zaraz… ten kod co podajesz u mnie przynajmniej, nie działa…

Formatka tak czy inaczej pokazuje się kolejny raz.

Form2 frm2 = new Form2();

if (frm2.Visible == false) //(!frm2.Visible) :)

{

    frm2.Show();

}


Klikam raz, pokazuje się, drugi raz, też...

Zmieniłem kod na dokładniejszy…

Form2 frm2 = new Form2();

            if (frm2.Visible == true)

            {

                MessageBox.Show("Form is visible!");

            }

            else if (frm2.Visible == false)

            {

                frm2.Show();

            }

I też nic :slight_smile:

To powinno być wywoływane raz, w konstruktorze Form1 a nie co zdarzenie.

W sumie warunek potrzebny nie jest, formatka i tak jest jedna więc Show jej nie zdubluje.

Ahh… no fakt.

Teraz działa :slight_smile:

Lecz czasami (jak zamkne Form2 i klikne w Button’a) wywala Exception’a, że nie można uzyskać dostępu do usuniętego objektu…

.Net posiada takie mechanizmy jak delegaty i łącząc z tym zdarzenia otrzymujemy ogromne mozliwosci.

Komunikacja między formatkami : http://www.codeguru.pl/article-742.aspx.

2 część artykułu opisuje ww mechanizmy.

A co własciwosci visible to hmm sprawa trochę bez sensu bo formatka może być niewidoczna a obiekt i tak istnieje więc przy tym programie moze to nie ma znaczenia ale przy większych aplikacjach rozwiązanie totalnie bez sensu.

Hmm, muszę spróbować Waszych podpowiedzi, bo to że tworzy się nowa forma zamiast aktywować tą która już jest wczytana do pamięci to dla mnie dziwne.

Takie rozwiązania są dla mnie znane z aplikacji MDI, ale nie standardowych.

Dzięki za wypowiedzi, może coś wspólnie ciekawe rozwiązanie znajdziemy.

hmm , C# sam generalnie niszczy obiekty , nie trzeba pisac Destruktorow etc wiec jak zamykamy formatke obiekt jest niszczony i nie ma go w pamieci :wink:

  1. Nie twórzmy formatki, jeśli nie jest nam potrzebna. Tworzenie drugiej formatki w konstruktorze pierwszej to zło. Przejdzie w prostym programie, ale jeśli np. druga formatka będzie realizowała w swoim konstruktorze złożone operacje, typu ładowanie z bazy, to nie ma najmniejszego sensu, bo może nigdy nie być potrzebne.

  2. Nie dodawajmy milionów zmiennych pomocniczych, jeśli wystarczy nam jedna. Wszystko można osiągnąć sprawdzając, czy from2 jest null i Visible.

W tym momencie może zostać co najwyżej usunięta referencja. Kiedy pamięć zostanie wyczyszczona nie wiesz.

oj, kombinujecie niepotrzebnie, są do tego gotowe mechanizmy :slight_smile:

jest metoda Form.ShowDialog() która wyświetla okienko modalne

http://msdn.microsoft.com/en-us/library … modal.aspx

Spróbuj wtedy zrobić cokolwiek na pierwszej formatce.

wiem! ponieważ Net niszczy (usuwa) obiekt po jego zamknieciu (“Form”.Close()) akurat w tym przypadku ale jak nadmieniłem wcześniej jest to złe rozwiązanie , wiec dlatego preferuje delegaty powiązane ze zdarzeniami które rozwiązują mase problemów w komunikacji bez potrzeby tworzenia danego obiektu.

Spoko, ja tylko zwracam na uwagę, że zniszczenie obiektu nie jest równoznaczne z wyczyszczeniem pamięci.

Dokładnie :slight_smile: