Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для Gilford
92 / 74 / 24
Регистрация: 31.03.2013
Сообщений: 257

Меню для консольной программы

05.04.2021, 08:31. Показов 985. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Столкнулся с проблемой, что не могу создать меню с множеством подменю.

"Главное меню" сделал и работает, но не учел, что ещё подменю может быть несколько уровней.
Есть абстрактный класс для пунктов меню
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
    public abstract class Menu
    {
        public virtual void PrintMenu()
        {
            Console.WriteLine("Default menu   [▄▄ ]60%\n\nDefault default");
        }
        public virtual string Ok_Click() => "OK";
        public virtual string Menu_Click() => "Menu";
        public virtual string Cancel_Click() => "Cancel";
    }

Есть класс, который все менюшки собирает в массив и работает с ним (List<> нельзя использовать, если что)
Кликните здесь для просмотра всего текста
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
public class MenuBar
    {
        private int currIndex;
        public Menu[] Items { get; private set; }
 
        #region Свойства
        public Menu Current
        {
            get
            {
                return Items[currIndex];
            }
        }
 
        public int Length { get; private set; }
 
        private int Capacity { get; set; }
        #endregion
 
        public MenuBar()
        {
            Clear();
        }
 
        public bool Next()
        {
            currIndex++;
 
            if (currIndex == Length)
            {
                currIndex--;
                return false;
            }
 
            return true;
        }
 
        public bool Previous() 
        {
            if (currIndex == 0)
                return false;
 
            currIndex--;
 
            return true;
        }
 
        public void Add(Menu newMenu) 
        {
            if (Length == Capacity)
                ReloadItems();
 
            Items[Length] = newMenu;
 
            Length++;
        }
 
        public void Remove(int index) 
        {
            if (index >= Length)
                return;
 
            Menu[] menus = new Menu[Capacity];
 
            Items.CopyTo(menus, 0);
 
            Items = new Menu[Capacity];
 
            var n = 0;
 
            for (int i = 0; i < Length; i++)
            {
                if (index == i)
                    i++;
 
                Items[n] = menus[i];
 
                n++;
            }
 
            Length--;
            currIndex = 0;
        }
 
        public void Clear() 
        {
            Capacity = 8;
            Length = 0;
            currIndex = 0;
 
            Items = new Menu[Capacity];
        }
 
        private void ReloadItems()
        {
            Capacity = Length * 2;
 
            Menu[] menus = new Menu[Capacity];
 
            Items.CopyTo(menus, 0);
 
            Items = menus;
        }
    }

Проблема в том, что меню2, например, может иметь подменю.
Миниатюры
Меню для консольной программы  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.04.2021, 08:31
Ответы с готовыми решениями:

Автоматическое управление работой консольной программы
Есть программа x.bat. Вся работа с ней состоит из запуска, ввода «1» и нажатия «Enter», после чего она сама закрывается. Для удобства нужно...

Оконная версия консольной программы работает некорректно
Попробовал переделать из консольного приложения под win forms, но возникло 2 проблемки 1) Программа зависает пока клиент не подключится ...

Условие верное, но код не выполняется. Окончание консольной программы через делегат
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using...

3
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
06.04.2021, 01:22
C#
1
2
3
4
5
public class MenuItem
{
     public string Name { get; set; }
     public List<MenuItem> SubMenu { get; set; } // заменить на массив если ТЗ/религия не позволяет List
}
0
 Аватар для Gilford
92 / 74 / 24
Регистрация: 31.03.2013
Сообщений: 257
06.04.2021, 07:30  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
ТЗ/религия не позволяет List
Мне надо будет на с++ ещё переводить.

Тут ещё проблемка:
Цитата Сообщение от Gilford Посмотреть сообщение
подменю может быть несколько уровней
Дело в том, что получить текущий элемент просто - вызывать menus.Current и не придется искать, где находимся.
У меня была мысль про твое решение, но отпала сразу, т.к. у подменю может быть ещё меню и выглядеть будет так: menus.Items[0].SubMenu.SubMenu

Думаю может реализовать какую-то фичу, типа некоторые элементы идут от родителя?
Пример:
Есть Items
Code
1
2
3
4
5
0 Меню 0
1 Меню 1
2 Меню 2
3 Меню 3
4 Меню 4
И как бы через свойства указать, что у Меню 3 и 2 родитель Меню 0. Или это уже костыли какие-то?
Code
1
2
3
4
5
0 Меню 0
   |3 Меню 3
   |2 Меню 2
1 Меню 1
4 Меню 4
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
06.04.2021, 10:54
Gilford, Current через рекурсию обычно делают.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.04.2021, 10:54
Помогаю со студенческими работами здесь

Gui для консольной программы
Всем привет. Мне надо создать gui оболочку для готовой консольной программы, чтобы пользователь вводил в textbox'ы нажимал кнопку и...

Добавление аргументов для консольной программы
Здравствуйте! Подскажите пожалуйста, имеется вот такая форма, все эти поля являются аргументами для exe, который запускается в командной...

Создание интерфейса для консольной программы
Имеется следующий код: using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Создание консольной программы для нахождения числа
Дано натуральное число n (n&gt;10) . Найти предпоследнее число перед n.Спасибо за любую помощь.

Создание консольной программы для вычисления произведение чисел
Дано натуральное число n. Посчитать P=(1+1/1^2)*(1+1/2^2)*....*(1-1/n^2).Спасибо за любую помощь.


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru