Przekazywanie zmiennych między formami MyForm oraz MyForm1 Visual C++

0

button1 formatki MyForm uruchamia formatkę MyForm1 na której znajduje się button2.

Chciałbym aby po kliknięciu button2 nastąpiła zmiana nazwy buttona1 na Xbutton.

Sposobem tym chciałbym poznać sposób jak uruchamiać metody z formatki MyForm z poziomu MyForm1

Do tej pory pracowałem w Delphi i tam jakoś wydaje mi się temat był prostszy niż w Visual C++.

Z góry dziękuję za pomoc :)

//MyForm
#pragma once
#include "MyForm1.h"
namespace Project6 {

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 MyForm
/// </summary>
public ref class MyForm : public System::Windows::Forms::Form
{
public:
	MyForm(void)
	{
		InitializeComponent();
		//
		//TODO: Add the constructor code here
		//
	}
public: MyForm1^ f;

protected:
	/// <summary>
	/// Clean up any resources being used.
	/// </summary>
	~MyForm()
	{
		if (components)
		{
			delete components;
		}
	}
public: 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::Button());
this->SuspendLayout();
//
// button1
//
this->button1->Location = System::Point(0, 0);
this->button1->Name = L"button1";
this->button1->Size = System::Size(75, 23);
this->button1->TabIndex = 0;
this->button1->Text = L"button1";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
//
// MyForm
//
this->AutoScaleDimensions = System::SizeF(6, 13);
this->AutoScaleMode = System::Font;
this->ClientSize = System::Size(284, 262);
this->Controls->Add(this->button1);
this->Name = L"MyForm";
this->Text = L"MyForm";
this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);
this->ResumeLayout(false);

	}

#pragma endregion
private: System::Void MyForm_Load(System::Object sender, System::EventArgs e) {

}
private: System::Void button1_Click(System::Object<sup>  sender, System::EventArgs</sup>  e) {


		f = gcnew MyForm1();
		f->ShowDialog();

}
};

}

//MyForm1

#pragma once
//#include "MyForm.h"
namespace Project6 {

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 MyForm1
/// </summary>
public ref class MyForm1 : public System::Windows::Forms::Form
{
public:
	MyForm1()
	{
		InitializeComponent();
		//
		//TODO: Add the constructor code here
		//
		

	}


protected:
	/// <summary>
	/// Clean up any resources being used.
	/// </summary>
	~MyForm1()
	{
		if (components)
		{
			delete components;
		}
	}
private: System::Windows::Forms::Button^  button1;
private: System::Windows::Forms::Button^  button2;
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::Button());
this->button2 = (gcnew System::Button());
this->SuspendLayout();
//
// button1
//
this->button1->Location = System::Point(0, 0);
this->button1->Name = L"button1";
this->button1->Size = System::Size(75, 23);
this->button1->TabIndex = 0;
this->button1->Text = L"button2";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &MyForm1::button1_Click);
//
// button2
//
this->button2->Location = System::Point(22, 0);
this->button2->Name = L"button2";
this->button2->Size = System::Size(8, 8);
this->button2->TabIndex = 1;
this->button2->Text = L"button2";
this->button2->UseVisualStyleBackColor = true;
//
// MyForm1
//
this->AutoScaleDimensions = System::SizeF(6, 13);
this->AutoScaleMode = System::Font;
this->ClientSize = System::Size(284, 262);
this->Controls->Add(this->button2);
this->Controls->Add(this->button1);
this->Name = L"MyForm1";
this->Text = L"MyForm1";
this->ResumeLayout(false);

	}

#pragma endregion
private: System::Void button1_Click(System::Object sender, System::EventArgs e) {

}
};

}

0

Skorzystaj z dependency injection.

0

Przekazać instancję formy 1 do konstruktora formy 2 i trzymać jako pole prywatne formy 2.

0

Czy mógłby ktoś podać przykład kodu?

Próbowałem zrobić tak:
//w poliku MyForm1
MyForm1(MyForm Formatka_pierwotna)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
f= Formatka_pierwotna;

        f.button1.Text="zmiana tekstu"
    }

//w pliku MyForm
private: System::Void button1_Click(System::Object sender, System::EventArgs e) {

        f = gcnew MyForm1();
        f->ShowDialog(this);

}

Niestety nie działa. Wyświetla mi błąd że w pliku MyForm1 nie znane jest MyForm.
Dorzucenie do MyForm1 #include "MyForm.h" nie pomogło, wygląda na to że dodatnie #include "MyForm1.h" w pliku MyForm przynosi rezultat i MyForm1 jest rozpoznawane w MyForm natomiast na odwrót nie wychodzi mi to.

Proszę o jakiś przykład kodu, straciłem na to sporo czasu. Jestem powracającym po 12 latach do programowania begginerem i będę wdzięczny za pomoc kolegów.

1
MyForm1(MyForm Formatka_pierwotna)
MyForm1(MyForm ^Formatka_pierwotna)

ten daszek jest potrzebny.

            f.button1.Text="zmiana tekstu"
f->button1->Text = "zmiana tekstu";

ale takie bezpośrednie odwoływanie się do pól innej formy nie wygląda ładnie. lepiej zrobić to na eventach.

f = gcnew MyForm1();

skoro konstruktor ma teraz parametr typu MyForm^, to trzeba jakiś podać...

f = gcnew MyForm1(this);

wygląda na to że dodatnie #include "MyForm1.h" w pliku MyForm przynosi rezultat i MyForm1 jest rozpoznawane w MyForm natomiast na odwrót nie wychodzi mi to
Klasyczny problem zwany “circular reference”. w C++ (oraz C++/CLI) rozwiązuje się go dzieląc odpowiednio kod na plik .h i .cpp, w pierwszym tylko nagłówki funkcji a w drugim właściwy kod.
I tu pojawią się dwa zgrzyty: designer Windows Forms będzie uparcie generował kod nowych funkcji w pliku .h, i trzeba będzie ręcznie przenosić do .cpp. druga sprawa to funkcja InitializeComponent zawarta w dyrektywie #region. Ten region trzeba przenieść razem z ciałem funkcji do .cpp, nie można go wykasować bo forma przestanie być edytowalna.

Przy okazji możesz uporządkować kod by przestał wyglądać jak generowany z automatu: popoprawiać wcięcia i nadmiarowe entery, usunąć powtórzenia private: private: itp., zamienić System::Void na void (to to samo) i tak dalej. Tylko wnętrza InitializeComponent nie ruszaj.

0

Dziękuję za wyczerpującą odpowiedź. Będę testował kod według wskazówek.

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