Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2009, 14:08   #1
Ambroyz
 
Регистрация: 12.04.2009
Сообщений: 4
Вопрос 2 Класса

Тип проекта CLR
Коротко опишу суть проблемы, заранее прошу не посылать в гуглы и тп ибо рою второй день ничего по теме не нашел(хотя мб не умею искать):
Допустим есть 2 класса наследующих класс формы: Form1 и Form2
По некоторому событию в 1й форме происходит создание и открытие второй формы:
Form2 ^frm2=gcnew Form2;
frm2->Show();
Все ок, ибо формы 1 включена в проект после инклуда 2й формы, т.е. тип Form2 видим.
Теперь мне нужно из формы2 вызвать любую функцию из формы1. Тут начинаются проблемы, так как чтобы что-то вызывать у экземпляра формы1 нужно чтобы 2я форма получила указатель на этот экземпляр, передать указатель не проблема, проблема в том что форма 2 не видит такого типа как Form1, т.е. работа с указателем не возможна. Как быть в данной ситуации?
банальный пример применения: в основном окне открываем доп форму, вбиваем там данные и по кнопке ОК возвращаем их в 1ю форму.
Подскажите пожалуйста где я ошибаюсь и варианты реализации вызова функции
Заранее спасибо
Ambroyz вне форума Ответить с цитированием
Старый 12.04.2009, 17:21   #2
neomichi
Пользователь
 
Регистрация: 26.03.2009
Сообщений: 43
По умолчанию

ну как я понял нужно лишь у форм 2 подправить конструктор , т.е. включить туда параметр form , и сделать поле в классе форм2 - форм2
и потом просто присоздании экземпляра форм2 укажешь (this) поидее так, если я правильно понял

вообще как бы это было на С#
Код:
form1

 private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2(this);
            form2.Show();
        }



form 2

 private Form form1;
        public Form2(Form parent)
        {
            InitializeComponent();
            form1 = parent;
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            form1.Text = "!!!";
        }
neomichi вне форума Ответить с цитированием
Старый 14.04.2009, 09:09   #3
Ambroyz
 
Регистрация: 12.04.2009
Сообщений: 4
По умолчанию

да, правильно, только проблема в том что у форм1 компиль не видит функций класса форм1, а только базового класса форм, проблема именно в вызове из формы1 нестандартных(не пронаследованных) функций и свойств
Ambroyz вне форума Ответить с цитированием
Старый 14.04.2009, 13:41   #4
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

form 2

Код:
 private Form1 form1;
        public Form2(Form1 parent)
        {
            InitializeComponent();
            form1 = parent;
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            form1.Text = "!!!";
        }
Hollander вне форума Ответить с цитированием
Старый 14.04.2009, 20:59   #5
Ambroyz
 
Регистрация: 12.04.2009
Сообщений: 4
По умолчанию

Как я говорил тип проекта ЦЛР, т.е. там каждая форма отдельный класс в отдельном файлике. в stdafx прописаны инклуды этих файликов
если у нас идет
#include "Form2.h"
#include "Form1.h"
то как видно форма 1 описана после и форма 2 не в курсе что есть такой класс как form1, если же написать наоборот, форм 1 не сможет создавать форм 2...
Ambroyz вне форума Ответить с цитированием
Старый 14.04.2009, 22:19   #6
neomichi
Пользователь
 
Регистрация: 26.03.2009
Сообщений: 43
По умолчанию

ну просто тут шарп художники)) выкладывай весь солюшен че нить придумаем :D
neomichi вне форума Ответить с цитированием
Старый 15.04.2009, 17:43   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Да вы подключайте хедеры в Form1.h и в Form2.h необязательно все подключать через stdafx.h
MaTBeu вне форума Ответить с цитированием
Старый 15.04.2009, 21:55   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Так все равно получается циклическая ссылка.
Вот если определение функции вручную вынести в .cpp, то можно использовать класс Form1 из Form2 и наоборот:

Код:
#include "StdAfx.h"
#include "Form2.h"
#include "Form1.h"

namespace testApp // То-же пространство, что и у класса
{
	System::Void Form2::button1_Click(System::Object^  sender, System::EventArgs^  e)
	{
		Form1^ f1 = gcnew Form1();
		f1->Show();
	}

}
В C# с этим проблем нет. Типы в одном пространстве имен могут ссылаться друг на друга. В C++, как я понимаю, проблема в единицах трансляции.

Вопрос знатокам C++.
Насколько корректно такое решение ?
Почему в проектах CLR студия и объявление и определение метода помещает в заголовочные файлы ? Это как то связано с особенностями NET ?
alexBlack вне форума Ответить с цитированием
Старый 30.04.2009, 10:49   #9
diomercury
 
Регистрация: 30.04.2009
Сообщений: 7
По умолчанию

Скорее, особенности C++.NET ... :-/

А если честно, то MaTBeu прав: подключайте хэдеры не в stdafx, а в каждой форме отдельно. Причём только те, которые нужны.
[Nosce te ipsum]
diomercury вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылка класса. Scratch Общие вопросы C/C++ 21 01.10.2008 16:21
Создание класса Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 31.05.2008 11:54
Создание класса Stanislav Общие вопросы Delphi 8 15.05.2008 23:34
создание класса Siren Помощь студентам 1 07.05.2008 19:19
Создания Класса Mickle Общие вопросы Delphi 1 30.04.2007 00:44