|
|
  |
Embedded GUI, Что поизучать? |
|
|
|
Sep 12 2012, 13:59
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(dxp @ Sep 12 2012, 05:20)  Ну, т.е. что-то вроде системы меню? Это несколько другая тема, чем передача сообщений. Тут тоже может быть несколько реализаций. Я делаю связь через промежуточный объект Target. При создании пункта меню ему присваивается объект Target, который представляет собой простой объект из иерархии таржетов. Все их объединяет метод (виртуальная функция) exec(), которая и вызывается внутри метода объекта пункта меню, отвечающего за реакцию на нажатие соответсвующей кнопки. Схема действий проста: внутри переключается фокус и вызывается перерисовка, а также выполняются все сопутствующие действия.
Если приводить аналогию из С, то этот способ похож на связть через указатель на функцию, которая и выполняет действия. Тут просто эта функция "завёрнута" в объект Target, что делает использование более безопасным и удобным (можно хранить внутри этого объекта какие-то служебные переменные). Использование промежуточных объектов позволяет гибко настроить целевые действия при активации виджета. Если не очень понятно описано, скажите, пример приведу (сейчас его нет под рукой). Спасибо, dxp. Пример был бы интересен. У меня элементы меню - объекты с соответствующими свойствами. Обработка клавиш - вызов виртуальной функции для элемента. Вопрос как эффективно (красиво) обеспечить управление видом и содержанием элемента меню (ведомого) (или листбокса, едитбокса) в зависимости от состояния другого элемента (ведущего). Мое решение ассоциируется у меня с костылями (некрасиво, неэффективно).
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Sep 12 2012, 15:20
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (AlexandrY @ Sep 12 2012, 20:42)  Я думаю задержка там концептуально поставлена, а не для простоты. Она именно дает GUI передохнуть. Не передохнуть, а просто нет необходимости обновлять информацию на экране чаще. QUOTE (AlexandrY @ Sep 12 2012, 20:42)  Скорее всего жертвуется событиями от клиентских для GUI задач. Какими же это? Мне про это ничего не известно. Расскажите? QUOTE (AlexandrY @ Sep 12 2012, 20:42)  Для маленьких монохромных экранов 40 мс скорее всего будет незаметно. Но для больших цветных панелей с тачскрином где весь цикл прорисовки занимает больше 40 мс последствия задержки сразу будут заметны. Посмотрел, в текущей работе экран 320х240 прорисовывается целиком за 3 мс. Учитывая, что полная перерисовка требуется весьма редко (обновляются только гораздо меньшие фрагменты), то никаких проблем нет. В другом приборе экран 800х600, время обновления не замерял, ни малейших тормозов не наблюдается. С большими экранами и платформа побыстрее. QUOTE (AlexandrY @ Sep 12 2012, 20:42)  Интересно, упор делается на такой мелочи как автоматическая генерации идентификаторов сообщений, Мелочи? Покажите, как вы делаете подобные вещи? Как осуществляется доставка сообщений от событий к виджетам? QUOTE (AlexandrY @ Sep 12 2012, 20:42)  хотя на самом деле главный цикл для большого количества сообщений не приспособлен. Настал момент вам показать свой, хороший, правильный вариант главного цикла. Покажите, очень интересно? QUOTE (AlexandrY @ Sep 12 2012, 20:42)  Это не считая того, что автоматически сгенерированные идентификаторы усложняют отладку и ведение лога. С чего это? Обоснуйте? QUOTE (AlexandrY @ Sep 12 2012, 20:42)  Вообщем преимущества продемонстрированной реализации весьма спорны, либо она уж очень упрощена  Ждём правильный вариант.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Sep 12 2012, 19:58
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(dxp @ Sep 12 2012, 18:20)  С чего это? Обоснуйте? Вопрос не в необходимой частоте вывода на экран, а в том что каждый внешний (из другой задачи) ивент вы обрабатываете по всей цепочке виджетов заново. Итого куча холостых циклов. Вот и ставите задержку чтоб не перенапрягать GUI холостой работой. А затора избегаете пропуском ивентов. Может очищаете буфер очереди или еще что. Это уж вам виднее. Вы ж свою реализацию не выкладываете. Про доставку я уже говорил. У Microchip-а просто есть глобальный связный список виджетов. Все идентификаторы событий сведены в одном заголовочном файле. Просто и понятно. При отладке какой бы релиз библиотеки не взяли каждый определенный числовой идентификатор всегда соответствует одному и тому же событию. Не надо шерстить все исходники чтобы отыскать все старые и новые типы событий для того чтобы правильно их описать в логе. Кстати, упор на фокус тоже не очень понятен. Если экран с тачскрином, то зачем вообще иметь такой атрибут как фокус? Может быть это синоним привязки видджетов ввода к виджетам вывода? Но тогда фокусов должно быть много. Вообщем я то выложу свои исходники, но только после того как выложите вы свои.  А то из коротких постов так и не понятно насколько развита ваша GUI и что умеет. Много вопросов остается. Например, действительно ли там нужна была такая масштабируемость, что потребовалось автоматическая генерация идентификаторов?
|
|
|
|
|
Sep 13 2012, 03:51
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (AlexandrY @ Sep 13 2012, 02:58)  Вопрос не в необходимой частоте вывода на экран, а в том что каждый внешний (из другой задачи) ивент вы обрабатываете по всей цепочке виджетов заново. По какой цепочке? Цепочке, состоящий из чего? Покажите? Объясните, с чего вы сделали такой вывод? 1. QUOTE (AlexandrY @ Sep 13 2012, 02:58)  Итого куча холостых циклов. 2. QUOTE (AlexandrY @ Sep 13 2012, 02:58)  Вот и ставите задержку чтоб не перенапрягать GUI холостой работой. 3. QUOTE (AlexandrY @ Sep 13 2012, 02:58)  А затора избегаете пропуском ивентов. Может очищаете буфер очереди или еще что. Аж целых три сильных заявления! И ни одно не имеет даже намёка на обоснование. Это ваши фантазии, ничего этого там нет. Может, перестанете уже фантазировать и попробуете разобраться в том коде, который я привёл (если что-то не понятно, готов ответить на вопросы). А если не желаете, считаете это ниже своего достоинства, то тогда прошу перестать писать комментарии, содержание которых не имеет к действительности никакого отношения, и демонстрирующие непонимание комментируемого. QUOTE (AlexandrY @ Sep 13 2012, 02:58)  Это уж вам виднее. Вы ж свою реализацию не выкладываете.  Уже практически всё выложил. А вы и не заметили. QUOTE (AlexandrY @ Sep 13 2012, 02:58)  Про доставку я уже говорил. У Microchip-а просто есть глобальный связный список виджетов. Все идентификаторы событий сведены в одном заголовочном файле. Просто и понятно. Понятно. Самый примитивный вариант. На С по-другому особо и не разбежишься. При добавлении и/или удалении события придётся ручками следить за соответствием идентификаторов. Закат Солнца вручную. Именно то, от чего всегда хотелось уйти - пусть машина этим занимается, она не ошибается. Другое дело, что используемый инструментарий не позволяет. QUOTE (AlexandrY @ Sep 13 2012, 02:58)  При отладке какой бы релиз библиотеки не взяли каждый определенный числовой идентификатор всегда соответствует одному и тому же событию. Не надо шерстить все исходники чтобы отыскать все старые и новые типы событий для того чтобы правильно их описать в логе. И здесь всё соответствует. А в отладочный лог надо писать текстовую информацию, а не какие-то маловразумительные числа, чтобы потом руками их сопоставлять. QUOTE (AlexandrY @ Sep 13 2012, 02:58)  Кстати, упор на фокус тоже не очень понятен. Если экран с тачскрином, то зачем вообще иметь такой атрибут как фокус? Если. А если нет? Показан простой пример. Тем не менее, прекрасно работающий. Будет тачскрин, будет чуть иная реализация. QUOTE (AlexandrY @ Sep 13 2012, 02:58)  Может быть это синоним привязки видджетов ввода к виджетам вывода? Но тогда фокусов должно быть много. Сколько угодно. В данном примере один. Выше описывал вариант, когда может быть несколько. Ничего ничему не противоречит, не мешает, расширяется сколько угодно в любую сторону без переделки "каркаса". QUOTE (AlexandrY @ Sep 13 2012, 02:58)  Вообщем я то выложу свои исходники, но только после того как выложите вы свои.  Во-первых, я и не просил ваши исходники. Вы цикл критиковали, я попросил ваш вариант цикла, лишённого недостатков критикуемого. Принцип, псевдокод - компилировать его никто не будет. Во-вторых, я-то свой код уже практически выложил. Иерархия виджетов, схема передачи сообщений им. Вам что, ещё реализации методов draw() каждого виджета показать? Весь проект GUI представлен (кроме уровня вывода на устройство визуализации). Те, кто это понял, уже давно дали оценку. Кто ещё не вник, но хочет разобраться, пытаются это сделать. Кому это без разницы, те проходят мимо. Вы же, не разобравшись, наводите критику, содержание которой не имеет никакого отношения к действительности - выдуманы какие-то сущности и подвергаются критике. Да, этот GUI такой маленький, что вы и не заметили, что это практически всё (остальное рюшечки). Да, такой "примитивный", что кода всего на пару экранов. Тем не менее, схема уже обкатана на двух серьёзных приборах и отлично себя зарекомендовала. Результирующего кода, конечно, гораздо больше (несколько тысяч строк), но это реализация функциональности виджетов. QUOTE (AlexandrY @ Sep 13 2012, 02:58)  А то из коротких постов так и не понятно насколько развита ваша GUI и что умеет. Несколько раз уже всё обсосано. Повторяю ещё раз. Имеет цикл обработки входящих событий, умеет передавать сообщения от событий виджетам, реализует требуемое поведение виджетов. Это основные функции любого GUI. При этом код весьма компактный, очень простой (для человека, свободно читающего на С++), сколько угодно расширяемый по основным функциям. QUOTE (AlexandrY @ Sep 13 2012, 02:58)  Много вопросов остается. Например, действительно ли там нужна была такая масштабируемость, что потребовалось автоматическая генерация идентификаторов? Во-первых, не масштабируемость, а расширяемость. Расширяемость нужна всегда. Во-вторых, не автоматическая генерация идентификаторов, а система передачи сообщений с проверкой соответствия. И уж как это сделано внутри - дело пятое. Не туда смотрите, не там акценты расставляете. * * * QUOTE (mdmitry @ Sep 12 2012, 20:59)  Пример был бы интересен. У меня элементы меню - объекты с соответствующими свойствами. Обработка клавиш - вызов виртуальной функции для элемента. Вопрос как эффективно (красиво) обеспечить управление видом и содержанием элемента меню (ведомого) (или листбокса, едитбокса) в зависимости от состояния другого элемента (ведущего). Мое решение ассоциируется у меня с костылями (некрасиво, неэффективно). Не очень понял, что именно требуется. Вы имеете в виду вариант, когда, скажем, перемещаем курсор по меню от одного пункта к другому, и при этом где-то рядом отрисовывается подменю, каждый раз другое (у каждого пункта меню своё подменю)? Этот вариант? Или что-то иное? Объясните словами поподробнее, что должно быть на экране, как оно должно реагировать на события? * * * QUOTE (haker_fox @ Sep 13 2012, 06:12)  1. Перересовке виджетов (весь экран перерисовывать нецелесообразно, надо подсмотреть в какой-нибудь библиотеке красивый алгоритм). Это в большей степени зависит от особенностей аппаратуры визуализации, проще говоря, от контроллера дисплея (хотя не всегда он есть). Например, SSD1963 хорошо приспособлен для заливки прямоугольных фрагментов, но не имеет теневого буфера. Поэтому тут нужно по месту быстро обновлять изменившиеся фрагменты. В другом приборе у меня был теневой буфер в SDRAM и возможность быстро залить этот буфер в рабочий буфер, с которого идёт рефреш. Тут без разницы, сколько информации на экране вы меняете - всё равно перезаливается весь буфер, но происходит это очень быстро (800х600 за 2.4 мс) в паузах между рефрешем очередного кадра (там VESA). Поэтому не ищите универсального решения - в каждом случае свои особенности, плясать тут приходится от особенностей доступной аппаратной части видеовывода. QUOTE (haker_fox @ Sep 13 2012, 06:12)  2. Получение данных "в ГУИ" от клавиатуры, АЦП и т.п. Здесь уже алгоритм предложен, но нужно все еще раз обдумать и "вживит" в свою реализацию. Для начала возьмите, как есть и сделайте простейший вариант - обработка событий от кнопок парой виджетов. Когда заработает, сразу поймёте, что хорошо, что нет, что нравится, а что не нравится, чего не хватает, а что лишнее. И увидите вариант, который вам подойдёт лучше всего.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Sep 13 2012, 04:10
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (AlexandrY @ Sep 13 2012, 03:58)  Вообщем я то выложу свои исходники, но только после того как выложите вы свои.  Уважаемый AlexandrY, просим, просим!  Выложите, хотя бы шкелет QUOTE (dxp @ Sep 13 2012, 11:51)  Это в большей степени зависит от особенностей аппаратуры визуализации У меня аппаратный котроллер LCD в LPC2478 QUOTE (dxp @ Sep 13 2012, 11:51)  И увидите вариант, который вам подойдёт лучше всего. Спасибо!
--------------------
Выбор.
|
|
|
|
|
Sep 13 2012, 05:52
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (Lotor @ Sep 13 2012, 12:18)  Не приходила ли Вам мысль зафиксировать подобные примеры в документации к scmRTOS в разделе "Примеры использования"? Так это ведь не про ось, это как бы ортогональные вещи. GUI сам по себе. А способ передачи сообщений - это типа лёгкий аналог dynamic_cast<> (RTTI), не везде полностью заменяет, но во многих случаях вполне. И применяться может почти на любой мелочи в отличие от. Возможно, было бы правильным как-то зафиксировать эту информацию, например, в виде статейки, как делают на хабре и других ресурсах. Но тут они идут в контексте обсуждения, на формат статьи не тянут, поэтому простым переносом не сделать. Оформлять в отдельную полноценную статью пока мысль не приходила, да и эккаунта у меня та таких ресурсах нет. Кроме того, нет и уверенности в необходимости такого шага - те, кому это интересно, уже и так это увидели, а отвечать на безосновательные критические выпады не потрудившихся разобраться в сути, как-то не греет. В подфоруме по ПЛИС есть тема под названием "Схемотехнические трюки" или как-то так. Там народ делился всякими HDL приёмами. Возможно, что и по программированию имеет смысл создать такую тему и складывать туда интересные посты по программерским приёмам, паттернам. Тему сделать закрытой с доступом только модераторов, чтобы не флудили в ней. Правда, это работа для модераторов. P.S. Я подумаю над вашим предложением. Возможно, имеет смысл всё-таки написать нормальную статью (когда со свободным временем будет получше).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Sep 13 2012, 06:54
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(haker_fox @ Sep 13 2012, 07:10)  Уважаемый AlexandrY, просим, просим!  Выложите, хотя бы шкелет  Ну нет, я пас. Нет исходников - нет обсуждения. GUI интересен рендерингом, организацией шрифтов, импортом графических файлов, оконными сервисами с клипингом, скролингом и проч. А здесь речь только об одном незначительном аспекте.
|
|
|
|
|
Sep 13 2012, 07:43
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(dxp @ Sep 13 2012, 07:51)  Не очень понял, что именно требуется. Вы имеете в виду вариант, когда, скажем, перемещаем курсор по меню от одного пункта к другому, и при этом где-то рядом отрисовывается подменю, каждый раз другое (у каждого пункта меню своё подменю)? Этот вариант? Или что-то иное? Объясните словами поподробнее, что должно быть на экране, как оно должно реагировать на события? Например: Есть три листбокса. В первом устанавливается режим устройства (несколько). Во втором в зависимости от установленного режима предлагаются варианты подрежимов (число ращное в зависимости от режима) для выбранного режима. Третий листбокс устанавливает параметры подрежима, число которых (параметров) зависит от выбранного подрежима) . Смена режима должна изменить предлагаемые подрежимы и параметры. Смена подрежима должна изменить список допустимых параметров. режим->подрежим -> параметр. Надеюсь прояснил ситуацию
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Sep 13 2012, 09:06
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(mdmitry @ Sep 13 2012, 13:43)  Смена режима должна изменить предлагаемые подрежимы и параметры. Смена подрежима должна изменить список допустимых параметров. режим->подрежим -> параметр. Надеюсь прояснил ситуацию посмотрите на FLTK, легкий и простой, можно посмотреть как некоторые веши сделаны перед тем как свои велосипеды изобретать. у каждого виджета есть колбэк за который его дергает родитель в определённых случаях. в этом колбэке, который может быть и один зарегистрирован у всех заинтересованных виджетов, меняем переметры у всех остальных в зависимости от значений: ну и виджеты иерархически огранизованны, и есть базовый класс Group от которого унаследованы окна/составные виджеты/... соответственно они хранят список подопечных виджетов и по приходу сообщения сверху дергают передают его через handle или дергают за callback всех кто снизу. Код void uiSomeWindow::Choice_cb(){ if (list1->value() == 0) { list2->clear(); list2->add("value1|value2|value3") } if (list2->value() == 2) { list3->clear(); list3->add("value4|value5|value6") } }
|
|
|
|
|
Sep 13 2012, 13:04
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(_pv @ Sep 13 2012, 13:06)  посмотрите на FLTK, легкий и простой, можно посмотреть как некоторые веши сделаны перед тем как свои велосипеды изобретать. Спасибо, уже смотрел. Наверно не очень внимательно. А так же глянул на gtkmm и wxWidgets. Раз уж здесь такая дискуссия, то позволю вбросить ещё вопрос. Система меню, IMHO, совокупность связанных меджу собой однородных (или почти) объектов. К объектам можно отнести и другие элементы GUI, такие как, листбоксы, эдитбоксы и др. Объект может быть визуализирован, причем на разных экранах (размеры, цвета) визуализация получается разная. Отсюда вопрос: имеет ли смысл делать виджеты, завязанные на графическое представление и дающие необходимый функционал? Альнернатива: объекты хранят информацию, связи и взаимодействия (передча управления друг другу). Графический драйвер обеспечивает необходимую визуализацию. Смена экрана означает только смену драйвера. Идею этого разделения увидел тут
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Sep 13 2012, 14:00
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (mdmitry @ Sep 13 2012, 14:43)  Например: Есть три листбокса. В первом устанавливается режим устройства (несколько). Во втором в зависимости от установленного режима предлагаются варианты подрежимов (число ращное в зависимости от режима) для выбранного режима. Третий листбокс устанавливает параметры подрежима, число которых (параметров) зависит от выбранного подрежима) . Смена режима должна изменить предлагаемые подрежимы и параметры. Смена подрежима должна изменить список допустимых параметров. режим->подрежим -> параметр. Надеюсь прояснил ситуацию Ага, вроде, понял. Типа, нужно менять и отрисовывать виджеты по цепочке. Модель, как я понимаю, выглядит следующим образом. Есть Список1, в котором некоторое количество пунктов. Каждый пункт имеет связь с другим объектом Список2. Аналогично, каждый пункт у объекта типа Список2 имеет связь с объектом типа Список3. Вопрос в том, как связать пункты и их объекты списков. Один из вариантов может выглядеть так (я применяю приблизительно такой способ в текущем проекте). Линки между пунктами списков и их целевыми объектами реализовываются через промежуточный объект (TList - тип списка, TListItem - тип элемента списка, все они потомки TWidget): CODE class TTarget { public: virtual void exec() = 0; virtual void draw() = 0; };
class TListTarget : public TTarget { public: TListTarget(TList *target) : Target(target) { }
virtual void exec(); virtual void draw() { Target->draw(); } protected: TList *Target; }; Все таржеты, в духе идеологии, являются потомками от TTarget, в данном случае у нас пока один тип. Далее, у пункта списка есть привязка к таржету: CODE class TListItem : public TWidget { public: TListItem(TListTarget *target...) : Target(target), ... { ... } ... virtual void exec() { Target->exec(); } // выполнить целевые действия void draw_target() { Target->draw(); } ...
private: TListTarget *Target ... }; Активизация следующего по цепочке списка осуществляется, скажем, по нажатию на кнопку (пусть будет enter), которая вызывает выполнение метода enter() виджета, в случае списка это будет: CODE void TList:enter() { FocusHistory.push(Focus); // помещаем текущий фокус в стек фокусов (чтобы вернуться обратно по цепочке) set_active(false); // делаем текущий список неактивным draw(); // и перерисовываем его, теперь он выглядит неактивным Items.curr_item()->exec(); // целевые действия, включая, например, передачу фокуса на целевой объект - список } Комментарий. Items - групповой объект, который собственно содержит список пунктов. Может быть реализован на основе простого массива, может - на основе std::vector, std::list или какого-либо другого вида контейнера. curr_item() - функция-член Items, возвращает указатель на текущий элемент (пункт списка в данном случае). Реализация хранения группы элементов и интерфейс доступа к ним может быть каким угодно, это не накладывает ограничений на общий принцип. Если при прохождении по списку нужно отрисовывать цель (для пунктов объекта типа Список1 - это объекты типа Список2), то внутри метода draw() пункта списка вызывать метод draw() цели: CODE void TListItem::draw() { ...// if(Selected) // текущий пункт является выбранным в данном списке { draw_target(); } ...// } Функция draw_target() вызовет перерисовку списка, который является целью, например, если это был объект типа Список2, то он будет перерисован, при этом его выбранный пункт будет вести себя аналогично - перерисует свой таржет. Схема с промежуточными объектами-таржетами может показаться громоздкой, но зато она "развязывает" виджет от его цели. Аналогом может служить указатель (или несколько указателей) на функцию, которая выполняет целевые действия. Но реализация через объект получается компактнее, проще - ведь все его методы, выполняющие действия по отношению к таржету, заключены в одном месте, кроме того, объект может кроме функций иметь какие-то служебные данные и вспомогательные функции, чтобы иметь возможность производить какие-то более нетривиальные действия, не привязываясь ни к виджету-владельцу, ни к цели. Это даёт расширяемость. Итоговое подключение состоит из создания объекта-таржета и передачи указателя на него виджету: CODE TList1 List1; TList2 List2_1; TList2 List2_2; TList2 List2_3; ... TListTarget ListTarget2_1(&List2_1); TListTarget ListTarget2_2(&List2_2); TListTarget ListTarget2_3(&List2_3); ... List1.add_item( new TListItem(&ListTarget2_1,...) ); List1.add_item( new TListItem(&ListTarget2_2,...) ); List1.add_item( new TListItem(&ListTarget2_3,...) ); ... Возможно, сумбурно написано - сложно, не зная тонкостей задачи, написать коротко и точно. Данный пример преследовал цель продемонстрировать принцип. Имена типов и объектов, конкретная реализация функций могут (и должны) быть своими. Честно говоря, мне самому не доставляет восторга такая схема, несколько громоздко, на мой взгляд. Но она работает и нет проблем с "завязками". Если у кого-то есть на примете более лёгкий и логичный вариант, но в то же время гибкий и удобный, я удовольствием бы ознакомился. QUOTE (mdmitry @ Sep 13 2012, 20:04)  Система меню, IMHO, совокупность связанных меджу собой однородных (или почти) объектов. К объектам можно отнести и другие элементы GUI, такие как, листбоксы, эдитбоксы и др. Объект может быть визуализирован, причем на разных экранах (размеры, цвета) визуализация получается разная. Отсюда вопрос: имеет ли смысл делать виджеты, завязанные на графическое представление и дающие необходимый функционал? Альнернатива: объекты хранят информацию, связи и взаимодействия (передча управления друг другу). Графический драйвер обеспечивает необходимую визуализацию. Смена экрана означает только смену драйвера. А кто отвечает за собственно внешний вид виджетов? Их размеры, цвета и прочее.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|