Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение внешнего вида программы.  (Прочитано 20567 раз)
0 Пользователей и 1 Гость смотрят эту тему.
KBAC
Постоялец

ru
Offline Offline
Пол: Мужской

« : 05-12-2012 10:02 » 

Есть объект класса конфиг, который хранится на форме. Форма - это просто контейнер для более красивого Юзер-Контрола.
Если меняются настройки программы через диалог, то изменения сохраняются в конфиге и затем нужно обновить внутренний контрол.
Как это лучше сделать?
Сейчас класс конфиг умеет изменять стиль членов класса юзер-контрола, которые являются общедоступными (public), т.е. у конфига есть методы, в которые передаются параметрами нужные члены. Этот вариант мне не нравится.
Можно сделать паблик методы у внутреннего контрола - в принципе нормально, но, думаю, что сам класс не должен заниматься своим стилем, он и так уже большой слишком. Конечно для красоты можно и в отдельный файл вынести определения методов, которые будут заниматься гуи.
Мне интересно, нет ли какого-либо шаблона проектирования для подобного случая?
Записан

У тебя все получится, главное -- верить и делать.
Порадоваться, когда все плохо -- легче, чем ты думаешь.
В действии счастье.
Вовлекая людей важно быть увлеченным чужой жизнью.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 05-12-2012 10:14 » 

По моему очень сумбурно. Повествование класса «можно грабить корованы». То «форма», то «контейнер», то «диалог»...
Зачем так глубоко интегрировать конфиг и контрол их друг в друга? Что это вообще за «конфиг»? Попробуй объяснить еще раз.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
KBAC
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 05-12-2012 10:35 » 

RXL, есть форма, которая содержит в себе UserControl. В этом UserControl'e В свою очередь какие-то панели (допустим только они). И, допустим, есть необходимость в такой организации вложенности (Панель на Контроле, Контрол на Форме). Внешний вид панелей меняется в зависимости от выбранного стиля.
Буду называть ЮзерКонтрол просто Контролом.
Через пункт меню на форме можно вызвать Форму с настройками внешнего вида. Какие-то настройки поменяли - изменили стиль внешнего вида Контрола подразумевается; нажали кнопку ОК. Настройки сохранились (Это обеспечивает класс Конфиг). Теперь надо применить настройки к Контролу.
Про методы класса Конфиг, которые меняют стиль, думаю, понятно (если нет могу попробовать еще раз объяснить).
Вопрос в том, как лучше сделать изменение внешнего вида Контрола (применение стиля оформления), если информация о выбранном стиле хранится в Конфиге, который в свою очередь является членом формы наравне с Контролом?
Записан

У тебя все получится, главное -- верить и делать.
Порадоваться, когда все плохо -- легче, чем ты думаешь.
В действии счастье.
Вовлекая людей важно быть увлеченным чужой жизнью.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 05-12-2012 11:11 » 

UserControl::applySettings(Config config);

Чем не устраивает?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
KBAC
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 05-12-2012 11:37 » 

Класс большой слишком, не хочу его усложнять методами визуализации.
Записан

У тебя все получится, главное -- верить и делать.
Порадоваться, когда все плохо -- легче, чем ты думаешь.
В действии счастье.
Вовлекая людей важно быть увлеченным чужой жизнью.
zubr
Гость
« Ответ #5 : 05-12-2012 13:50 » 

Сделай пользовательское сообщение у юзер-контрола, а из конфига посылай юзерконтролу это сообщение с указателем на память, где хранятся данные по стилю.
Записан
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 05-12-2012 13:57 » 

По-моему автор не вполне понимает, чего он хочет.

Есть описание (конфигурация) и отображение (контрол). Описание может меняться, как оно меняется, кто его меняет, это не волнует ни само описание, ни отображение. Но вот когда изменения закончились, отображения должно их воспринять.

Таким образом, из триады MVC конфигурация играет роль модели (Model), а контрол - представления (View). Ну и риторический вопрос, как представлению следить за обновлением модели.

Тут есть 2 подхода:

1) Пассивная модель. В этом случае изменением модели занимается только контроллер, и поэтому он инициирует обновления представления (посылает ему соответствующее сообщение, в ответ на которое представление опрашивает модель и осуществляет необходимые изобразительные действия на экране).

2) Активная модель. В этом случае модель может меняться несколькими контроллерами, которые друг о друге и о представлении могут ничего не знать, а связь модели и представления реализуется посредством шаблона проектирования "Наблюдатель" (Observer). Для .NET это банально описать событие (event) внутри модели, и подписать на него обработчик внутри представления.

Ну и вот - выбрать схему и реализовать.

Замечу, что в данном автором описании на первый взгляд контроллер ассоциирован с диалогом редактирования конфигурации. Но если хорошо подумать, то применение конфигурации для отрисовки внешнего вида контрола происходит не только по сохранению обновлённой конфигурации, но и при загрузке конфигурации при запуске приложения. Поэтому я бы в данном случае выбрал бы решение с активной моделью как наиболее простое.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
KBAC
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 07-12-2012 07:11 » 

zubr, ты под сообщением имеешь ввиду событие? Если так, тогда не понятно, почему событие должно быть инициировано в контроле, а посылать его должен конфиг.
Dimka, т.е. ты предлагаешь организовать метод вида UserControl::applySettings(Config config), который будет вызываться по событию? В общем виде это выглядит так, как я понимаю.
Записан

У тебя все получится, главное -- верить и делать.
Порадоваться, когда все плохо -- легче, чем ты думаешь.
В действии счастье.
Вовлекая людей важно быть увлеченным чужой жизнью.
zubr
Гость
« Ответ #8 : 07-12-2012 08:23 » 

KBAC, по моему логично. Изменения в конфиге уведомляют контрол, что ему нужно обновиться.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 07-12-2012 08:30 » 

KBAC, а откуда Контрол получает изначально данные о своей конфигурации? Неужели не из Конфига?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
KBAC
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 07-12-2012 11:35 » 

zubr, если контрол должен быть подписан на событие, которое будет подниматься внутри конфига, это возможно, да. Я сначала пдоумал, что должно быть событие контрола, которое каким-то образом будет подниматься внутри конфига.
Джон, Из конфига, но все тем же нехорошим способом, при котором необходимо открывать элементы ГУИ моего контрола для внешних объектов.
Наверное, сделаю метод UserControl::applySettings все таки. Потому что реализовывать наблюдателя для случая, где поставщик изменяется один - два раза за весь цикл работы приложения, думаю будет усложнять больше, чем добавить один метод для управления отрисовкой.

Добавлено через 34 минуты и 24 секунды:
Вот только одна проблема нарисовалась. Совсем забыл, что это разные проекты. В проекте, где я хочу отрисовывать, обнаруживается, что нет необходимых типов.
« Последнее редактирование: 07-12-2012 12:10 от KBAC » Записан

У тебя все получится, главное -- верить и делать.
Порадоваться, когда все плохо -- легче, чем ты думаешь.
В действии счастье.
Вовлекая людей важно быть увлеченным чужой жизнью.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 07-12-2012 14:07 » 

Джон, Из конфига, но все тем же нехорошим способом, при котором необходимо открывать элементы ГУИ моего контрола для внешних объектов.

С этого места поподробнее. Я не могу себе представить, что некий элемент, требующий для своей отрисовки, например, цвет, дожен быть public, чтобы этот цвет получить. Открытый Конфиг я ещё где-то могу понять, но открытый GUI...

Добавлено через 1 минуту и 13 секунд:
Вот только одна проблема нарисовалась. Совсем забыл, что это разные проекты. В проекте, где я хочу отрисовывать, обнаруживается, что нет необходимых типов.

А интерфейс не пробовал использовать?
« Последнее редактирование: 07-12-2012 14:08 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
KBAC
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 10-12-2012 07:52 » 

Джон, у меня есть некоторое перечисление, по которому я определяю как мне отрисовать мою панельку. Область видимости перечисления - весь проект Browser.
Мой Контрол реализован в проекте Control и там необходимое перечисление не видно. Создавать клон перечисления - бред. Вот и решил вытащить наружу панельку, стиль которой и задаю в проекте Browser (т.е. там меняю ее image).
В общем, сделал, чтобы в Browser'e анализировались значения Config'a и принималось решение, какой image передавать в функцию UserControl::ApplyStyle(Image image), а UserControl уже дальше применяет это изображение  к своей панельке.
В принципе меня все устраивает, наверное лучше и не придумаешь в данной ситуации.
Цитата
А интерфейс не пробовал использовать?
Это как?
« Последнее редактирование: 10-12-2012 08:37 от KBAC » Записан

У тебя все получится, главное -- верить и делать.
Порадоваться, когда все плохо -- легче, чем ты думаешь.
В действии счастье.
Вовлекая людей важно быть увлеченным чужой жизнью.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 10-12-2012 08:48 » 

Ничего не понял. Перечисления... проекты... области видимости... Контрол есть сама по себе завершённая самодостаточная единица. Вот берёшь ты, к примеру, какой-нить grid, кидаешь его на форму и никаких тебе проектов и пр. А есть готовый объект со всеми свойствами, ф-ми и отрисовкой.

С интерфейсом делается так. Создаёшь абстрактный класс с набором ф-ций или свойств (как тебе удобней), которые отвечают за конфигурационные данные, и передаёшь его в свой контрол. Для визуального редактора отлавливаешь null этого объекта и используешь дефолтные параметры. Во всех остальных случаях передаёшь в контрол объекты, включающие этот интерфейс и обеспечивающие поставку необходимых данных. Кстати, очень удобно для тестов.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 10-12-2012 09:14 » 

Если перечисление описывает внешний вид Control, то оно должно находиться в одной сборке с ним, а не в другой (Browser).

P.S. Неужели всё это нагромождение с конфигами ради enum?..  Да что ты говоришь?..
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
KBAC
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 10-12-2012 09:34 » new

Dimka, enum используется также для применения стиля и к элементам Browser'a. Т.е. первостепенно, это свойство браузера, все таки.
Отвечая на твой вопрос понял следущую вещь: Контрол теперь (благодаря моему решению) можно использовать как плагин для разных браузеров, у которых может быть свой внешний вид, и под который Контрол должен будет подстроиться.
Цитата
Неужели всё это нагромождение с конфигами ради enum?..
Ну там еще другие настройки есть помимо стиля  Улыбаюсь
Записан

У тебя все получится, главное -- верить и делать.
Порадоваться, когда все плохо -- легче, чем ты думаешь.
В действии счастье.
Вовлекая людей важно быть увлеченным чужой жизнью.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines