Windows Forms Otwieranie Nowego Okienka - Problem

Odpowiedz Nowy wątek
2011-08-11 12:37
0

Od niedawna próbuję programować w Windows Forms w c++ .
W Form1 po naciśnięciu odpowiedniego przycisku mam taki kod aby wyświetlić nowe okienko:

 
Form2^ box = gcnew Form2();
box->ShowDialog();

a na samej górze mam oczywiście: #include "Form2.h"
I okienko wyświetla się poprawnie. Jest jednak problem, bo ja chciałbym aby po naciśnięciu tegoż przycisku otwierało się nowe okienko, ale te aktualne (Form1) zamykało się. Dawałem kod Close(); , ale albo nic się nie działo albo zamykały się obydwa okienka. Prosze o pomoc, bo ja już nie umiem sobie z tym poradzić.

edytowany 1x, ostatnio: paulonio, 2011-08-11 12:39

Pozostało 580 znaków

2011-08-11 12:39
0

Form1 jest zapewne głównym oknem aplikacji i zamknięcie go powoduje zamknięcie całej aplikacji. Możesz takie okno ukryć przez Hide(), albo użyć innego okna jako główne.

Pozostało 580 znaków

2011-08-11 12:45
0

dzięki działa ;)
tylko w jakim sensie to okno jest "uktyte" ? i czy można je po naciśnieciu odpowiedniego przycisku w Form2 odkryć ?

Pozostało 580 znaków

2011-08-11 13:17
0

Jasne, że można odkryć. Show() powinno wystarczyć ;]

Pozostało 580 znaków

2013-05-26 19:24
0

Mam pytanie odnośnie tematu:
Mam analogiczną sytuację, chcę aby po kliknięciu na pozycję menu Nowa gra otwierało się nowe okienko (Form2). Napisałem to następująco:

private: System::Void nowaGraToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
                 Form2^ box = gcnew Form2();
                 this->Hide();
                 box->ShowDialog();
             }

No i fajnie, nowe okienko otwiera się, a to główne się chowa (Hide()), ale gdy zamykam to nowo otwarte okienko krzyżykiem, ono znika, a to główne się z powrotem nie pojawia, a widzę, że debugowanie nadal trwa. Jak sprawić, aby po naciśnięciu krzyżyka w tym nowym okienku:
a) pojawiało się z powrotem główne okno (Form1)
b) cała aplikacja zamykała się ?

Pozostało 580 znaków

2013-05-26 19:27
0

jakbyś ten wątek przeczytał, to byś wiedział..
w zdarzeniu na zamknięcie drugiej formy daj form1->Show().

Pozostało 580 znaków

2013-05-26 20:15
0

Czytałem. Gdzie znajdę kod zamknięcia formy?

Pozostało 580 znaków

2013-05-26 20:34
2013-05-26 20:45
0

Aaa, okej, dziękuję.
Napisałem coś takiego:

private: void Form2_Closed( Object^ /*sender*/, System::ComponentModel::CancelEventArgs^ e ) {
                // Form1::Show();
             }

Jednak odwołanie Form1::Show() jest niepoprawne. Najpierw pojawia się błąd, że Form1 nie jest przestrzenią nazw ani klasą, no bo w Form2.h Form1.h nie jest znane, ale gdy nawet dołączę #include "Form1.h" w tym pliku, to wtedy jest jeszcze więcej błędów kompilacji. Jak więc poprawnie z wnętrza funkcji Form2_Closed odwołać się do Form1 i to okienko wyświetlić metodą Show() ?

edytowany 1x, ostatnio: Dragon2011, 2013-05-26 20:46

Pozostało 580 znaków

2013-05-26 21:59
0

Jednak odwołanie Form1::Show() jest niepoprawne

Form1 jest klasą, a ty potrzebujesz obiektu a nie klasy (typu).

Dlatego do konstruktora Form2 musisz podać obiekt klasy Form1.

Form2^ box = gcnew Form2(this);

i zapamiętać jako pole w klasie Form2.

Błędy z inkludami to klasyczny problem ze wzajemnymi #include w nagłówkach. Podstawy C++ się kłaniają ;-)
Rozwiązaniem jest na przykład podział klasy na plik .h i .cpp.

edytowany 1x, ostatnio: Azarien, 2013-05-26 22:00
Po kiego mu podstawy C++ kiedy on pisze w Windows Forms !? ;> - _13th_Dragon 2013-05-26 22:11
no w C# przecież tego nie pisze. - Azarien 2013-05-27 00:28
ale gdzie mam to podać? Eh, ująłem całość, tzn oba pliki Form1.h i Form2.h w dyrektywy #ifndef, nadal są błędy... Tę instrukcję Form2^ box = gcnew Form2(this); mam dać jako pole klasy Form2, czyli w którym miejscu, obojętnie, po destruktorze gdzieś? Wkleiłem, ale jak potem wywołać z powrotem tamto okienko główne? - Dragon2011 2013-05-27 16:50
i czy dawać w Form1 #include "Form2.h" i na odwrót? - Dragon2011 2013-05-27 16:51
@Azarien ci napisał: - "Podstawy C++ się kłaniają", którego słowa nie rozumiesz? Dla Form2 masz zrobić konstruktor, destruktor oraz składową. Konstruktor przyjmuje parametr typu Form^ i wpisuje go do składowej. Destruktor dla zapisanej składowej odpala metodę Show() - _13th_Dragon 2013-05-27 17:01
destruktor to chyba nie, bo zamknięcie okna to jeszcze nie zniszczenie obiektu. dlatego są zdarzenia FormClosing i FormClosed. - Azarien 2013-05-27 20:59

Pozostało 580 znaków

2013-05-27 21:38
0

Ok, więc po kolei:
do pliku Form1.h dodaję instrukcję #include "Form2.h". W drugą stronę nie robię, bo to powoduje dużo błędów.
Naciśnięcie przycisku menu w Form1:

private: System::Void nowaGraToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
                Form2^ window = gcnew Form2(this);
                                 this->Hide();
                             window->ShowDialog();

Teraz konstruktor Form2:

public:
        Form2(Form^ obiekt)
        {
            InitializeComponent();
            //
            box = obiekt;
            //
        }
        Form^ box;

I metoda FormClosed dla Form2:

private: void Form2_Closed( Object^ , System::ComponentModel::CancelEventArgs^ e ) {
                  box -> Show();
 
                         }

Jest składowa, konstruktor wstawia do niej obiekt typu Form^dostarczany w tym przypadku jako obiekt typu Form1, a metoda FormClosed wywołuje dla składowej metodę Show().
Kompiluje się ok, po wciśnięciu Nowa gra pojawia się okienko z Form2, a to z Form1 znika (Hide()), jednak znów po zamknięciu okienka z Form2 to początkowe nie otwiera się :/.

edytowany 2x, ostatnio: Dragon2011, 2013-05-27 21:39

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0