Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Разработка Windows Forms > Как управлять компонентами формы из другого модуля |
Автор: valeriyzf 11.2.2010, 03:14 | ||||
Microsoft Visual C++ 2008 (2005) В проекте 1 форма и несколько модулей. Но управлять компонентами формы из других модулей не получается. Например: Создаем новый проект "Test1" с пустой формой "Form1". На форму помещаем кнопку "Button1". В заголовочном файле "Form1.h" объявляем процедуру:
Вызываем эту процедуру нажатием кнопки "Button1". А теперь, внимание - задача! Описание самой процедуры
делаем не в этом же файле "Form1.h", а в главном модуле "Test1.cpp". Задача процедуры - изменить текст кнопки на другой, например "Hello forum!". Что должно получиться: Запускаем проект, нажимаем кнопку, и ее текст меняется на указанный в коде. Здесь можно скачать исходничек примера: http://www.cyberforum.ru/visual-cpp/thread93157.html Спасибо! |
Автор: 586 11.2.2010, 05:56 | ||||||||
В Form1.h найди строку:
и поменяй её на эту:
и тогда можно будет писать так:
Если нужно изменить текст у существующей формы, то можно написать так:
|
Автор: valeriyzf 11.2.2010, 20:23 | ||
586, Вы просто Гений! Спасибо огромное!. Я запостил эту тему на 5-ти или 6-ти различных форумах, включая 3 англоязычных. На одном из форумов решение было найдено, но намного более сложное: http://www.daniweb.com/forums/thread259425.html Моей же конечной целью есть управление графикой на форме из других модулей, что также замечательно работает по вашему примеру:
Процедуры обработки графики довольно громоздкие (хотя и простые). Соответственно хотелось их разбить на разные модули. Беру этот форум и Вас лично на заметку. Еще раз Спасибо! ![]() |
Автор: valeriyzf 14.2.2010, 21:44 | ||||
Вынужден опять поднять тему. Данный метод не получается применить к компонентам формы типа ListBox
далее в выпадающем списке нету свойств и методов ListBox, например ListBox1->Items Метод
НЕ выдает ошибки, но и ничего не делает с компонентом ListBox1 (private на public в шапке Form1.h заменить не забыл). Заранее спасибо! |
Автор: KelTron 15.2.2010, 14:30 | ||||
((ListBox)Application::OpenForms["Form1"]->Controls["ListBox1"])->Items Если Change_Button_Text() находится внутри класса формы, то
Иначе передаём как параметр:
|
Автор: valeriyzf 15.2.2010, 21:05 | ||||||||
KelTron, большое спасибо за ответ. Все выглядит очень заманчиво. Но: Пример №1:
После последней точки действительно появляются методы ListBox. Но компилятор выдает ошибку: error C2440: приведение типов: невозможно преобразовать 'System::Windows::Forms::Control ^' в 'System::Windows::Forms::ListBox' Для преобразования требуется конструктор или оператор пользовательского преобразования, который не может использоваться const_cast или reinterpret_cast Далее, пример №2:
Здесь работает безупречно, но с этим проблем и не было. Внутри класса формы все работает. Далее, пример №3:
Если в качестве параметра функции поставить просто тип (Form form), то у параметра form не будет компонента ListBox1. Т.е. нужен параметр (Form1 form) Я сделал вот так (в отдельном модуле Unit1.cpp):
Все запускается и компилируется без ошибок. Программа выполняется, но ничего с компонентом "ListBox1" не происходит :( |
Автор: valeriyzf 16.2.2010, 21:31 | ||||||||
Пример №1:
Работает отлично! Спасибо! Спасибо! Спасибо! Что мне нравится на этом форуме, так это что здесь не задают лишних вопросов, и не пересылают тебя на другие темы. А сразу: Вопрос -> Ответ. Еще раз спасибо! ---------------------------------------- Следующий пример уже просто хочется разобрать из вредности, как говориться, спортивный интерес ![]() Пример №3: Логику работы я понял: нужно вызывать процедуру класса, передавая при этом саму форму, как параметр. Но появляется одна загвоздка. Например: Создаю чистый проект "Form_Control_forum" с чистой формой Form1 //не могу приатачить, весит в зипе >1.7Mb На форму добавляю button1 и listBox1. Далее через мастер добавляю класс Test (Test.h, Test.cpp). В шапке класса пишу следующее:
В процедуру обработки события кнопки button1 добавляю:
Но чтобы эта процедура была здесь читаема конструктором, мне нужно добавить в шапку Form1.h следующее:
А так получается перекрёстное добавление шапок: Form1.h -> в Test.h, и наоборот: Test.h -> в Form1.h Что в свою очередь пресекается компилятором... |
Автор: KelTron 17.2.2010, 15:09 | ||||
Это конечно всё изврат, но так работает..) ![]() Файл Test.h заменяем на
Файл Test.cpp заменяем на
|
Автор: valeriyzf 18.2.2010, 01:05 |
Да, скорее всего просто логика построения приложений на Visual C++ 2008 изначально на такую структуру не рассчитана. Пользователя стараются направить на создание программ с определенной стандартной архитектурой. Ok, еще раз Спасибо! ![]() Ваши советы очень сильно выручили ![]() |