Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Доступ к переменной из Form1 в Form2.C++

72K
14 июля 2011 года
makcum
5 / / 13.07.2011
Помогите пожалуйста разобраться как сделать доступ к переменной из Form1 в Form2. В Form1 есть textBox и button1, по ножатию button1 открывается Form2 в которой тоже есть кнопка по нажатию уже которой должен измениться текст в textBox'е Form1. Ситуация такая как описанно на http://forum.codenet.ru/threads/55846-WinForms-две-формы/page1 . Но что я не пробовал ничего не получается .
Form1.h :
 
Код:
#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() ;
    }

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";
    }

При попытке компиляции он ругается :
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

Я уже в панике, нигде ничего толком по этому нет.
Подправьте пожалуйста код или напишите что не так.
278
14 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Юзаем поиск по форуму. Я лично на этот вопрос отвечал 2 или 3 раза, и еще N раз другие люди отвечали.
72K
15 июля 2011 года
makcum
5 / / 13.07.2011
Спасибо тебе Alexander92. Но поиском я уже пользовался. Посмотрел я и в твоих сообщениях, нашел. Дело в том что я терпеть не могу общаться на всяких форумах и прочих общалках, я только читаю и в очень редких случаях спрашиваю. Месяц поиска и проб, а результата ноль. Я вболее сложных вещах разобрался , а тут не могу. Уже лезу на стены и стучусь головой об потолок. ПОМОГИ ПОЖАЛУЙСТА !!! Разжуй еще раз для идиота если не тяжело.
PS : на написание сообщения в шапке у меня ушло три часа, а на это час.
341
15 июля 2011 года
Der Meister
874 / / 21.12.2007
В дизайнере формы для Form2::button1 ствим свойство DialogResult = OK, обработчик события для неё убираем.

Код:
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;
        }
    }
};


С++ передача данных из одной формы в другую
72K
15 июля 2011 года
makcum
5 / / 13.07.2011
Эх, если б все было так просто как вы пишите Der Meister. Спасибо за ссылку, но я её уже читал. Вся сложность ( для меня ) в том что переменных штук 50. А код указанный выше утрирован по самый не балуй.
Для большей наглядности подкоректирую
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 ) ;
    }

Помимо textBox'ов есть comboBox'ы, checkBox'ы и т.д. и т.п.
5
18 июля 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: makcum
Эх, если б все было так просто как вы пишите Der Meister. Спасибо за ссылку, но я её уже читал. Вся сложность ( для меня ) в том что переменных штук 50.

А какой смысл обращаться к данным, относящимся к одной форме из другой? Срочно читаем про MVC.

72K
18 июля 2011 года
makcum
5 / / 13.07.2011
Прочитал. Что то понял, что то не очень. Давайте тогда разберемся, я думаю это будет по теме.
Есть форма Form1, в ней объявленны public static переменные. Перед выводом формы из файла считываются данные и присваиваются этим переменным. После чего мы видим окно приложения. Пользователь по нажатию кнопки запускает расчет некоторых данных, которые сильно грузят проц и которые динамически выводятся на экран. Это все решается передачей сложных расчетов в отдельный поток и возвратом результата для вывода. Внешне это похоже на секундомер с сотыми долями секунды ( циферки также быстро бегут ). Вот эта часть я думаю должна быть реализована как вы говорите по шаблону MVC.
Теперь ближе к теме. Пользователей много, а по сему переменные у каждого разные, а настройки требуют они раз в год , а то и реже. Юзер нажимает кнопку "Настройки"( Setting , Options ). Запускается Form2 которая считывает переменные из Form1 и выводит их в отдельном окне. Коректируется кому что надо и как надо, сохраняется в переменных и файле, закрывается Form2. В моем случае в Form2 ни каких расчетов не производится. Только ввод значения в textBox'ы и выбор алгоритмов в comboBox'ах. Эту часть я бы отнес к Model-View-ViewModel
P.S. Товарищи, поактивней как то надо. Где гуру IT-индустрии и асы компьютерных технологий ?
69K
21 июля 2011 года
serpoverst
8 / / 30.06.2011
Я создал проект. Затем создал вторую форму File->New->New Form
и в файле 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";
}


[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";
}


Итого обращаемся из Form1 к Form2->Edit1 и меняем текст и делаем видимым вторую форму и из второй формы Form2 жмем кнопку и меняется текст в первой.

Папробуй далжно работать. Если нет то закрой свой проект и создай новый, затем добавь еще одну форму заинклудь их как показано выше.
Конечно у тебя могут быть уже не Form1 и Form2 а например Form3 и Form4 но сути это не меняет.

p.s.
Чет не получилось в коде изменить цвет текста =(
72K
21 июля 2011 года
makcum
5 / / 13.07.2011
Вы наверно привели код для Borland C++ Builder, а надобно для Microsoft Visual C++. Но и на этом спасибо. Разобрался наконец то сам. Так что объясню, а то мало ли попадутся товарищи такие же как я - "не сильно далекие".
Код 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() ;
    }

В 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 ) ;
             }

На этом все. Но тему я думаю наверно не стоит закрывать, может у кого возникнут другие идеи или вопросы по этому поводу. Так что пишите, буду регулярно заглядывать.
29K
04 декабря 2012 года
asupdemon
29 / / 03.10.2008
А что такое name? Объясните пожалуйста.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог