Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 59

Управление сложной логикой управления элементами интерфейса

12.08.2018, 23:51. Показов 1310. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, Коллеги.

Допустим у нас есть 100+ элементов на диалоге, едитбоксы, чекбоксы, радиобатоны, кнопи...
Но их доступность сильно зависит от состояния друг друга.
Сейчас пытаюсь управлять их доступностью путем вложенных if/else. Но в результате код очень сильно усложняется и читать, и править его довольно сложно (

Вопрос в следующем, есть ли какие либо методики, подходы, паттерны проектирования для организации сложной логики управления элементами на форме, что бы код был более элегантный и удобно читаемым?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.08.2018, 23:51
Ответы с готовыми решениями:

Управление элементами управления
Как сделать управление полем(ями) со списком (элемент управления формы), через кнопку (элемент управления формы). Не доходит как сделать...

Создание "места" для управления логикой БД
1) Есть база данных, пара агентов, один из которых раз в день прогуливаеться по базе и удаляет устаревшие по некоторым критериям документы....

Создайте пользовательскую форму с элементами управления TextBox и элементом управления RefEdit
Создайте пользовательскую форму с элементами управления TextBox и элементом управления RefEdit. С помощью элемента RefEdit - запросите у...

6
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
13.08.2018, 04:25
Цитата Сообщение от Azmoday Посмотреть сообщение
Сейчас пытаюсь управлять их доступностью путем вложенных if/else
1. Каждый элемент гуя есть объект содержащий, как минимум два метода:
- Метод самоотрисовки.
- Метод обработки клика/драга/дропа.
2. Также есть бул-массив состояний.
3. Юзверь меняет состояние ячеек массива_состояний через методы клика.
4. По особому событию проходим циклом по методам отрисовки, работа которых зависит от массива состояний.
5. Все.

Да и кстати, не стесняйтесь использовать ООП, то бишь С++, а не голую сишку,
он как раз и был изобретен для того чтобы можно было без паники, не спеша управлять сложностью.

http://sklv.org/gui.patterns/
1
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 59
13.08.2018, 11:20  [ТС]
Спасибо, но это не совсем то что я спрашивал.

Приложение написано на MFC SDI.

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void CMyDialog::ChangeStateControls()
{
if (m_bModeSingleMulti)
    {
        GetDlgItem(IDC_RDO_MODESTOPTIMENUM_NUM)->EnableWindow(FALSE);
        GetDlgItem(IDC_RDO_MODESTOPTIMENUM_TIME)->EnableWindow(FALSE);
        GetDlgItem(IDC_EDT_TIMELIMITS)->EnableWindow(FALSE);
        GetDlgItem(IDC_EDT_COUNTLIMITCOMANDS)->EnableWindow(FALSE);
 
        GetDlgItem(IDC_EDT_TIMELIMITS)->EnableWindow(FALSE);
        GetDlgItem(IDC_EDT_COUNTLIMITCOMANDS)->EnableWindow(FALSE);
    }
    else
    {
        if (m_bModeDisplay)
        {
            GetDlgItem(IDC_RDO_MODESTOPTIMENUM_NUM)->EnableWindow(TRUE);
            GetDlgItem(IDC_RDO_MODESTOPTIMENUM_TIME)->EnableWindow(TRUE);
 
            if (m_bStopTimeNum)
            {
                GetDlgItem(IDC_EDT_TIMELIMITS)->EnableWindow(TRUE);
                GetDlgItem(IDC_EDT_COUNTLIMITCOMANDS)->EnableWindow(FALSE);
            }
            else
            {
                GetDlgItem(IDC_EDT_TIMELIMITS)->EnableWindow(FALSE);
                GetDlgItem(IDC_EDT_COUNTLIMITCOMANDS)->EnableWindow(TRUE);
            }
        }
        else
        {
            GetDlgItem(IDC_RDO_MODESTOPTIMENUM_NUM)->EnableWindow(FALSE);
            GetDlgItem(IDC_RDO_MODESTOPTIMENUM_TIME)->EnableWindow(FALSE);
 
            GetDlgItem(IDC_EDT_TIMELIMITS)->EnableWindow(FALSE);
            GetDlgItem(IDC_EDT_COUNTLIMITCOMANDS)->EnableWindow(FALSE);
        }
    }
}
Как видно из примера, при увеличении критериев оценки, начинает сильно усложняться код, через вложенность.
Вот и хотелось узнать, может уже придуман более удобный велосипед? ))
0
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
13.08.2018, 16:04
Лучший ответ Сообщение было отмечено Azmoday как решение

Решение

Цитата Сообщение от Azmoday Посмотреть сообщение
Как видно из примера
7,6 дублируют 10,11

могу посоветовать прием, который я сам использовал,
чтобы сделать текст более наглядным:
убрать неинформативный захламляющий текст в эпицентре логических развязок:
без лишнего фанатизма)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//----------------------------------------------------------------------------->
#define III_(V) GetDlgItem(IDC_##V)->EnableWindow(TRUE);
#define OOO_(V) GetDlgItem(IDC_##V)->EnableWindow(FALSE);
 
// Теперь мы можем лицезреть в одном окне всю эту функцию целиком! ))
void CMyDialog::ChangeStateControls()//----------------------------------------v
{
    if (m_bModeSingleMulti)
    {    STOPTIMENU()
    }
    else
    {
        if (m_bModeDisplay)
        {   III_(RDO_MODESTOPTIMENUM_NUM);
            III_(RDO_MODESTOPTIMENUM_TIME);
 
            if (m_bStopTimeNum)
            {   III_(EDT_TIMELIMITS);
                OOO_(EDT_COUNTLIMITCOMANDS);
            }
            else
            {   OOO_(EDT_TIMELIMITS);
                III_(EDT_COUNTLIMITCOMANDS);
            }
        }
        else
        {   STOPTIMENU()
        }
    }
}//----------------------------------------------------------------------------^
 
// По завету Макконнелла:
// "Упаковывывайте операции в более осмысленные группы."
void STOPTIMENU()
{   OOO_(RDO_MODESTOPTIMENUM_NUM);
    OOO_(RDO_MODESTOPTIMENUM_TIME);
    OOO_(EDT_TIMELIMITS);
    OOO_(EDT_COUNTLIMITCOMANDS);
}
 
#undef III_
#undef OOO_
//-----------------------------------------------------------------------------.


ну, еще можно, в данном примере писать ваще без if'ов.
для текущего примера:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//----------------------------------------------------------------------------->
void CMyDialog::ChangeStateControls()
{
    GetDlgItem(IDC_RDO_MODESTOPTIMENUM_NUM)->EnableWindow(
            !m_bModeSingleMulti && 
             m_bModeDisplay
        );
        
    GetDlgItem(IDC_RDO_MODESTOPTIMENUM_TIME)->EnableWindow(
            !m_bModeSingleMulti && 
             m_bModeDisplay
        );
        
    GetDlgItem(IDC_EDT_TIMELIMITS)->EnableWindow(
            !m_bModeSingleMulti && 
             m_bModeDisplay     && 
             m_bStopTimeNum
        );
    
    GetDlgItem(IDC_EDT_COUNTLIMITCOMANDS)->EnableWindow(
            !m_bModeSingleMulti && 
            !m_bModeDisplay     && 
            !m_bStopTimeNum
        );
}
//-----------------------------------------------------------------------------.
1
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 59
14.08.2018, 09:21  [ТС]
Спасибо, интересные подходы.

7,6 дублируют 10,11 - это не так, там разные элементы )
0
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
14.08.2018, 11:37
Цитата Сообщение от Azmoday Посмотреть сообщение
7,6 дублируют 10,11 - это не так, там разные элементы )
вы так шутите?
)
0
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
15.08.2018, 13:54
7,8 и 10,11 мда,какие шутки))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2018, 13:54
Помогаю со студенческими работами здесь

Разработка сложной базы данных и интерфейса к ней на ASP.NET MVC 5
Добрый день форумчане. Есть товары, у которого есть стандартные поля, но вот поставлена задача расширить эту модель полями специфичными для...

Конструирование файлов с элементами сложной структуры
Создать файл записей. Программу оформить с помощью текстового меню, включающего: • Создание файла • Печать файла • Обработка файла ...

Приложение со стандартными элементами интерфейса
Составить программу расчета стоимости покупки в магазине бытовой техники с использованием бонусной системы. Компьютер предлагает выбрать...

Построение экранного интерфейса. Управление процессами
Создать главное окно с областью заголовка, рамкой , элементами управления (кнопки свертования - развертования , линейка с вертикальной...

Ознакомление с основными элементами интерфейса C++ Builder
Добрый вечер!! В техникуме дали задание 3 скрина и файл я скинул, к сожаления я полный ноль в этом, подскажите пожалуйста как сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru