1 / 1 / 0
Регистрация: 10.04.2010
Сообщений: 11

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

03.02.2012, 02:24. Показов 5598. Ответов 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
9006 / 4707 / 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
9006 / 4707 / 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
9006 / 4707 / 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
9006 / 4707 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru