Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов созданного ранее окна из формы другого окна

19K
08 ноября 2009 года
WantToProg
63 / / 19.01.2009
Простите заранее за такую формулировку вопроса, но в данный момент приходится переучиваться на С++ после 1С. Необходимо разработать одну программку, но уже третий день читаю msdn но еще мало что понимаю.
Пишу в связи с тем, что сделать надо быстро, а времени самостоятельно разбираться нет :(
Так вот вопрос в чем:
- создал я в Visual Studio 2008 проект С++ Windows Forms Application. С элементами более менее разобрался, разместил на форме как мне нужно.
Создал кнопку управления, и мне нужно повесить на нее процедуру OnClick, что я в принципе сделал двойным щелчком. И тут опа, меня выкинуло в заголовочный файл. Т.е. процедура windows forms создалась в коде самой формы. В общем, кто делал, меня надеюсь поймут.
Так вот, как мне оттуда вызвать ранее нарисованое окно диалога? (пока что разобрался как вызвать MessageBox::Show("");)

Буду очень признателен за помощь, и думаю не в последний раз я тут ошиваюсь с идиотскими вопросами. Не гоните пожалуйста ;)

PS: Можно послать ссылками на другие источники (msdn перечитал весь)
Windows forms и Visual C++ требования заказчика.
PPS: И еще, как определить тут, что одна форма parent а другие child?
297
09 ноября 2009 года
koodeer
1.2K / / 02.05.2009
Во-первых, в заголовочный файл основной формы (вероятно, у вас это Form1.h) нужно поместить строку #include "Form2.h" (предполагаю, что файл окна диалога имеет такое имя), сразу после строки #pragma once.
Во-вторых, в обработчике OnClick пишем что-то вроде
 
Код:
Form2 ^form = gcnew Form2(); // создаём экземпляр формы
form->ShowDialog(); // показываем

ShowDialog выведет форму в модальном режиме, а метод Show - в обычном.
19K
09 ноября 2009 года
WantToProg
63 / / 19.01.2009
Благодарю. И ведь читал об этом. Просто сомневался в том, что процедуры выполняются в заголовочном файле.
И еще, на засыпку: gcnew создает экземпляр формы как я понял, а что мне использовать ,если нужно создатьэкземпляр как дочернее окно в родительском?
297
09 ноября 2009 года
koodeer
1.2K / / 02.05.2009
При желании реализацию функций можно вынести в отдельный файл cpp (не забыв указать в его начале #include "filename.h"), оставив в заголовочном лишь их объявления, но можно писать прямо в заголовочном файле.

По поводу создания приложений с MDI-интерфейсом: ссылка. И дальше по ссылкам, по ссылкам...
55K
18 ноября 2009 года
playtester
3 / / 18.11.2009
У меня есть вопрос также на тему работы с окнами, поэтому не буду создавать новую тему.
Мне нужно создать программу со множеством окон, причём в процессе работы программы окна обмениваются информацией друг с другом. Если взять код, приведённый ниже, то получается, что пользоваться свойствами формы forma можно только внутри функции, внутри которой объявлена forma.
 
Код:
Form2 ^forma = gcnew Form2(); // создаём экземпляр формы
forma->Show(); // показываем

Мне же требуется, чтобы свойства forma были доступны и из других функций, в том числе из функций, записанных в других формах. Я вижу выход в том, чтобы в Form2.h объявить форму forma, и в дальнейшем к ней обращаться из других форм после #include "Form2.h", но все попытки сделать это у меня заканчивались ошибками. Помогите, пожалуйста бывшему пользователю C++ Builder...нелегко даётся переход на Visual C++ :)
Никакого кода не прошу, просьба дать хотя бы наводку, как это можно сделать...
297
19 ноября 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: playtester
Мне же требуется, чтобы свойства forma были доступны и из других функций, в том числе из функций, записанных в других формах. Я вижу выход в том, чтобы в Form2.h объявить форму forma, и в дальнейшем к ней обращаться из других форм после #include "Form2.h", но все попытки сделать это у меня заканчивались ошибками.



Хорошо бы привести возникающие ошибки, иначе вам не смогут дать совет.
Догадываюсь, что ошибки возникают из-за перекрёстных инклюдов. Нечто подобное обсуждалось здесь.
Мой вам совет: переходите с MC++ на C# - в этом языке подобных проблем не возникает, компилятор сам разруливает ситуацию :). Время, потраченное на въезд в новый язык окупится моментально.

55K
19 ноября 2009 года
playtester
3 / / 18.11.2009
Извиняюсь, ошибок привести не могу, т.к. вчера я так искаверкал свой проект, что он отказался запускаться вообще :)
Попробую лишь провести аналогию с 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. Да, форум я читал. Находил только темы, где обсуждается взаимодействие между материнской и дочерней формой. Мне же нужно, к примеру, чтобы первая форма могла обращаться ко второй, если вторая форма создаётся третьей.
288
20 ноября 2009 года
nikitozz
1.2K / / 09.03.2007
Разнесите объявление и определение (реализацию) методов форм по CPP и H файлам.

Цитата: playtester

Если писать 'Form2 forma", получаю "missing type specifier - int assumed. Note: C++ does not support default-int"



Скорее всего ошибка вызвана тем, что в месте, где вы пытаетесь объявить forma, тип Form2 еще неизвестен.

P.S. не стоит называть переменные по-русски. :)

5
20 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: playtester
Что я могу делать неправильно?

Это эпический феил борланда создавать глобальные переменные для форм (что в делфи, что в билдере). Разве вы не в курсе, что это очень, очень плохо? В Managed C++ глобальные переменные управляемых типов вообще создавать нельзя, потому что CTS этого не позволяет.

Если вы хотите, что бы одна форма взаимодействовала с другой (вообще-то это также чрезвычайно дурной тон), то нужно передать им ссылки друг на друга, например, через конструктор или публичное свойство.

55K
24 ноября 2009 года
playtester
3 / / 18.11.2009
Цитата:
не стоит называть переменные по-русски


Я так ни в коем случае не делаю, просто это первое имя формы, пришедшее мне в голову на момент написания примера :D

Цитата:
Это эпический феил борланда создавать глобальные переменные для форм (что в делфи, что в билдере). Разве вы не в курсе, что это очень, очень плохо?


Эх, просто мне формы как public-доступные объекты кзались очень удобной вещью в Борланде, и я к ним привык. То, что это плохо - хм...никогда такого не слышал и проблем с этим не испытывал. Но как зелёный новичок в visual C++, я вынужден Вам поверить :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог