Hej, czy wie ktoś jak w c# ogarnąć, że w metodzie main klasy Program za pomocą Application.run() tworzymy pierwszy formularz. W formularzu logujemy się a gdy wszystkie dane są poprawne potrzebuje zamknąć ten formularz i wywołać kolejny Application.run() tym razem przedstawiający odpowiednią treść dla zalogowanych użytkowników. Starałem się aby program po zalogowaniu robił Application.Exit() a następnie wywoływał nową aplikację z przypisanym innym formularzem w argumencie. Jednak to się nie sprawdzi.. Czy może mi ktoś powiedzieć jak się rozwiązuje taki problem ?
robiąc Application.Run tworzysz okno główne które będzie obsługiwało całą kolejkę komunikatów. Zamykając to okno zamykasz całą aplikację. Okno logowania pokaż zwyczajnie przez .ShowDialog() i dopiero potem utwórz główne okno aplikacji
Jednak to się nie sprawdzi..
Niby dlaczego nie sprawdzi?
Standardowo metoda Main wygląda tak (w .NET 6; w 4.x jest trochę inna ale to bez różnicy):
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
{
No i teraz jak dasz poniżej drugie Application.Run()
, z inną albo nawet i tą samą formą, to otworzy się ona po zamknięciu pierwszej, bo Run czeka na zamknięcie formy.
Możesz tu dodać dowolną logikę.
Inna sprawa czy niestandardowy Main w WinForms to dobry pomysł. Ktoś inny oglądający kod może się w ogóle nie spodziewać że coś tu było grzebane.
Zgodnie ze sztuką, zamierzony efekt uzyskasz w następujący sposób: Niech główny formularz to okno właściwej aplikacji, a okienko do wpisania hasła będzie osobnym formularzem. W Main nic nie zmieniasz, natomiast w konstruktorze okna aplikacji dopisujesz this.Hide()
, żeby okno wywołać, ale nie pokazało się. Możesz też w ustawieniach zrobić ShowInTaskBar=false
, następnie uruchamiasz drugi formularz, mający przyciski OK i Cancel. Jak wpisze się poprawne hasło i kliknie OK, to następuje this.Show()
i ShowInTaskBar=true
, alby uruchomić okno aplikacji, a jak kliknie się Cancel, to robisz Application.Exit()
.
Inny sposób, to jeden formularz, ale na nim umieszczone dwa panele. W jednym panelu to, co ma zawierać aplikacja, a w drugim panelu pole tekstowe do hasła, przyciski OK i Cancel. Dla pierwszego panelu ustawiasz Visible=false
, dla drugiego Visible=true
. W przypadku poprawnego hasła i OK zmieniasz Visible
obu paneli, a w przypadku Cancel robisz this.Close()
(to samo, co zwykłe zamknięcie okna).
@andrzejlisek: Jasne, tylko czy kiedy wywołam ten drugi formularz ( do logowania ) za pomocą Application.Run() i logowanie pójdzie pomyślnie i ustawi właściwość i metodę dla głównego formualrza (ShowInTaskbar = true, this.Show()) to jak zamknąć ten formularz z logowaniem, żeby nie był widoczny ?
Druga sprawa jak w osobnym formularzu ( który jest obiektem zupełnie innej klasy ) moge zmienić składową innego obiektu. Form główny nie jest tej samej klasy co FORM okna logowania
Kuba Czarnecki napisał(a):
@andrzejlisek: Jasne, tylko czy kiedy wywołam ten drugi formularz ( do logowania ) za pomocą Application.Run() i logowanie pójdzie pomyślnie i ustawi właściwość i metodę dla głównego formualrza (ShowInTaskbar = true, this.Show()) to jak zamknąć ten formularz z logowaniem, żeby nie był widoczny ?
Pod przyciskiem OK, czy tam Zaloduj wywołujesz this.Close()
. To powoduje zamknięcie okna. A jak wywołałeś je modalnie z funkcji będącej w głównym formularzu, to potym nastapi ciąg dalszy tej funkcji, w której za pomocą this.Show()
możesz uwidocznić ten główny formularz.
Kuba Czarnecki napisał(a):
Druga sprawa jak w osobnym formularzu ( który jest obiektem zupełnie innej klasy ) moge zmienić składową innego obiektu. Form główny nie jest tej samej klasy co FORM okna logowania
W właściwościach każdej kontrolki masz Modifier
, po przestawieniu na Public
masz możliwość odwołać się z zewnątrz do tej kontrolki.