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

Передать данные из 1 формы в другую

25.01.2012, 17:48. Показов 6520. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Да, знаю, избитый вопрос. Я прочитал эту тему, решил сделать 5 способом (использовать свойство "родитель"), однако возникла проблема с переписыванием шарпного кода на c++/CLI. Я написал так:
Form1.h
C++
1
2
3
4
5
6
7
...
private: System::Void beginButton_Click(System::Object^  sender, System::EventArgs^  e) 
    {
        Test^ test=gcnew Test();
        test->Owner=this;
        test->ShowDialog();
    }
Test.h
C++
1
2
3
4
private: System::Void Test_Load(System::Object^  sender, System::EventArgs^  e) 
        {
            Form1^ form1=this->Owner as Form1;
        }
Вот что получил:
error C2065: Form1: необъявленный идентификатор
error C2065: form1: необъявленный идентификатор
error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "as"
error C2065: as: необъявленный идентификатор
error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "Form1"
Вобщем, студия понимать эту строку категорически отказалась, а когда попробовать написать
#include "Form1.h"
То студия начала ругаться на Test^ test=gcnew Test();
Ошибка 1 error C2065: Test: необъявленный идентификатор
Ошибка 2 error C2065: test: необъявленный идентификатор
Ошибка 3 error C2061: синтаксическая ошибка: идентификатор "Test"
Ну и так далее, остальные 15 ошибок.

Теперь 2 проблема. Когда пытаюсь подключить хедер с классом который должен использоваться в этой форме получаю:
Ошибка 1 error C2011: MyClass: переопределение типа "class"
Ошибка 2 error C2011: MyClass1: переопределение типа "class"
Ошибка 3 error C2027: использование неопределенного типа "MyClass1"
Классы объявлены как:
C++
1
2
3
4
ref class MyClass
{
...
};
C++
1
2
3
4
ref class MyClass1
{
...
};
Вобщем в ответ на любой инклуд получаю милион ошибок, но как же мне тогда использовать мои классы и передавать данные между формами?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.01.2012, 17:48
Ответы с готовыми решениями:

Передать данные с одной формы на другую
вопрос..есть 2 формы. на одной в текстбокс выводиться инфа. как сделать так, чтобы при запуске новой формы записи с текстбоксов на 1 форме...

Передать данные RichTextBox с одной формы в другую
Есть две формы, MyForm и SaveDialog, в MyForm находиться richtextbox, в SaveDialog кнопки - Yes, No как передать то что находиться в...

Как передать данные из одной формы в другую
Проблема со следующим примером из этой темы: Form1 main = this.Owner as Form1; if(main != null) { string s =...

7
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
25.01.2012, 18:28
DartLenin, у C++ и C# синтаксис отличается. Например в C++ отсутствует оператор as.
В C++ нужно прописывать инклюды для подключения других файлов. Только насколько я понимаю, вам нужно из Form1 вызвать Test. Тогда в файле Form1.h вам нужно прописать
C++
1
#include "Test.h"
Но в Test у вас следующую строку прописать всё-равно не получиться
C++
1
Form1^ form1=this->Owner as Form1;
потому что в файле Test.h вам надо знать класс Form1 и если вы напишите
C++
1
#include "Form1.h"
то получите рекурсивное подключение файлов - и программа не скомпилируется.
Но если вам нужно использовать одну и туже переменную в двух формах одновременно, то передавайте указатель на неё через конструктор.

С проблемой №2 я не понял. Видимо вы слишком балуетесь с инклюдами.
1
36 / 36 / 0
Регистрация: 24.05.2009
Сообщений: 178
25.01.2012, 22:17  [ТС]
Со 2 проблемой разобрался, у меня просто в form1.h включался test.h и header.h и я пытался в test.h еще раз включить header.h. Убрал инклуд header.h из form1.h и заработало. По поводу передачи, я понимаю что различаются, но я не знал как переделать в синтаксис C++/CLI и поэтому оставил в синтаксисе С#. Мне просто было интересно реализовать именно тот способ (через owner) средствами C++/CLI. Но если аналогов этой конструкции в C++/CLI нет, то попробую другие способы.
0
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
25.01.2012, 22:34
DartLenin, в качестве альтернативы оператору as в C# в C++/CLI можно пользоваться оператором dynamic_cast, он точно так же, как и as, попытается привести выражение к требуемому типу, а в случае неудачи вернёт nullptr.

C++
1
Form1 ^ form1 = dynamic_cast<Form1 ^>(this->Owner);
0
36 / 36 / 0
Регистрация: 24.05.2009
Сообщений: 178
25.01.2012, 22:55  [ТС]
Пишет:
error C2680: Form1 ^: недопустимый целевой тип для dynamic_cast
0
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
25.01.2012, 23:59
DartLenin, небольшой минимально работающий пример на эту тему:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#using <mscorlib.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
 
using namespace System;
using namespace System::Windows::Forms;
 
public ref class MainForm : Form
    {
    Button ^ button;
 
public:
    MainForm();
 
    void button_Click(Object ^ sender, EventArgs ^ e);
    };
 
public ref struct DialogForm : Form
    {
    DialogForm()
        {
        this->Load += gcnew EventHandler(this, &DialogForm::Form2_Load);
        }
 
    void Form2_Load(Object ^ sender, EventArgs ^ e)
        {
        MainForm ^ mainForm = dynamic_cast<MainForm ^>(this->Owner);
        }
    };
 
 
MainForm::MainForm()
    {
    button = gcnew Button;
 
    button->Click += gcnew EventHandler(this, &MainForm::button_Click);
 
    Controls->Add(button);
    }
 
void MainForm::button_Click(Object ^ sender, EventArgs ^ e)
    {
    DialogForm ^ form = gcnew DialogForm();
    form->Owner = this;
    form->ShowDialog();
    }
 
int main(array<System::String ^> ^ args)
    {
    Application::Run(gcnew MainForm);
    }
Проблема заключается в том, что, скорее всего, на тот момент, когда компилятор видит строчку
C++
1
Form1 ^ form1 = dynamic_cast<Form1 ^>(this->Owner);
Он ещё не знает о том, что Form1 — это тип, который наследуется от System::Windows::Forms::Form, а потому говорит о том, что такое преобразование невозможно в принципе. Проблема решается предварительным объявлением класса Form1 в каком-нибудь заголовке Form1.h, включение его в файле, где находится код для Form2, а в Form1.cpp вынести реализацию всех методов класса Form1.

Если разносить это всё по разным файлам .h/.cpp, то получится приблизительно так:

MainForm.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef __MAINFORM_H__
#define __MAINFORM_H__
 
#using <mscorlib.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
 
public ref class MainForm : System::Windows::Forms::Form
    {
    System::Windows::Forms::Button ^ button;
 
public:
    MainForm();
 
    void button_Click(System::Object ^ sender, System::EventArgs ^ e);
    };
 
#endif
DialogForm.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef __DIALOGFORM_H__
#define __DIALOGFORM_H__
 
#using <mscorlib.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
 
public ref struct DialogForm : System::Windows::Forms::Form
    {
    DialogForm();
 
    void Form2_Load(System::Object ^ sender, System::EventArgs ^ e);
    };
 
#endif
MainForm.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "MainForm.h"
#include "DialogForm.h"
 
MainForm::MainForm()
    {
    button = gcnew System::Windows::Forms::Button;
 
    button->Click += gcnew System::EventHandler(this, &MainForm::button_Click);
 
    Controls->Add(button);
    }
 
void MainForm::button_Click(Object ^ sender, System::EventArgs ^ e)
    {
    DialogForm ^ form = gcnew DialogForm();
    form->Owner = this;
    form->ShowDialog();
    }
DialogForm.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "MainForm.h"
#include "DialogForm.h"
 
DialogForm::DialogForm()
    {
    this->Load += gcnew System::EventHandler(this, &DialogForm::Form2_Load);
    }
 
void DialogForm::Form2_Load(System::Object ^ sender, System::EventArgs ^ e)
    {
    MainForm ^ mainForm = dynamic_cast<MainForm ^>(this->Owner);
    }
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
#using <mscorlib.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
 
#include "MainForm.h"
 
int main(array<System::String ^> ^ args)
    {
    System::Windows::Forms::Application::Run(gcnew MainForm);
    }
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.01.2012, 00:30
Посмотрите пост от Casper-SC от 17.12.2011, 14:13.

Цитата Сообщение от Ma3a Посмотреть сообщение
Он ещё не знает о том, что Form1 — это тип, который
Знает, но передать указатель на Owner - пол дела. Это позволяет получить доступ к заголовку
Owner->Text
Но, видимо, не имея инфы о структуре экземпляра адресовать другие его члены не удается.
Посмотрите пост от Casper-SC от 17.12.2011, 14:13.
0
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
26.01.2012, 00:37
IGPIGP, ошибка "error C2680: Form1 ^: недопустимый целевой тип для dynamic_cast" может возникать, когда тип, в который ведётся преобразование ещё не определён, иными словами, когда есть нечто вроде объявления, но без определения внутренностей
C++
1
ref class Form1;
ошибка С2680, видимо здесь как раз такой случай, потому что если дано предварительное определение класса, всё компилируется без проблем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2012, 00:37
Помогаю со студенческими работами здесь

Как из одной формы передать данные в другую?
Всем привет! Нужна помощь! Ситуация такая, внутри одной программы, есть две формы Form1 и Form2. На Form1 расположены button1 и textBox1....

Передать fileName из одной формы в другую
Добрый день. Программирую на с++ с помощью Windows Forms. Столкнулся с такой проблемой: Из главной формы открываю OpenFileDialog, выбираю...

Как передать в метод формы данные из другой формы?
Народ, подскажите юзеру: создал на Visual C++ 2005 с помощью designer'а Form1 с единственной кнопкой на ней. Вызываю по нажатию этой...

Передать данные из первой формы во вторую
люди, я новачок.:cry: Форми умею создавать откривать другую форму с помощю клика тож умею. Нужно передать данные из первой форми во...

Передать данные с одной формы в другую
Есть две формы нужно чтоб при нажатии кнопки в другой форме изменилось название label1. Но в первой форме пишет Элемент &quot;label1&quot;...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru