С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/29: Рейтинг темы: голосов - 29, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 10.04.2010
Сообщений: 11

Связка двух форм

03.02.2012, 02:24. Показов 5573. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу курсач. MSVS 2010

Задача на данном этапе:
Имеется две формы Form1(главное окно) и Form2(некое окно настроек). Нужно их свзяать так, что бы из Form1 вызвать Form2 и в ней изменять свойства, функции и переменные Form1.

В файл Form1.h вставил строку:
C++
1
2
3
#pragma once
...
#include "Form2.h"
На кнопку Form1 привязал:
C++
1
2
Form2^ MyOption = gcnew Form2;
MyOption->ShowDialog();
Что даёт отличное открытие Form2, но... из неё я не могу обратиться к Form1.

Добавление строк
C++
1
2
3
#pragma once
...
#include "Form1.h"
Приводит к ошибке
C++
1
2
3
4
5
6
>... error C2065: Form2: необъявленный идентификатор
1>... : error C2065: MyOption: необъявленный идентификатор
1>... : error C2061: синтаксическая ошибка: идентификатор "Form2"
1>... : error C2065: MyOption: необъявленный идентификатор
1>... : error C2227: выражение слева от "->ShowDialog" должно указывать на тип класса, структуры или объединения либо на универсальный тип
1>          тип: 'unknown-type'
Проблема
Как сделать так, что бы изменять Form1 в Form2?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2012, 02:24
Ответы с готовыми решениями:

Связка двух форм и непонятное окно
Доброе время суток эксперты, подскажите пожалуйста чайнику, что это может быть? Unit2 я прописал в Uses, как положено, но при компиляции...

Связка двух форм в VB.Net 2015 + SQL Server 2008
Всем привет. Вновь обращаюсь за помощью к знающим и понимающим. Проблема такого плана : есть две формы, одна содержит DataGridView с...

Связка форм
У меня три формы, связанные между собой. Я сделала что при переходе с 1 формы на 2, 1 форма становилась не видимой , и так же со2 на 3 , на...

13
24 / 24 / 2
Регистрация: 26.07.2009
Сообщений: 414
03.02.2012, 19:12
Напиши пример, через какой код открывать другое окно, что знаешь и, как знаешь пиши! У меня, ни в какую, не получается сделать код!
0
1 / 1 / 0
Регистрация: 10.04.2010
Сообщений: 11
03.02.2012, 20:58  [ТС]
Цитата Сообщение от crashc Посмотреть сообщение
Напиши пример, через какой код открывать другое окно, что знаешь и, как знаешь пиши! У меня, ни в какую, не получается сделать код!
Я и так написал...

Добавлено через 1 час 6 минут
Я нашёл выход из своей ситуации.
Основной задачей теперь стало:
Выполнить подпрограмму формы1 после закрытия формы2. - Как реализовать?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
03.02.2012, 22:00
Цитата Сообщение от xCEZAREx Посмотреть сообщение
Form2^ MyOption = gcnew Form2;
MyOption->ShowDialog();
- всё же проведу параллели с MFC как я понял окно светим с помощью ShowDialog, т.е по всей видимости в немодльном режиме. В MFC вызов 2-го модального окна осуществляется DoModal(). Ну да ладно с модальностью
В случае если окно немодальное предусмотрите скажем флаг которог осуществит индикацию что вы нажали ОК в окошке, в программе парсите состояние данного флага. Если же окно было модальным в то вам нужно обработать if(MyOption.DoModal() == IDOK){} при этом MyOption должно быть членом класса 2-й формы Form2 MyOption, правда я написал всё проведя некие аналогии с MFC, т.к. вижу что методы вызова окна сходны, думаю и реализация должна быть тоже сходной...
0
1 / 1 / 0
Регистрация: 10.04.2010
Сообщений: 11
03.02.2012, 22:07  [ТС]
-=ЮрА=-,
Спасибо за идею. Но я приёл к выводу, что после манипуляций во второй форме, мне потребует вызвать функцию первой формы, которая автоматом обновит данные на ней. я всё никак не могу побороть "необъявленый идинтификатор форм1". Нашёл похожую тему на мсдн, но не могу её реализовать в своём проекте.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2012, 01:29
Цитата Сообщение от xCEZAREx Посмотреть сообщение
Нашёл похожую тему на мсдн
Вот, что там предлагается:
private Form1 refForm;
public Form2(Form1 refForm)
{
InitializeComponent();
this.refForm = refForm;
}
В моей vs2008 - не катит, а у Вас? Ну то есть сама попытка объявления private: Form1 refForm;
вызывает бурю негодования хотя Intelisense при использовании полного квалификатора доступа начиная с namespace проекта услужливо подсказывает, то есть вроде видит объявление Form1...
Подозрение, что предложенный вариант умозрителен (не компилировался) усилено тем что в оригинале:
private Form1 refForm; //пропущено двоеточие.
Вот так вот
0
1 / 1 / 0
Регистрация: 10.04.2010
Сообщений: 11
04.02.2012, 03:05  [ТС]
IGPIGP,
Не откомпилировался, но я почти решил проблему с этим вариантом.
Этот автор предоставил ещё такой вариант.
В любом случае,я могу обратиться к процедурам формы1 и перед показом формы2 запускать таймер, который отлавливает состояние глобальной переменной,после изменений в форме2 менять эту переменную и таймер услужливо обновит состояние формы1 и отключится. Но это как-ьто не профессионально =)

Добавлено через 55 минут
Нашёл идеальный вариант, но что-то не получается его использовать...

Добавлено через 30 минут
Решил проблему, облазив сотни страниц, я всё таки нашёл грамотное решение, позже выложу объяснения, так как заметил, что проблема частая и мало материала по ней.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2012, 15:10
Цитата Сообщение от xCEZAREx Посмотреть сообщение
В любом случае,я могу обратиться к процедурам формы1 и перед показом формы2 запускать таймер, который отлавливает состояние глобальной переменной,после изменений в форме2
Этот вариант хорош тем, что не требует открывать поля Form1 для Form2. Form1 контролирует и забирает что-то из Form2 сама.
Однако если, у Вас к какому-то моменту готов набор данных, например в текстбоксах, можно так:

Созданы Form1.h в котором public ref class Form1 и f2.h в котором public ref class F2.
в Form1.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma once
#include "f2.h"
 
//******************************************************
 
private: System::Windows::Forms::TextBox^  textBox1;
private: System::Windows::Forms::TextBox^  textBox2;
private: System::Windows::Forms::TextBox^  textBox3;
private:static F2^ myChild;
 
//******************************************************
#pragma endregion
private: System::Void myChild_button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
this->textBox1->Text=this->myChild->textBox1->Text;
this->textBox2->Text=this->myChild->textBox2->Text;
this->textBox3->Text=this->myChild->textBox3->Text;
}
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
if(this->myChild)this->myChild->Close();
this->myChild=gcnew F2();            
this->myChild->button1->Click+=gcnew System::EventHandler(this, &Form1::myChild_button1_Click);//!!!
if(myChild->Visible==false)myChild->Show(this);              
}
в файле f2.h
C++
1
2
3
4
5
6
7
8
public: System::Windows::Forms::Button^  button1;
public: System::Windows::Forms::TextBox^  textBox1;
public: System::Windows::Forms::TextBox^  textBox2;
public: System::Windows::Forms::TextBox^  textBox3;
//****************************************************************
#pragma endregion
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
 {}
Здесь нет доступа к Form1 из f2 напрямую и это +

Добавлено через 11 часов 16 минут
Цитата Сообщение от xCEZAREx Посмотреть сообщение
но что-то не получается его использовать...
Дайте угадать, - трудности c проектом?
1.Создаем проект с именем testApp
2.Form1 создается автоматически.
3.В окне Solution explorer правой кнопкой на имени проекта testApp -> add -> new item ->class -> windows form-> вводим имя Form2. Получаем Form2.h.
4.На фолдере Source Files правой кнопкой->add -> new item ->cpp-> вводим имя Form1. Получаем Form1.cpp.
5.Вставляем в полученный Form1.cpp:
#include "StdAfx"
и еще 2 хидера форм, впрочем, остальное копируется прямо со веб-странички.
Если вы создали проект с другим именем - не забудьте изменить в using namespase в Form1.cpp. Это единственный случай, где придется подредактировать, ну а кнопку, этикетку - руками.
Что касается сути, то как вариант - вполне. Не нравится - использование составного хидера. Нравится - не нужно отказываться от удобств дизайнера. В целом - +1 в моей коллекции.
Посмотрите в этом же форуме 2-мя постами ниже. "Идентификатор вне области видимости" от DartLenin. Предложенный мной вариант в этом посте - те же ритмы, те же движения, но бубен - в левой руке...
Спасибо. Жду Вашего идеального варианта с нетерпением.
0
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
04.02.2012, 15:52
нужно всего лишь создать событие в Form2
а в Form1 создать обработчик этого события.
А когда нужно что-то изменить в Form1 просто вызываем это событие из Form2
грубо говоря
C#
1
2
3
4
5
class Form2
{
private delegate void click();
public event click;
};
затем в Form1
C#
1
2
3
4
5
6
7
8
9
10
class Form1
{
private do()
{
Form2 f = new Form2();
f.click += changeForm1;
f.ShowDialog();
}
private void changeForm1() { /* some code*/}
};
а в каком нить методе Form2
C#
1
2
3
4
private void method
{
click(); // теперь в Form1 вызовется обработчик
}
0
1 / 1 / 0
Регистрация: 10.04.2010
Сообщений: 11
04.02.2012, 15:58  [ТС]
IGPIGP,
Это не новый файл, а cpp файл формы проекта, тоесть, если проект носит имя HelloWorld, то этот самый Form1.cpp называется HelloWorld.cpp. Автор не верно указал.
Не уверен в его идеальности, но мне он подходит полностью.

1. Создаём проект под именем Form1, вешаем на главную форму кнопку и лейбл, добавляем новую форму под именем Form2, вешаем на неё кнопку.

2. В разделе public файла Form1.h пишем свой метод, например:
C++
1
2
3
4
void Set(String^ text)
        {
            label1->Text = text;
        }
3. Далее, в файле Form1.h устанавливаем пустой обработчик кнопки:
C++
1
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e);
4. В заголовке Form2.h подключаем файл "Form1.h"
C++
1
2
#pragma once
#include "Form1.h"
5.В разделе public файла Form2.h пишем свой конструктор для формы
C++
1
2
3
4
5
Form2(Form1^ parent)
        {
            InitializeComponent();      
            parentForm = parent;
        }
6. в разделе private ставим указатель на главную форму
C++
1
2
private: 
Form1^ parentForm;
7. Открываем файл Form1.cpp, в заголовок дописываем подключение "Form2.h", "StdAfx.h" и "Form1.h" уже должны быть сами прописаны.
C++
1
2
3
#include "stdafx.h"
#include "Form1.h"
#include "Form2.h"
8. В этом же файле, после главной функции вставляем этот кусок, который будет обрабатывать событие кнопки из главной формы:
C++
1
2
3
4
5
6
7
namespace Form1 {
    System::Void Form1::button1_Click(System::Object^  sender, System::EventArgs^  e) {
        Form2^ f2 = gcnew Form2(this);
        f2->Show();
        this->Hide();
    }
}
Исходники прилогаются.
Вложения
Тип файла: rar Lastattemp.rar (691.6 Кб, 79 просмотров)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2012, 16:04
Цитата Сообщение от sandye51 Посмотреть сообщение
7
C#
1
2
3
4
5
6
7
8
9
8
9
10
class Form1
{
public do()
{
Form2 f = new Form2();
f.click += changeForm1;
идея по сути таже :
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
2
this->myChild=gcnew F2();
this->myChild->button1->Click+=gcnew System::EventHandler(this, &Form1::myChild_button1_Click);
1
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
04.02.2012, 16:09
IGPIGP, ну я твое сообщение не читал)
так события и нужны для связи объектов. И не надо никаких премудростей, все понятно и просто
1
1 / 1 / 0
Регистрация: 10.04.2010
Сообщений: 11
04.02.2012, 16:13  [ТС]
IGPIGP,
sandye51,
Да, я заметил что в C# попроще всё.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2012, 16:36
Цитата Сообщение от xCEZAREx Посмотреть сообщение
Это не новый файл, а cpp файл формы проекта, тоесть, если проект носит имя HelloWorld, то этот самый
Не согласен, если проект - Windows Forms Applicftion. В этом случае HelloWorld.cpp - файл функции Main(..,..){}, хотя, просматривая сэмплы от "детей Великого Вождя", убеждаюсь, что и туда можно, как это сделано в параллельном посте неподалёку. :
Цитата Сообщение от IGPIGP Посмотреть сообщение
"Идентификатор вне области видимости" от DartLenin.
A как сделать Form1.cpp я написал, не зная, что именно вызвало у Вас трудности, и именно для того, что бы можно было простым копированием получить абсолютную копию того, что предложено на MSDN
Материал Ваш посмотрю обязательно.

Добавлено через 10 минут
Цитата Сообщение от sandye51 Посмотреть сообщение
IGPIGP, ну я твое сообщение не читал)
так события и нужны для связи объектов. И не надо никаких премудростей, все понятно и просто
Дело в том, что вопрос интересен именно теоретически, т.к. выясняется ТС-ом для написания им курсового проекта (тема поста). Отсюда и дискуссия. А что не читал, - так я и сам такой

Добавлено через 5 минут
Цитата Сообщение от xCEZAREx Посмотреть сообщение
IGPIGP,
sandye51,
Да, я заметил что в C# попроще всё.
Ну, в общем, это только со стороны кажется - трудновато. А приблизишься, и поймешь, -
все казалось, ещё не так плохо (Жютка юмора, как говорят в Одессе).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2012, 16:36
Помогаю со студенческими работами здесь

Связка 2 форм
я сделал прогу "Библиотека",в главной форме у меня есть кнопка поиск,я ее жму и открывается 2-я форма для поиска,я там ввожу данные и...

Связка нескольких форм обратной связи
Каким образом будет корректно привязать несколько разных форм обратной связи к одному PHP-файлу? На конкретном примере -4.11 Картинки и...

Связка всех форм одной переменной
Доброго времени суток! Прежде всего хочу сказать, что новичек в C++, но не в пользовании интернетом. Поискал уже и так и сяк, видел много...

Связывание двух форм по расположению на мониторе(Синхронизация форм)
Такая проблема, представим если 2 формы, на первой форме есть клавиша "На вторую форму", которая будет иметь код: ...

Связка двух numericupdown
Здравствуйте. Как можно связать два нумерика чтобы при изменении значений в одном - динамически менялось значение во втором? И наоборот


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru