[C++/CLI]Include i praca między formami...

0

Witam,

Mam taki nowy problem.
Jest pewna klasa w nowym pliku o nazwie "data". Główna forma w pliku "Form1.h" oraz "Form1a.h" i "Form1b.h". Forma "b" jest podrzędna formie "a", a ta jest podrzędna formie głównej "Form1". W formie głównej jest zmienna "x" klasy "data" zawierająca definicję typu danych "temp". Problem tkwi w tym, że chciałbym wpisać do zmiennej "x" zdefiniowanej w formie głównej zmienną "temp" tej klasy (data) z "Form1b.h" (wiem, że trochę poplątane;p). Nie można stworzyć nowej zmiennej tej klasy, bo zawiera już jakieś dane, która "Form1b.h" ma wykorzystać. Problem jest również z include, bo o ile elegancko można includować formy podrzędnej do głównej to przy include "Form1.h" w "b" staje się problematyczne. Wypisuje, w "Form1.h" błędy tak jakby nie było include "data.h" (klasa tych danych).
No i... jakoś trzeba to rozwiązać, bo ja już się pogubiłem i straciłem pomysły :/
Aha. i jak w ogóle odwołać się z tej podrzędnej do zmiennej w klasie głównej typu klasy "data" ? Jak stworzę nową przez gcnew to stworzy pustą. Nie bardzo nawet wiem jak się tam dostać.

0

Szczerze tak naźgałeś,że nie zrezygnowałem z czytania twojego postu po 3 linijkach. Nie wiem czy o to Ci chodzi, ale wystarczy w Form zainkludować "Form" a składowym klasy(które chcesz użyć w innej formie) nadać dostęp public.

0

Wiem, ale ciężko to opisać tak by uwzględnić wszystkie szczegóły, a całość jest zwyczajnie (przynajmniej dla mnie) skomplikowana. To co odpowiedziałeś oczywiście nie dotyczy problemu. Kombinowałem na wiele opcji, ale nic.
Ale może tak na skróty, bo z resztą powinienem sobie poradzić, jak dostać się do elementu (np.zapisać do zmiennej jakąś wartość) klasy głównej z klasy podrzędnej ?

1

Musisz mieć referencję (albo wskaźnik) do klasy głównej w klasie podrzędnej.

0

Ale klasa główna musi być podana przez include w klasie podrzędnej ? Bo tu jest problem z tymi include. Jak w klasie głównej A, zdefiniuje typ danych z klasy B, to gdy w klasie (podrzędnej klasie A) C będę próbował włączyć klasę główną (A), ta klasa (A) nie będzie widziała typu danych klasy B. Wiem, że to pokręcone, ale tak to wygląda. Było też coś, że zamiast include "klasa.h" można było użyć include "klasa.cpp" w której umieściło się include "klasa.h". Zrobiłem tak, błędów nie było ale i tak nie można było stworzyć wskaźnika do klasy głównej :/

Na razie piszę dalej, wstawiając w te miejsca kod, który powinien działać. Czekam, aż ktoś mi powie o co w tym chodzi, bo jak na razie to piszę trochę na ślepo (nie mogę skompilować) :/

A może można to jakoś inaczej zrobić ? Cokolwiek, by się odnieść do zmiennej innej klasy :/

0

W formie głównej:

#include "formab.h"

*** *** ***
String ^Play1;
formab^ dlg= gcnew formab();
dlg->ShowDialog();
Play1=(dlg->Player1->Text);

*** *** ***

W formb:

*** *** ***
public: System::Windows::Forms::TextBox^  Player1;
*** *** ***

@Slynx ciężko się czyta twoje posty.

0

Domyślam się, że tak, bo nie zrozumiałeś i napisałeś to co ja już stosowałem wcześniej. Odwołałeś się z klasy głównej do textBoxa klasy B, natomiast do tej dodaj jeszcze odwołanie z klasy B do klasy głównej. I wtedy będzie dobrze. Tak jak pisałem, problem jest gdy dodam include klasy głównej wewnątrz podrzędnej.

Może szybko napiszę przykład który pokaże problem, skompiluję go i wkleję. zw ;p

To jest forma główna, zawiera tylko buttona:

#pragma once
#include "class.h"
#include "aaa.h" // <-- Tu tkwi problem, gdy chcę dodać podrzędną klasę do głównej oraz //gdy główna musi być użyta w podrzędnej.

namespace aa {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	/// <summary>
	/// Summary for Form1
	///
	/// WARNING: If you change the name of this class, you will need to change the
	///          'Resource File Name' property for the managed resource compiler tool
	///          associated with all .resx files this class depends on.  Otherwise,
	///          the designers will not be able to interact properly with localized
	///          resources associated with this form.
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
		}

	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Button^  button1;
	protected: 

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(197, 12);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(75, 23);
			this->button1->TabIndex = 0;
			this->button1->Text = L"button1";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(284, 262);
			this->Controls->Add(this->button1);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->ResumeLayout(false);

		}
#pragma endregion

	public:
		data KKK;
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
			 {
				 KKK.NAME[1] = "sss";
				 this->Close();

			 }
	};
}

 

To jest klasa, w której jest zdefiniowany typ danych data:

 
#pragma once

namespace aa 
{
	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	public ref class data
	{
	public:
		array<String ^> ^ NAME;
		data()
		{
			NAME = gcnew array<String ^>(100);
		}
	};
}

A to jest ostatnia klasa:

 
#pragma once
#include "Form1.h"

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;


namespace aa {

	/// <summary>
	/// Summary for aaa
	///
	/// WARNING: If you change the name of this class, you will need to change the
	///          'Resource File Name' property for the managed resource compiler tool
	///          associated with all .resx files this class depends on.  Otherwise,
	///          the designers will not be able to interact properly with localized
	///          resources associated with this form.
	/// </summary>
	public ref class aaa : public System::Windows::Forms::Form
	{
	public:
		aaa(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
		}

	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~aaa()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Button^  button1;
	private: System::Windows::Forms::TextBox^  textBox1;
	protected: 

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
			this->SuspendLayout();
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(198, 47);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(75, 23);
			this->button1->TabIndex = 0;
			this->button1->Text = L"button1";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &aaa::button1_Click);
			// 
			// textBox1
			// 
			this->textBox1->Location = System::Drawing::Point(177, 114);
			this->textBox1->Name = L"textBox1";
			this->textBox1->Size = System::Drawing::Size(100, 20);
			this->textBox1->TabIndex = 1;
			// 
			// aaa
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(284, 262);
			this->Controls->Add(this->textBox1);
			this->Controls->Add(this->button1);
			this->Name = L"aaa";
			this->Text = L"aaa";
			this->ResumeLayout(false);
			this->PerformLayout();

		}
#pragma endregion
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
			 {
				Form1^ dlg = gcnew Form1();
				dlg->KKK.NAME[1] = "as";
			 }
	};
}

I lista błędów wynikająca z użycia czegoś czego (teoretycznie) nie ma:

1>------ Rebuild All started: Project: aa, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'aa', configuration 'Debug|Win32'
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>aaa.cpp
1>AssemblyInfo.cpp
1>aa.cpp
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2065: 'Form1' : undeclared identifier
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2065: 'dlg' : undeclared identifier
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2061: syntax error : identifier 'Form1'
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(100) : error C2065: 'dlg' : undeclared identifier
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(100) : error C2227: left of '->KKK' must point to class/struct/union/generic type
1>        type is ''unknown-type''
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(100) : error C2228: left of '.NAME' must have class/struct/union
1>Generating Code...
1>Build log was saved at "file://c:\Users\Slynx\Documents\Visual Studio 2008\Projects\aa\aa\Debug\BuildLog.htm"
1>aa - 6 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

 

Nie wiem, może coś źle robię, może nie powinno się nawzajem includować plików, ale po prostu nie wiem jak stworzyć taką zależność :/


Damn, myślałem, że większy kod jest przewijany w okienku, a nie wszystko rozłożone na oknie ;p Ale już trudno.

0

Mi działa w oby dwie strony. Nie chcę mi się czytać całego twojego kodu, bo jest dość długi.. Może powiedz do czego dokładnie Ci to jest potrzebne? Może źle się za to zabierasz..

0

Nie chodzi o kod, bo to przecież z kreatora. Mam podkreślić linie które sprawiają problem, czy jak.

Źle się za to zabieram... wszystkie dane są zdefiniowane w osobnej klasie, a w formie głównej jest stworzona zmienna która obsługuje dane tej klasy. I w tym wypadku wszystkie inne formy, by uzyskać do nich dostęp muszą się odwołać do tej zmiennej (czyli do klasy głównej). To chyba najprostszy sposób. Jeszcze coś popróbuje.

W każdym razie u Ciebie to nie może działać, kod który podałem jest prosto z kreatora. Zresztą nie ma tam żadnej filozofii. Wszystkie kręci się wokół jednego punktu. Relacje między formami. Chyba muszę poszukać pomocy na msdn. Powinno coś tam być o zagnieżdżaniu form :/

0

Zagnieżdżaniu Form? o.O
To brzmi jak plan przelecenia jeża.

0

Jak wolisz, może być klas... zresztą to nie ma znaczenia. Jak nie wprowadzasz nic sensownego do tematu to się lepiej nie wypowiadaj. Ja od rana próbuje się z tym uporać. Problemem jest nawet to, że dokładnie nie wiem co wpisać w google, bo nie wiem jakie może być rozwiązanie. Innymi słowy, jeszcze nawet nie wiem czego szukać.

0

Ja rozumiem o co chodzi ale to tylko, dlatego ze mam ten sam problem daj znac jak znajdziezz rozwiazanie

0

Taki wątek już był niedawno temu. Dałem nawet szczegółowy kod jak należy jedną formę udostępniać drugiej.
Ściślej: nie należy na krzyż inkludować plików (nie zadziała), tylko w jednej formie utworzyć event

-a i wywoływać go z drugiej.
0

To co tutaj wszystko pisali oczywiście jest błędne. Nie o to chodziło. Chcesz rozwiązanie ?

  1. Podziel pliki projektu na .cpp i .h (Mam nadzieję, że wiesz jak poprawnie to zrobić)
  2. Jeśli będziesz miał wszystko tak jak ja, to przy deklarowaniu (lub definiowaniu, zawsze mi się myli, a nie mam teraz czasu sprawdzać) obiektu typu klasy danych dopisz słowo static (np. static typ_data NAZWA_OBIEKTU).
  3. W pliku z którego chcesz uzyskać dostęp wpisujesz include tego pliku w którym masz deklarację tego obiektu (czyli jak u mnie, klasa główna).
  4. Wskaźnik tworzysz w ten sposób "data ^ kat = %Form1::KATALOGER;", gdzie 'data' jest typem danych, 'kat' nazwa wskaźnika, 'Form1' nazwa klasy głównej w której jest deklaracja obiektu tego typu. 'KATALOGER' jest opcjonalne. U mnie tak jest by wskazywało bezpośrednio na klasę danych (jest to nazwa zdeklarowanego obiektu). I to wszystko. Potem przez "kat->" wywołujesz odpowiednie metody, itp.

a propoS. Ja się nieźle zagapiłem, ale teraz zauważyłem w kodzie błąd, który robiłem. pisałem "Form1();" zamiast "Form1;", a to przecież powoduje wywołanie konstruktora obiektu, czyli w żadnym przypadku nie to o co nam chodzi. Tylu ekspertów i nikt tego nie zauważył w przecież, najważniejszej linijce całego kodu.

I żadne includy "na krzyż" nic tu nie mają do rzeczy. Z tym sobie bez problemu poradzi (oczywiście przy zastosowaniu #pragma once). Nie potrafię tego dokładnie wytłumaczyć, ale "kolizje" pojawiały się gdy wszystko było wpakowane do pliku nagłówkowego. Teraz wiem dlaczego mnie tak zasypywał błędami.

Pozdrowienia
Slynx

P.S. Dałbym Ci link do dobrego forum na którym bez problemu pomogą każdemu, ale za to pewnie by usunęli post, a potem mnie z forum ;)
P.S.2. Gdybym o czymś zapomniał to daj znać, mogłem coś zgubić w wymienionym kodzie.

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