Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
3 / 3 / 0
Регистрация: 11.09.2011
Сообщений: 80
1

Вызов из одной формы другую.

21.10.2011, 23:24. Просмотров 2365. Ответов 4
Метки нет (Все метки)

Всем привет не подскажите как вызвать из Form1 Form2, точнее из Form1 получается вызывать Form2, а когда прописываешь , чтобы из Form2 вызывался Form1 , все процедуры описанные для вызова Form2 из Form1 компилятор воспринимает как ошибка, подскажите как быть?????
C++
1
2
3
4
5
6
7
8
         // это вызов из Form1 Form2
         form2^ GForm2 = gcnew form2;
         GForm2->Show();
 
         // это вызов из Form2 Form1
        this->Hide();
    Form1^ owner=(Form1^)this->Owner;
    owner->Show();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2011, 23:24
Ответы с готовыми решениями:

Переход с одной формы на другую
помогите пожалуйста! не могу разобраться! перехожу из 1-й формы на 2-ю, со 2-й на 3-ю, с 3-й на...

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

Передача данных из одной формы в другую
Добрый день возникла довольно простая но глупая ситуация над которой бьюсь уже 2 часа: Есть две...

Передача данных из одной формы в другую
В Form1 у меня глобально объявлены следующие переменные: int VremyaPC,Vozrast; int...

4
195 / 13 / 4
Регистрация: 26.04.2011
Сообщений: 129
05.12.2011, 12:25 2
Та же проблема..( Все перерыл, гугл, иностр. форумы, msdn, на cyberforum тем 10, везде помощи просил.. такое чувство что это запредельное действие для CLI. Никто либо не знает, либо те кто знают - туда не заходят.. Осталось только в умных книгах искать( Отпишитесь сюда, если найдете способ. Обещаю сделать то же самое)
0
2 / 2 / 0
Регистрация: 25.01.2012
Сообщений: 139
29.01.2012, 17:24 3
я буду третий, кто подключится к вашим поискам, тоже гугл ничего не ответил толкового так как он говорит получаю ошибки различного рода..
0
Эксперт С++
621 / 465 / 57
Регистрация: 28.01.2011
Сообщений: 605
29.01.2012, 18:43 4
Вполне возможно, проблемы возникают из-за того, что на момент использования одной из форм, заголовочный файл от одной формы подключён, а на момент использования другой — нет, следовательно одна из форм о другой ничего не знает. Либо же проблема может быть в том, что получается такая ситуация, когда имеем файлы в таком стиле
C++
1
2
3
4
5
6
7
8
9
// Form1.h
// bla-bla
 
#include "Form2.h"
 
public ref struct Form1 : Form
    {
    // здесь код, который использует Form2
    };
C++
1
2
3
4
5
6
7
8
9
// Form2.h
// bla-bla
 
#include "Form1.h"
 
public ref struct Form2 : Form
    {
    // здесь код, который использует Form1
    };
При таком подходе получается, что при препроцессинге Form1.h начинается раскрытие строчки #include "Form2.h", а из Form2.h подключается Form1.h и так далее, аналогично получается и если начинает сначала препроцессироваться Form2.h — получаем циклическую зависимость включений заголовочных файлов, то есть процесс подключения зацикливается и на каком то моменте обрывается с ошибкой компиляции. Впрочем, этого можно избежать добавлением "стражей включения" (include guards), если в каждом файле прописать нечто вроде
C++
1
2
3
4
5
// Form1.h
#ifndef __FORM1_H__
#define __FORM1_H__
// здесь то, что и было
#endif
C++
1
2
3
4
5
// Form2.h
#ifndef __FORM2_H__
#define __FORM2_H__
// то, что было раньше
#endif
либо же просто в начале каждого файла поставить директиву #pragma once, это будет то же самое.

Но даже если озаботиться исключением случая повторного подключения заголовочных файлов, получится примерно следующее: при препроцессинге (например) файла Form1.h, будет замечена директива #include "Form2.h", будет вставлено содержимое файла Form2.h, а тот #include "Form1.h", что был в Form2.h уже не сделает ничего нового, потому как есть страж включения, итого имеем примерно следующую картину после препроцессинга (если схематично):

C++
1
2
3
4
5
6
7
8
9
10
11
public ref struct Form2 : Form
    {
    // здесь код, использующий Form1
    };
 
// ...
 
public ref struct Form1 : Form
    {
    // здесь код, использующий Form2
    };
Понятное дело, что Form1 сможет обратиться к Form2, потому как Form2 объявлен раньше, чем Form1, но с Form2 такого не получается, он ещё ничего не знает о Form1, потому как не видел даже предварительного объявления класса Form1 и не знает даже что такой тип вообще существует.

Похожий сценарий будет, если мы в файле Form2.h поставим предварительное объявление класса Form1
C++
1
2
// в файле Form2.h
ref struct Form1;
В таком случае получается так, что у Form2 есть предварительное объявление класса Form1, но тем не менее такой вариант не скомпилируется, потому что это всего лишь указание того, что в будущем тип с именем Form1 будет где-то описан, а на данный момент этот тип ещё не определён, а следовательно мы не можем обращаться к членам класса Form1, потому как неизвестно, что в нём вообще есть, ибо определения внутренностей ещё не было дано, в том числе нам неизвестно и то, что Form1 наследуется от класса System::Windows::Forms::Form.

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

Итого, выглядеть это будет примерно так, если попробовать составить минимальный пример:
Form1.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef __FORM1_HPP__
#define __FORM1_HPP__
 
#using <System.Windows.Forms.dll>
#using <System.dll>
 
public ref class Form1 : System::Windows::Forms::Form
    {
    System::Windows::Forms::Button ^ button;
 
    void openForm2(System::Object ^ sender, System::EventArgs ^ e);
 
public:
 
    Form1();
    };
 
#endif
Form2.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef __FORM2_HPP__
#define __FORM2_HPP__
 
#using <System.Windows.Forms.dll>
#using <System.dll>
 
public ref class Form2 : System::Windows::Forms::Form
    {
    System::Windows::Forms::Button ^ button;
 
    void openForm1(System::Object ^ sender, System::EventArgs ^ e);
 
public:
 
    Form2();
    };
 
#endif
Form1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "Form1.hpp"
#include "Form2.hpp"
 
Form1::Form1()
    {
    button = gcnew System::Windows::Forms::Button;
 
    button->Click += gcnew System::EventHandler(this, &Form1::openForm2);
 
    Controls->Add(button);
    }
 
void Form1::openForm2(System::Object ^ sender, System::EventArgs ^ e)
    {
    Form2 ^ form2 = gcnew Form2();
    form2->Owner = this;
    form2->Show();
    }
Form2.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "Form1.hpp"
#include "Form2.hpp"
 
Form2::Form2()
    {
    button = gcnew System::Windows::Forms::Button;
 
    button->Click += gcnew System::EventHandler(this, &Form2::openForm1);
 
    Controls->Add(button);
    }
 
void Form2::openForm1(System::Object ^ sender, System::EventArgs ^ e)
    {
    this->Hide();
 
    Form1 ^ owner = (Form1 ^)this->Owner;
 
    Owner->Show();
    }
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 "Form1.hpp"
 
int main(array<System::String ^> ^ args)
    {
    System::Windows::Forms::Application::Run(gcnew Form1);
    }

Короче говоря, чтобы не возникало проблем когда одна форма должна вызывать другую, а та, в свою очередь, первую, то нужно просто аккуратно разнести оба определения классов на файлы описания(.h), где будут описаны все поля и сигнатуры методов, что есть в классе, и реализации(.cpp), где будут определяться внутренности методов, описанных в .h файлах. И не забывать о стражах включения.
В C# вот есть концепция partial классов, которая используется для того, чтобы была возможность разносить определение класса на несколько файлов исходного кода, в C++/CLI partial классов нет, зато есть возможность разбивать реализацию и описание методов класса ещё от обычного C++, это решает проблему.
0
Комп_Оратор)
Эксперт по математике/физике
8157 / 4048 / 558
Регистрация: 04.12.2011
Сообщений: 11,909
Записей в блоге: 11
29.01.2012, 22:53 5
Написано об этом много.
Из Form1 видно Form2 как на ладони, а на оборот нет... Даже передав в Form2 указатель на Form1 - самым простым способом Show(this) во второй форме доступен только заголовок Form1, неверите - попробуйте в Form2 в кнопке написать
C++
1
 this->Owner->Text="Hru!";
Нажмите кнопку! - Нравится?
Остальные поля формы Form1 адресовать через на Form1 (Owner) таким образом не выходит.
Если вдуматься это правильно. Forma1 создала Form2 пусть сама и беспокоится о получении информации (варианатов много вплоть до опроса по времени т.е. самодельного "цикла сообщений").
Что можно сделать легко?
А. Меняйте текст в Form1 "сигнал типа уже мне надо", а Form1 по textchenged и каким то переменным в дочерних формах сама решает - "кто ее позвал" и считает из нее нужную инфу.
Б. Вариант совсем бандитский...
Объявите в Form2 скажем TextBox^ posilochka (public!)
В Form1 какй-то public: textBox11
После запуска Form2 child1 в Form1 напишите:
this->child->posilochka=this->textBox11;
теперь все что пишется в posilochka в Form2 попадает Form1.
Сделать то можно, но легко (или трудно?) представить, что может быть, если форм много и и все они передали прямые адреса своих членов друг другу. Мигание ягнят? Нет Спилбергу такое и не снилось
Ладно, иногда, для двух форм и простой задачи это вариант...

p.s. Не пытайтесь вставить Form1.h в Form2.h ....
Вообще идеально все хидеры вставить в cpp (prjName.cpp) и туда же определения всех ф-ций и в т.ч. обработчиков (в формах - объявления типа- button1_click(...,...) и все) тогда можно и подругому.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2012, 22:53

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Передача DataGridView из одной формы в другую
Как можно и можно ли вообще передать dataGridView из одной формы в другую? Вообще,необходимо, что...

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

Передача данных из одной формы в другую
Имеется 2 формы Form4 и Form5 Form5 вызывается из Form4 при нажатии кнопки В Form5 есть...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.