[c++/cli] Praca na wielu formach oraz zarzadzadzenie nimi

0

Witam,
Mam taki problem a właściwie dwa problemy.
Pierwszy z nich. po otwarciu nowego forma chcialbym nim zarzadzac z innego forma. Mam np. panel przyciskow i jeden przycisk otwiera mi nowy form a drugi przycisk zamyka mi wczesniej otwartego forma.. Jak dokonać zamknięcia?

Druga sprawa.
Na formie1 mam zmienna globalna "wynik"
Includuje form2 zeby moc go otworzyc..
Na form2 includuje form1 zeby moc zmieniac zmienna "wynik"
No i pojawiaja sie errory dziwne na formie1. Usune tylko jedna linijke na form2 i nagle form1 nie ma bledow.. Tak wiec jak to rozwiazac?

0

Nie pomogę ci, bo pierwszy problem to 90% wszystkich pierwszych problemów początkujących programujących WinFormsy, a drugi to typowy problem rekursywnego dołączania nagłówków w C / C++.

Ale zapytam - dlaczego korzystasz z C++/CLI? Nie prościej będzie ci zaprojektować interfejs w C# (nawet jeżeli musisz skorzystać z C++/CLI, jeżeli tworzysz jakiś binding, w co wątpię, a do tego używa się głównie tego tworu).

0

Ale zapytam - dlaczego korzystasz z C++/CLI? Nie prościej będzie ci zaprojektować interfejs w C#

C++/CLI nie jest jakoś specjalnie gorsze od C# do pisania interfejsu. Trzeba tylko pamiętać o tych wszystkich ptaszkach, i kiedy kropka, kiedy ->

 a kiedy <code noframe>::

przy dostępie do elementów składowych. To chyba główne różnice…

0

pisze w c++/cli, bo w szkole piszemy na borlandzie, a ja z kumplem postanowilismy pisac w visualu (borland ma jakies dziwne zwiechy i w ogole..)

No i w borlandzie po prostu form2->close(); i po problemie a w visualu nie działa tak.

0

przepraszam za podwójny post..

Zarówno pierwszy problem jak i drugi nie występują w borlandzie, dlatego mam problem w tym miejscu.
Mam zgodę nauczyciela na pisanie wszystkiego tylko w visualu pod warunkiem, że sam będę szukał rozwiązań. No i pierwszy raz mam problem z którym w ogóle nie umiem sobie poradzić. Nie bardzo rozumiem dlaczego te nagłówki w borlandzie działają a na VS już nie.

0

Problem był już wałkowany. Poszukaj.
Visual nie jest winny, że niektóre rzeczy są w nim inaczej...

0

No wiec to z nagłowkami już sobie poradziłem (dzieki rev.pl nie wiedzialem jak sie to nazywa)

Co do mojego pierwszego problemu czyli "zdalne" zamykanie forma to nie wiem jak rozwiązać, a uwierzcie, że szukałem (ten temat miałem już 2 tygodnie temu)

0

Aby zamknąć Forma trzeba wywołać metodę Close().
W klasie Form1 zrób sobie pole typu Form2 i operuj na nim - czy może być coś prostszego?

0

jezeli chodzi ci o

[code]form2^ costam = gcnew form2();
costam->Show();
costam->Close();[/code]

To sorry, ale nie działa

0

To sorry, ale nie działa
Pewnie działa – tylko że pokazujesz formę i natychmiast ją zamykasz.

0

ehh nie rozumiesz.. dobrze wiem, że zaraz jak dam close po openie to sie zamknie -,-
Problem jak tego close dam na inny przycisk.

1>i:\projects\yrdd\yrdd\Form1.h(168): error C2227: left of '->Close' must point to class/struct/union/generic type
1> type is unknown-type

w tym jest problem

0

http://www.speedyshare.com/files/25835265/Operowanie_na_Formach.rar

projekt który zawiera obydwa błędy..
Z tym include'owaniem sobie jednak nie poradzilem. Myslalem ze trzeba dac ifndef ale nie zmienia to nic (po zaincludowaniu 2 formow razem, pojawia sie np. Form2 undeclared)
Drugi problem jak zamknac tego form2 "zdalnie"

0

Nie, to Ty nie rozumiesz. Przepiszę swojego poprzedniego posta jeszcze raz, wyraźniej:

W KLASIE FORM1 ZRÓB SOBIE POLE TYPU FORM2 I OPERUJ NA NIM

Jak na razie tworzysz sobie obiekt Form2 w jednej metodzie obsługi zdarzenia. Nic dziwnego, że nie masz do niego dostępu z innej metody, bo go tam nie ma. Proste jak zasięg zmiennych. Ty chcesz móc operować na tym obiekcie w dowolnej metodzie programu, wiec musisz ją zadeklarować jako pole klasy.

Twoim podstawowym problemem prawdopodobnie jest to, że nie wiesz co to jest klasa oraz pole i nie rozumiesz, jak działa zasięg zmiennych.

0

te "ehh nie rozumiesz.. " odwolywalo sie do "pokazujesz formę i natychmiast ją zamykasz." a nie do jakiegokolwiek innego zdania.

I tak nie rozumiem o co chodzi. Inaczej bym nie pytał. Robimy to w szkole, nauczyciel dyktuje Form2->Close(); i dziala bez zadnego zajakniecia. I sam musze sobie radzic z problemem, a troche ciezko gdy nie wiem jak sie to nazywa.

Pomogl bys i poprawil zrodlo, Od razu bym wiedzial jak przyszle programy robic + jak sie obsluguje "nowosc" (jak poznaje cos nowego to Od razu msdn i czytam co ciekawego pisza), a tak 3 dzien bez sensu juz piszemy i i tak sie nic nowego nie dowiedzialem

0
  1. 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.

0

o! dziekuje ci bardzo, teraz posklejac do kupy i ogarnac jak dziala.
Naprawde bardzo dziekuje

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