#include "stdafx.h"
#include "Form2.h"
...
public: static System::Windows::Forms::TextBox^ textBox1;
...
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
name::Form2 ^form = gcnew Form2() ;
form->Owner = this ;
form->ShowDialog() ;
}
Доступ к переменной из Form1 в Form2.C++
http://forum.codenet.ru/threads/55846-WinForms-две-формы/page1 . Но что я не пробовал ничего не получается .
Form1.h :
Form2.h :
При попытке компиляции он ругается :
error C2065: 'Form1' : undeclared identifier
error C2065: 'frm' : undeclared identifier
Тогда я добавляю в Form2.h #include "Form1.h" и возникают другие ошибки относящиеся к Form1.h :
error C2039: 'Form2' : is not a member of 'name'
error C2065: 'Form2' : undeclared identifier
error C2065: 'form' : undeclared identifier
Я уже в панике, нигде ничего толком по этому нет.
Подправьте пожалуйста код или напишите что не так.
Помогите пожалуйста разобраться как сделать доступ к переменной из Form1 в Form2. В Form1 есть textBox и button1, по ножатию button1 открывается Form2 в которой тоже есть кнопка по нажатию уже которой должен измениться текст в textBox'е Form1. Ситуация такая как описанно на
Form1.h :
Код:
Form2.h :
Код:
#include "stdafx.h"
...
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form1 ^frm = (Form1 ^)this->Owner;
frm->textBox1->Text ="123";
}
...
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form1 ^frm = (Form1 ^)this->Owner;
frm->textBox1->Text ="123";
}
При попытке компиляции он ругается :
error C2065: 'Form1' : undeclared identifier
error C2065: 'frm' : undeclared identifier
Тогда я добавляю в Form2.h #include "Form1.h" и возникают другие ошибки относящиеся к Form1.h :
error C2039: 'Form2' : is not a member of 'name'
error C2065: 'Form2' : undeclared identifier
error C2065: 'form' : undeclared identifier
Я уже в панике, нигде ничего толком по этому нет.
Подправьте пожалуйста код или напишите что не так.
Юзаем поиск по форуму. Я лично на этот вопрос отвечал 2 или 3 раза, и еще N раз другие люди отвечали.
PS : на написание сообщения в шапке у меня ушло три часа, а на это час.
Код:
public ref class Form2 : public Form {
// ...
public:
property String ^ MyText {
String ^ get {
// return textBox1->Text;
return L"123";
}
}
};
public ref class Form1 : public Form {
// ...
private:
System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form2 ^form = gcnew Form2() ;
DialogResult result = form->ShowDialog() ;
if (result == DialogResult::OK) {
textBox1->Text = form->MyText;
}
}
};
// ...
public:
property String ^ MyText {
String ^ get {
// return textBox1->Text;
return L"123";
}
}
};
public ref class Form1 : public Form {
// ...
private:
System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form2 ^form = gcnew Form2() ;
DialogResult result = form->ShowDialog() ;
if (result == DialogResult::OK) {
textBox1->Text = form->MyText;
}
}
};
С++ передача данных из одной формы в другую
Для большей наглядности подкоректирую
Form2.h :
Код:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form1 ^frm = (Form1 ^)this->Owner;
int i = Convert::ToInt32( frm->textBox1->Text ) + 1 ;
frm->textBox1->Text = Convert::ToString( i ) ;
}
Form1 ^frm = (Form1 ^)this->Owner;
int i = Convert::ToInt32( frm->textBox1->Text ) + 1 ;
frm->textBox1->Text = Convert::ToString( i ) ;
}
Помимо textBox'ов есть comboBox'ы, checkBox'ы и т.д. и т.п.
Есть форма Form1, в ней объявленны public static переменные. Перед выводом формы из файла считываются данные и присваиваются этим переменным. После чего мы видим окно приложения. Пользователь по нажатию кнопки запускает расчет некоторых данных, которые сильно грузят проц и которые динамически выводятся на экран. Это все решается передачей сложных расчетов в отдельный поток и возвратом результата для вывода. Внешне это похоже на секундомер с сотыми долями секунды ( циферки также быстро бегут ). Вот эта часть я думаю должна быть реализована как вы говорите по шаблону MVC.
Теперь ближе к теме. Пользователей много, а по сему переменные у каждого разные, а настройки требуют они раз в год , а то и реже. Юзер нажимает кнопку "Настройки"( Setting , Options ). Запускается Form2 которая считывает переменные из Form1 и выводит их в отдельном окне. Коректируется кому что надо и как надо, сохраняется в переменных и файле, закрывается Form2. В моем случае в Form2 ни каких расчетов не производится. Только ввод значения в textBox'ы и выбор алгоритмов в comboBox'ах. Эту часть я бы отнес к Model-View-ViewModel
P.S. Товарищи, поактивней как то надо. Где гуру IT-индустрии и асы компьютерных технологий ?
и в файле Unit1.cpp в это файле заинклудил #include "Unit2.h".
Обращаю внимание в файле Unit1.h ни каких инклудов не добавлял.
Unit2.h тож не трогал, а еслиб был Unit3.h то его б тоже не трогал :D
Все махинации только с файлами Unit1.cpp и Unit2.cpp
[SIZE="5"][COLOR="red"]Unit1.cpp[/COLOR][/SIZE]
Код:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h" <---------------------------------Инклуд для второй формы
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm4::Button1Click(TObject *Sender)
{
Form2->Visible=true;
Form2->Edit1->Text="1111111111111111";
}
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h" <---------------------------------Инклуд для второй формы
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm4::Button1Click(TObject *Sender)
{
Form2->Visible=true;
Form2->Edit1->Text="1111111111111111";
}
[SIZE="5"][COLOR="red"]Unit2.cpp[/COLOR][/SIZE]
Код:
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h" <---------------------------------Инклуд для первой формы
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
__fastcall TForm2::TForm5(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Form1->Edit1->Text="False";
}
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h" <---------------------------------Инклуд для первой формы
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
__fastcall TForm2::TForm5(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Form1->Edit1->Text="False";
}
Итого обращаемся из Form1 к Form2->Edit1 и меняем текст и делаем видимым вторую форму и из второй формы Form2 жмем кнопку и меняется текст в первой.
Папробуй далжно работать. Если нет то закрой свой проект и создай новый, затем добавь еще одну форму заинклудь их как показано выше.
Конечно у тебя могут быть уже не Form1 и Form2 а например Form3 и Form4 но сути это не меняет.
p.s.
Чет не получилось в коде изменить цвет текста =(
Код Form1.h ни чем не отличается от написанного в вопросе.
Form1.h
Код:
#include "Form2.h"
...
public: static System::Windows::Forms::TextBox^ textBox1;
...
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
name::Form2 ^form = gcnew Form2() ;
form->Owner = this ;
form->ShowDialog() ;
}
...
public: static System::Windows::Forms::TextBox^ textBox1;
...
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
name::Form2 ^form = gcnew Form2() ;
form->Owner = this ;
form->ShowDialog() ;
}
В Form2.h ни каких include'ов вставлять не надо, а сама функция которая требует доступ к Form1.h только объявляется
Form2.h
Код:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) ;
Описание функции происходит в Form2.cpp, сюда же вставляется #include "Form1.h". И ещё один нюанс - имя функции должно быть написано полностью, то есть с пространством имен.
Form2.cpp
Код:
#include "StdAfx.h"
#include "Form1.h"
#include "Form2.h"
using namespace name;
// Если не написать "name::Form2::" приложение не скомпелируется, а выдаст ошибку
System::Void name::Form2::button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form1 ^frm = (Form1 ^)this->Owner ;
int i = Convert::ToInt32(frm->textBox1->Text) + 1 ;
frm->textBox1->Text =Convert::ToString ( i ) ;
}
#include "Form1.h"
#include "Form2.h"
using namespace name;
// Если не написать "name::Form2::" приложение не скомпелируется, а выдаст ошибку
System::Void name::Form2::button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form1 ^frm = (Form1 ^)this->Owner ;
int i = Convert::ToInt32(frm->textBox1->Text) + 1 ;
frm->textBox1->Text =Convert::ToString ( i ) ;
}
На этом все. Но тему я думаю наверно не стоит закрывать, может у кого возникнут другие идеи или вопросы по этому поводу. Так что пишите, буду регулярно заглядывать.
А что такое name? Объясните пожалуйста.