Вызов созданного ранее окна из формы другого окна
Пишу в связи с тем, что сделать надо быстро, а времени самостоятельно разбираться нет :(
Так вот вопрос в чем:
- создал я в Visual Studio 2008 проект С++ Windows Forms Application. С элементами более менее разобрался, разместил на форме как мне нужно.
Создал кнопку управления, и мне нужно повесить на нее процедуру OnClick, что я в принципе сделал двойным щелчком. И тут опа, меня выкинуло в заголовочный файл. Т.е. процедура windows forms создалась в коде самой формы. В общем, кто делал, меня надеюсь поймут.
Так вот, как мне оттуда вызвать ранее нарисованое окно диалога? (пока что разобрался как вызвать MessageBox::Show("");)
Буду очень признателен за помощь, и думаю не в последний раз я тут ошиваюсь с идиотскими вопросами. Не гоните пожалуйста ;)
PS: Можно послать ссылками на другие источники (msdn перечитал весь)
Windows forms и Visual C++ требования заказчика.
PPS: И еще, как определить тут, что одна форма parent а другие child?
Во-вторых, в обработчике OnClick пишем что-то вроде
form->ShowDialog(); // показываем
ShowDialog выведет форму в модальном режиме, а метод Show - в обычном.
И еще, на засыпку: gcnew создает экземпляр формы как я понял, а что мне использовать ,если нужно создатьэкземпляр как дочернее окно в родительском?
Мне нужно создать программу со множеством окон, причём в процессе работы программы окна обмениваются информацией друг с другом. Если взять код, приведённый ниже, то получается, что пользоваться свойствами формы forma можно только внутри функции, внутри которой объявлена forma.
forma->Show(); // показываем
Мне же требуется, чтобы свойства forma были доступны и из других функций, в том числе из функций, записанных в других формах. Я вижу выход в том, чтобы в Form2.h объявить форму forma, и в дальнейшем к ней обращаться из других форм после #include "Form2.h", но все попытки сделать это у меня заканчивались ошибками. Помогите, пожалуйста бывшему пользователю C++ Builder...нелегко даётся переход на Visual C++ :)
Никакого кода не прошу, просьба дать хотя бы наводку, как это можно сделать...
Хорошо бы привести возникающие ошибки, иначе вам не смогут дать совет.
Догадываюсь, что ошибки возникают из-за перекрёстных инклюдов. Нечто подобное обсуждалось здесь.
Мой вам совет: переходите с MC++ на C# - в этом языке подобных проблем не возникает, компилятор сам разруливает ситуацию :). Время, потраченное на въезд в новый язык окупится моментально.
Попробую лишь провести аналогию с Borland, а вдруг кто сильный в обоих языках поймёт и подскажет...
В Borland C++ при создании формы компилятором создаётся как класс TForm, так и public объект Form. Чтобы открыть форму из другого файла, даже не требуется создавать объект класса TForm - просто делаем include Form.h и выполняем Form->Show(). В Visual C++, как я понял, при создании формы Form создаётся только класс Form без объекта. Поэтому у меня и встал вопрос: как объявить public-объект класса Form? Возможно ли такое вообще в данном компиляторе? Я пробовал объявлять обычные переменные вне функций (int, к примеру) - получается, а если форму объявляю, имею вот что:
Если писать 'Form2 forma", получаю "missing type specifier - int assumed. Note: C++ does not support default-int"
Если, как в обычной функции, пишу "Form2^forma", получаю еще ошибку "global or static variable may not have managed type 'System::Int32 ^' ".
Плюс везде требует точку с запятой перед "forma"
Что я могу делать неправильно?
P.S. Да, форум я читал. Находил только темы, где обсуждается взаимодействие между материнской и дочерней формой. Мне же нужно, к примеру, чтобы первая форма могла обращаться ко второй, если вторая форма создаётся третьей.
Если писать 'Form2 forma", получаю "missing type specifier - int assumed. Note: C++ does not support default-int"
Скорее всего ошибка вызвана тем, что в месте, где вы пытаетесь объявить forma, тип Form2 еще неизвестен.
P.S. не стоит называть переменные по-русски. :)
Это эпический феил борланда создавать глобальные переменные для форм (что в делфи, что в билдере). Разве вы не в курсе, что это очень, очень плохо? В Managed C++ глобальные переменные управляемых типов вообще создавать нельзя, потому что CTS этого не позволяет.
Если вы хотите, что бы одна форма взаимодействовала с другой (вообще-то это также чрезвычайно дурной тон), то нужно передать им ссылки друг на друга, например, через конструктор или публичное свойство.
Я так ни в коем случае не делаю, просто это первое имя формы, пришедшее мне в голову на момент написания примера :D
Эх, просто мне формы как public-доступные объекты кзались очень удобной вещью в Борланде, и я к ним привык. То, что это плохо - хм...никогда такого не слышал и проблем с этим не испытывал. Но как зелёный новичок в visual C++, я вынужден Вам поверить :)