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

Необъявленный идентификатор типа формы, а так же задача по обмену данными между формами

12.01.2019, 21:52. Показов 1409. Ответов 4

Author24 — интернет-сервис помощи студентам
Добрый день. Стоит задача разработки приложения на С++ с CLI Windows Forms, т.е. на формах. Делается это все в MS VS17.
Шаблон проекта CLI Windows Forms создавался по урокам на Ютубе, где показывают, как создать проект с формами на С++, т.к. в VS17 шаблон давно убрали.
Формы были успешно созданы, размещены объекты управления. Далее мне нужно будет создать несколько пользовательских классов, к переменным которых я должен иметь возможность обращаться из любой формы. Но на данном этапе я не могу даже просто передать значение из одного формы в другую.
Ранее в VS2010 использовал грубый метод с Extern, но сейчас от его использования должен отказаться, нужно что-то нормальное, что не будет нарушать правила ООП и т.д.
К сожалению, я еще достаточно слаб в программировании, поэтому гугление способов передачи данных между формами не принесли особого результата, т.к. часто народ приводит сразу код и небольшим объяснением и я попросту многого не понимаю в приведенных листингах, обычно достаточно громоздко, не получается уловить суть.
Пробовал делать нужные объекты на форме Паблик и в текстовом редакторе обращаться получалось, но сборка не проходила, т.к. выбивало ошибку Необъявленный идентификатор. Потом нашел еще способ обмена с помощью иерархии форм, родительская и дочерние. В текстовом редакторе без подчеркиваний указать и определить родителя удалось, а вот при сборке опять Необъявленный идентификатор.
Всю кучу кода приводить не буду, т.к. 80% там это авто-создание классов форм и описание свойств объектов на форме.

Привожу основные части кода.
GeneralForm.h(главная форма)
Кликните здесь для просмотра всего текста

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
#include "CreateGame.h"
 
...
 
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    CreateGame ^form2 = gcnew CreateGame();
    form2->Owner = this;
    this->Hide();
    form2->ShowDialog();
    this->Show();
}


GeneralForm.cpp(главная форма)
Кликните здесь для просмотра всего текста
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
#include "GeneralForm.h"
using namespace System;
 
[STAThreadAttribute]
 
int main()
{
    Windows::Forms::Application::EnableVisualStyles();
    Windows::Forms::Application::Run(gcnew KVK::GeneralForm());
    return 0;
}


CreateGame.h(вторая (дочерняя) форма)
Кликните здесь для просмотра всего текста

C++ Скопировано
1
2
3
4
5
6
7
8
#pragma once
 
...
 
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    GeneralForm ^form1 = dynamic_cast <GeneralForm^> (this->Owner);
    form1->textBox1->Text = textBox1->Text;
}


CreateGame.срр(вторая (дочерняя) форма)
Кликните здесь для просмотра всего текста

C++ Скопировано
1
2
3
#include "stdafx.h"
#include "CreateGame.h"
#include "GeneralForm.h"


По итогу, код не подчеркивается, но при сборке вот это:
Кликните здесь для просмотра всего текста
Необъявленный идентификатор типа формы, а так же задача по обмену данными между формами
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2019, 21:52
Ответы с готовыми решениями:

Необъявленный идентификатор у формы
Работаю в Visual studio 2012. В начале файла Form1.h есть оператор #include &quot;Settings.h&quot; Место ошибки: private: System::Void...

Необъявленный идентификатор при создании формы
Не могу вывести форму в VS2012. Создаю две формы (одна автоматом создаётся, form1, другую сам, MyForm). При написании кода ничего не...

Обмен данными между формами
Знаю, что тема ворошилась не один раз, но проблемма такая: (если уже где-то обсуждалась, пжл тыкните, ибо именно такого я не нашёл :( ) ...

4
0 / 0 / 1
Регистрация: 14.04.2015
Сообщений: 72
12.01.2019, 22:43  [ТС]
Вроде как вычитал, что один из выходов - реализация не в заголовочном, а в срр файле. Но перенеся туда обработчик столкнулся с тем, что не имею ссылку на объект класса формы. Не работает this и не видит объект textBox1.

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
#include "stdafx.h"
#include "CreateGame.h"
#include "GeneralForm.h"
 
using namespace KVK;
 
System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    GeneralForm^ form1 = dynamic_cast <GeneralForm^> (this->Owner);
    form1->textBox1->Text = textBox1->Text;
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.01.2019, 00:01
ranko5445, для начала посмотрите вот эти ссылки:
Как сделать так, чтобы разные файлы могли видеть друг друга?
Ошибки при вызове форм - Syntax error
Как добавить кнопки на вторую форму?
Как открыть вторую форму?
1
0 / 0 / 1
Регистрация: 14.04.2015
Сообщений: 72
13.01.2019, 00:13  [ТС]
IGPIGP, спасибо за то, что уделили время теме, но почти все указанные ссылки я читал, а одна из них как раз привела меня к Вам. Я сделал подключение форм, как было указано в темах, так же у меня частично работал вызов второй формы из первой при реализации в заголовочном файле. Но не работают реализации в заголовочном файле второй формы, когда обращаюсь к первой. Я думаю выход из ситуации - перенести реализации в срр файлы форм, но у меня проблема, что нет ссылки на форму, т.е. this и прочее не работает за пределами заголовочного файла, хотя в Вашем примере по одной из ссылок вы именно использовали this в срр файле формы и видимо у Вас почему-то это работает. Прикрепил файлы.
Вложения
Тип файла: rar KVK.rar (4.0 Кб, 0 просмотров)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.01.2019, 01:01
Цитата Сообщение от ranko5445 Посмотреть сообщение
IGPIGP, спасибо за то, что уделили время теме, но почти все указанные ссылки я читал, а одна из них как раз привела меня к Вам. Я сделал подключение форм, как было указано в темах, так же у меня частично работал вызов второй формы из первой при реализации в заголовочном файле. Но не работают реализации в заголовочном файле второй формы, когда обращаюсь к первой. Я думаю выход из ситуации - перенести реализации в срр файлы форм, но у меня проблема, что нет ссылки на форму, т.е. this и прочее. Прикрепил файлы.
ranko5445, создание и взаимодействие двух объектов - system::windows::forms::form можно провести очень большим количеством вариантов и, это зависит от Вашей задачи. Например для организации простого диалога DialogBox есть специальный класс:
https://social.msdn.microsoft.... =vcgeneral
Если объекты нужны с доступом из разных событий то, нужно бы определять их ссылки на уровне полей формы, а не локально в событии (делегате button_click например).
Ну посмотрите идею асимметричного включения. Нельзя включить объекты симметрично (каждый в h-фал каждого). Тот кто содержит заголовочник в своём заголовочнике - получает доступ к интерфейсу включаемого объекта, а тот в свою очередь может включить своего визави только в реализацию - свой cpp-файл. То есть, возможности общения у данных объектов реализуются асимметрично, тоже. Например, тот объект, который имеет h-файл партнёра в своём заголовке, видит его код и может запустить его публичный метод вызванный по ссылке на данную форму. А ссылку он может сделать полем (и принять её в своём конструкторе, например) так как видит h фал этой формы. Это позволит обращаться к данной ссылке из любого метода.
ranko5445, я когда начинал окна связывать, ссылок на готовые решения в сети вообще было не найти. А положение усугублялось тем, что я ООП вообще не знал. Было весело. Но уверяю, при достаточном терпении, всё получится. Хотя почитать про шаблоны и наследование нужно бы параллельно.
Как вариант - возьмите какой-то пример и скомпилируйте. Посмотрите как он работает.
И вот ещё что. Точка входа (main) должна бы располагаться в своём файле. А cpp-шники форм - отдельно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.01.2019, 01:01
Помогаю со студенческими работами здесь

Обмен данными между формами
форма родитель имеет кнопку, при нажатии на которую создаётся ребёнок. у ребёнка есть picturebox и textbox. родитель передаёт ссылку на...

Обмен данными между формами
Здравствуйте! Пишу в VS 2012. Есть две формы, по выборе чекбокса открывается вторая форма. Во второй форме в ричтекстбоксе код выполняемой...

Обмен данными между формами
Работаю в Visual Studio 2008, приложение Windows Forms. Есть две формы (Form1 и Form2). На Form2 есть элемент listBox1. При каком-либо...

Обмен данными между формами
Добрый вечер. Пишу небольшое приложение средствами PyQt, хотел посоветоваться, как лучше осуществлять обмен данными между формами. Каждой...

Обмен данными между формами
Есть две формы, как организовать что бы из form2.edit1 данные переместились в переменную a из form1?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 02.04.2025
Из ответов LM модели. Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер