Хочу запроектировать как следует на примере создания Мастера. MVC раньше не реализовывал. Посидел, подумал, идеи закончились. Какие идеи пришли:
-есть элемент управления "визард" с кнопками "вперед", "назад" и набором ссылок для переходов на следующие страницы.
-у него есть события "нажато "назад", "нажато Вперед", "нажата ссылка".
-у него есть область для отображения ссылок и область для отображения страниц.
-есть объект "хранилище данных". То, что ввел пользователь, сохраняется в нём.
-есть страница визарда. Набор контролов.
-есть контроллер страницы. Обладает страницей. Имеет указатель на хранилище данных. Имеет методы "загрузить данные в свою страницу", "сохранить данные со своей страницы".
-есть контроллер всего. Имеет визарда и массив контроллеров страниц. Подписан на события визарда "вперед", "назад" и "ссылка". Хранит номер текущей активной страницы, параметры "последняя ли страница" и "первая ли страница" (чтобы кнопки "вперед" и "назад" на форме были активны/неактивны).
Когда контроллер получает сообщение "нажато вперед" — он смотрит, какая сейчас страница активна, дает команду ее менеджеру "сохранить данные" и дает команду менеджеру следующей страницы "загрузить данные" и "отобразить страницу". (сделать ее visible например)
Вопросы:
-как будет при таком раскладе реализовываться обратная связь между формой и контроллером? откуда форма визарда узнает, выводить ли серым кнопку "вперед" (если находимся на последнем вопросе).
-как сделать эту всю развязку "как надо"?
Как я подозреваю, всё это уже давно придумано до меня, и был бы благодарен за рекомендацию, как сделать "как следует".
Здравствуйте, opposer, Вы писали:
O>Вопросы:
O>-как сделать эту всю развязку "как надо"?
В первую очередь забыть про кнопки, страницы и т.п. не нужные в данный момент детали. Самое главное: есть нейкий объект, который ведёт диалог с пользователем и тебе должно быть всёравно в каком виде этот диалог представляется.
O>Как я подозреваю, всё это уже давно придумано до меня, и был бы благодарен за рекомендацию, как сделать "как следует".
ИМХО самое главное для отвязывания для отвязывания — это сообщения( т.е. отображение не знает как у тебя хранятся данные, а лишь их получает в ответ на вопрос, а данные не знают как они будут выглядеть- не ихнее это дело).
... << RSDN@Home 1.2.0 alpha rev. 775>>
Здравствуйте, opposer, Вы писали:
O>Хочу запроектировать как следует на примере создания Мастера. MVC раньше не реализовывал.
O>-есть элемент управления "визард" с кнопками "вперед", "назад" и набором ссылок для переходов на следующие страницы.
Угу
O>-у него есть события "нажато "назад", "нажато Вперед", "нажата ссылка".
Угу, + "Финиш", чтобы завершить работу с дефолтными значениями.
O>-у него есть область для отображения ссылок и область для отображения страниц.
Ну допустим.
O>-есть объект "хранилище данных". То, что ввел пользователь, сохраняется в нём.
Угу
O>-есть страница визарда. Набор контролов.
O>-есть контроллер страницы. Обладает страницей. Имеет указатель на хранилище данных. Имеет методы "загрузить данные в свою страницу", "сохранить данные со своей страницы".
Какой смысл делить "Страницу" и "Контроллер страницы"? Т.к. связь между ними 1:1, то и быть им объединенными.
O>-есть контроллер всего. Имеет визарда и массив контроллеров страниц. Подписан на события визарда "вперед", "назад" и "ссылка". Хранит номер текущей активной страницы, параметры "последняя ли страница" и "первая ли страница" (чтобы кнопки "вперед" и "назад" на форме были активны/неактивны).
Что он у себя хранит — решается по ходу пьесы.
"последняя ли страница" и "первая ли страница", а также "можно ли двигаться дальше" и на какую именно страницу может вычисляться, исходя из введенных пользователем значений.
У меня Визард был весьма разветвленный, поэтому пришлось соорудить конечный автомат для переключения страниц.
Для линейного, может и контроллер вообще не нужен, и без него ясно, на какую страницу надо переходить.
O>Когда контроллер получает сообщение "нажато вперед" — он смотрит, какая сейчас страница активна, дает команду ее менеджеру "сохранить данные" и дает команду менеджеру следующей страницы "загрузить данные" и "отобразить страницу". (сделать ее visible например)
O>-как будет при таком раскладе реализовываться обратная связь между формой и контроллером? откуда форма визарда узнает, выводить ли серым кнопку "вперед" (если находимся на последнем вопросе).
"Страница" (она же "Контроллер страницы") перед отправкой события "нажато куда-то" проверяет данные, если ошибок нет, то отдает их "хранилищу данных" и шлет уведомление. Сама страницы не переключает.
Контроллер, получив событие, определяет, какую страницу нужно показать и, собсно дает соответствующую команду.
O>-как сделать эту всю развязку "как надо"?
Не знаю, как надо, но делал так, как описано выше