spietrza
(Spietrza)
3 Styczeń 2010 21:45
#1
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.
Fiolek
(Fiołek)
3 Styczeń 2010 21:51
#2
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”);
}
_alex
([alex])
4 Styczeń 2010 23:22
#4
Tak nie można, bo przycisk się nie odblokuje po zamknięciu formatki.
MazQuick
(MazQuick)
5 Styczeń 2010 19:18
#5
Wymysliłem takie coś
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…
Fiolek
(Fiołek)
5 Styczeń 2010 20:09
#6
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();
}
MazQuick
(MazQuick)
5 Styczeń 2010 20:17
#7
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
Fiolek
(Fiołek)
5 Styczeń 2010 20:33
#8
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.
MazQuick
(MazQuick)
5 Styczeń 2010 20:39
#9
Ahh… no fakt.
Teraz działa
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.
spietrza
(Spietrza)
5 Styczeń 2010 21:15
#11
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
somekind
(somekind)
6 Styczeń 2010 00:07
#13
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.
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
jest metoda Form.ShowDialog() która wyświetla okienko modalne
http://msdn.microsoft.com/en-us/library … modal.aspx
somekind
(somekind)
6 Styczeń 2010 20:53
#15
Spróbuj wtedy zrobić cokolwiek na pierwszej formatce.
somekind:
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.
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.
somekind
(somekind)
7 Styczeń 2010 23:54
#17
Spoko, ja tylko zwracam na uwagę, że zniszczenie obiektu nie jest równoznaczne z wyczyszczeniem pamięci.