- w sekcji
private
</ol>
klasy <code noframe>Form1
dodaj
Form2^ okienko;
funkcję button1_Click</li>
</ol>
zmień na
```cpp
okienko = gcnew Form2();
okienko->Show();
W ten sposób funkcja button2_Click
ma dostęp do tej samej zmiennej <code noframe>okienko
i możesz odkomentować tam linijkę.
Pojawi się problem z wielokrotnym naciskaniem przycisków. Zrób coś z tym.
Zostaje kwestia formy 2. Rzeczywiście odkomentowanie tam „#include "Form1.h"
” spowoduje błąd. Ale i tak nic by to nie dało: <code noframe>Form1
to tylko typ, a konkretna zmienna przechowująca obiekt formy 1 w zasadzie nie istnieje: forma 1 jest tworzona w pliku Operowanie na formach.cpp, w funkcji main
programu, w linijce
```csharp
Application::Run(gcnew Form1());
Wzajemnej zależności trzeba się pozbyć. Zostaw więc Form2.h bez tego inkluda, a dodaj w nim klasę dziedziczącą po EventArgs
:
```cpp
public ref class StringEventArgs : public EventArgs
{
public:
String ^string;
StringEventArgs(String ^str) : EventArgs(), string(str) {}
};
Jak widzimy jest to prosta klasa z jednym Stringiem wypełnianym w konstruktorze. Ważne tylko, żeby dziedziczyła po EventArgs
.
Teraz w sekcji <code noframe>public
klasy Form2
dodaj zdarzenie:
```cpp
EventHandler<StringEventArgs^> ^button1_Click_Handler;
a w button1_Click
je wywołaj:
```cpp
button1_Click_Handler(this,gcnew StringEventArgs(textBox1->Text));
W formie 1 dodaj metodę, która ma być wywoływana na to zdarzenie:
private: void update_Label(Object^ sender, StringEventArgs^ e) {
// sender to forma2 wywołująca zdarzenie, możemy więc go sobie rzutować na Form2.
// ale nie musimy, bo potrzebnego stringa dostajemy w StringEventArgs:
label1->Text = e->string;
}
Musimy jeszcze powiedzieć formie 2, żeby wywoływała tę metodę:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
okienko = gcnew Form2();
okienko->button1_Click_Handler += gcnew EventHandler<StringEventArgs^>(this,&Form1::update_Label);
okienko->Show();
}
Uff. Skomplikowane – prawda. Ale tak naprawdę, w C++ Builderze też należałoby tak to robić: niestety, droga na skróty jest tam łatwa. Tutaj jest to celowo utrudnione, by wymusić prawidłowy design: jedna forma wywołuje zdarzenie, pod które podpina się druga.