Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Сообщения пользователя 20.07.03 03:46 Число просмотров: 1293
Автор: void <Grebnev Valery> Статус: Elderman
|
Предлагаю дискуссию.
Как организовать обмен пользовательскими «сообщениями»между классами приложения MFC, которые бы отражали общую бизнес-логику программы?
Вопрос не в том, как это вообще можно сделать, а как сделать эффективнее, с точки зрения скорости разработки приложения VC++.
Хотя вопрос касается приложений MFC, но для лучшего его понимания - начну со стиля построения приложений, который я уже лет 6 использую в BC++ Builder.
Удобно для оконной формы BC++ Builder с большим числом контролов (50-100, что характерно для приложений баз данных) определить две функции, например,bool FillControls(unsigned int msg) и bool DisplayControls(unsigned int msg) для обработки «сообщений» пользователя типа CLEAR_CONTROLS, READ_DATABASE, SAVE_DATABASE и т.д:
bool FillControls(unsigned int msg)
{
switch( msg )
{
case STARTUP: …..
case CLEAR_CONTROLS: …..
case READ_DATABASE: …..
}
}
Например, по нажатию кнопки «Открыть», обработчик кнопки делает последовательность вызовов FillControls(READ_DATABASE) и DisplayControls(READ_DATABASE). Это приводит к тому что, соединяемся с DB, читаем данные в контролы и перерисовываем их, контролируя на каждом шаге, что должно быть disable, что enable, что readonly и т.д.
Удобство заключается в том, что всё управление отображением и заполнением контролов (enable, visible и т.д) сосредоточено в одном месте. Вернее сосредоточена общая логика приложения в части управления контролами.
Такую обработку несложно построить в BC++, т.к. все контролы являются членами класса формы приложения. Т.е из указанных выше функций (методов формы) видны все контролы.
Гораздо сложнее это реализовать в VC++. Это связано с тем, что классы, в которых созданы члены-контролы ничего не знают друг о друге, и не видят соответствующих контролов в общем случае. Например, если Вы создали приложение с CTreeView – СFormView, где на форму положили CTabCtrl и для каждой закладки создали по диалогу CPage1,…., CPage20, то для каждого класса!!! придётся писать соответсвующие обработчики bool FillControls(unsigned int msg), bool DisplayControls. При этом необходимо ещё найти приемлемый механизм обмена сообщениями между классами.
У кого есть идеи? Предлагаю для затравки тупой метод решения задачи - использование глобальных указателей на каждый из диалогов. Умные – предложите Вы.
Делаем тупо:
extern CTvView* pTV;
extern CPage1* Page1;
…
extern CPage20* Page20;
bool FillControls(unsigned int msg)
{
switch( msg )
{
case STARTUP:
pTV->Clear();
Page1->ClearControls();
….
Page20->ClearControls();
}
}
|
- [C++] Сообщения пользователя - void 20.07.03 03:46 [1293]
|
|
|