Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2016, 13:53   #1
Ковер
Пользователь
 
Регистрация: 18.09.2016
Сообщений: 30
По умолчанию сразу вводить значения без предварительного нажатия Enter? Т.е. ставим курсор напротив нужного пункта, печатаем цифры, нажимаем Enter, и все.

Приветствую всех.
Я тут учусь понемногу, и для закрепления знаний пишу игру.

Имеется такое меню:


Курсор может находиться в трех местах окна, его положение заранее определено.
Код:
CursorInSettings = new int[6] {string1.Length + 1, 7, string2.Length + 1, 9, string3.Length + 1, 11};
В каком именно положении, определяет спец. счетчик (принимает значения от 0 до 2).
Код:
positionOfCursorInSettings = 0;
Запускается цикл с такой функцией:
Код:
        static void SettingsController()
        {
            ConsoleKeyInfo key = Console.ReadKey();
            switch(key.Key)
            {
                case ConsoleKey.Escape:
                    exitFromSettings = true;
                    break;
                case ConsoleKey.UpArrow:
                    MoveInSettings(1);
                    break;
                case ConsoleKey.DownArrow:
                    MoveInSettings(2);
                    break;
                case ConsoleKey.Enter:
                    ChangeSettings(positionOfCursorInSettings);
                    break;

            }
        }
Как написано в том окне, чтобы изменить значение, надо напротив нужного показателя нажать Enter, ввести его, и опять нажать.
Код:
static void ChangeSettings(byte x)
{
            if (x == 0)
            {
                SetCursorInSettings(); //ставит курсор туда, где он был
                fieldSizeX = Convert.ToByte(Console.ReadLine());
            }
            if (x == 1)
            {
                SetCursorInSettings(); //ставит курсор туда, где он был
                fieldSizeY = Convert.ToByte(Console.ReadLine());
            }
            if (x == 2)
            {
                SetCursorInSettings(); //ставит курсор туда, где он был
                difficultLevel = Convert.ToByte(Console.ReadLine());
            }
        }
Ну так вот, можно ли как-то сразу вводить значения без предварительного нажатия Enter? Т.е. ставим курсор напротив нужного пункта, печатаем цифры, нажимаем Enter, и все.
Изображения
Тип файла: png 9.png (11.9 Кб, 107 просмотров)
Ковер вне форума Ответить с цитированием
Старый 24.09.2016, 14:03   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в первом свиче вы можете обрабатывать и остальные клавиши, такие как цифры.
потом подвыводить нужный текст и тп.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.09.2016, 14:10   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А что в MoveInSettings и SetCursorInSettings?

Ну наверно можно как-нибудь проверять/запоминать остальные символы (цифры) и Enter там же где ввод стрелок.
Но вообще в консоли обычно делают как-нибудь проще
Например просто ввод номера пункта (1-3) и значение, или давать по очереди вводить все значения (пустая строка — не менять), или в аргументах командной строки.

Если надо всякие такие удобства, то проще GUI приложение делать (WinForms, WPF).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.09.2016, 14:12   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Но вообще в консоли обычно делают как-нибудь проще
Например просто ввод номера пункта (1-3) и значение, или давать по очереди вводить все значения (пустая строка — не менять), или в аргументах командной строки.
ага, то-то ncurses существует.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.09.2016, 14:22   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну у автора ж не ncurses и придется свои велосипеды изобретать.

И я не помню когда последний раз видел современное приложение использующее такой подход.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 24.09.2016 в 14:25.
Alex11223 вне форума Ответить с цитированием
Старый 24.09.2016, 14:49   #6
Ковер
Пользователь
 
Регистрация: 18.09.2016
Сообщений: 30
По умолчанию

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

Цитата:
А что в MoveInSettings и SetCursorInSettings?
Код:
static void MoveInSettings (byte x)
        {
            if (x == 1) //верх
            {
                if (positionOfCursorInSettings == 0)
                    positionOfCursorInSettings = 2;
                else
                    positionOfCursorInSettings--;
            }
            if (x == 2) //вниз
            {
                if (positionOfCursorInSettings < 2)
                    positionOfCursorInSettings++;
                else
                    positionOfCursorInSettings = 0;
            }
        }

static void SetCursorInSettings()
        {
            if (positionOfCursorInSettings == 0)
                Console.SetCursorPosition(CursorInSettings[0], CursorInSettings[1]);
            if (positionOfCursorInSettings == 1)
                Console.SetCursorPosition(CursorInSettings[2], CursorInSettings[3]);
            if (positionOfCursorInSettings == 2)
                Console.SetCursorPosition(CursorInSettings[4], CursorInSettings[5]);
        }
Цитата:
Если надо всякие такие удобства, то проще GUI приложение делать (WinForms, WPF).
Я еще до этого не дошел
Ковер вне форума Ответить с цитированием
Старый 24.09.2016, 15:05   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ваш SettingsController вполне может обрабатывать цифры и подставлять их в текущее поле(вы храните его строкой, а в число переводите сами)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.09.2016, 15:26   #8
Ковер
Пользователь
 
Регистрация: 18.09.2016
Сообщений: 30
По умолчанию

У меня получилось.
Вот как это вышло вышло:
Были добавлены две переменные
Код:
static string total, secondPart;
и следующие изменения
Код:
static void SettingsController()
        {
            ConsoleKeyInfo key = Console.ReadKey();
            switch(key.Key)
            {
                case ConsoleKey.Escape:
                    exitFromSettings = true;
                    break;
                case ConsoleKey.UpArrow:
                    MoveInSettings(1);
                    break;
                case ConsoleKey.DownArrow:
                    MoveInSettings(2);
                    break;
                case ConsoleKey.NumPad1:
                    ChangeSettings(positionOfCursorInSettings, 1);
                    break;
                case ConsoleKey.NumPad2:
                    ChangeSettings(positionOfCursorInSettings, 2);
                    break;
                case ConsoleKey.NumPad3:
                    ChangeSettings(positionOfCursorInSettings, 3);
                    break;
                case ConsoleKey.NumPad4:
                    ChangeSettings(positionOfCursorInSettings, 4);
                    break;
                case ConsoleKey.NumPad5:
                    ChangeSettings(positionOfCursorInSettings, 5);
                    break;
                case ConsoleKey.NumPad6:
                    ChangeSettings(positionOfCursorInSettings, 6);
                    break;
                case ConsoleKey.NumPad7:
                    ChangeSettings(positionOfCursorInSettings, 7);
                    break;
                case ConsoleKey.NumPad8:
                    ChangeSettings(positionOfCursorInSettings, 8);
                    break;
                case ConsoleKey.NumPad9:
                    ChangeSettings(positionOfCursorInSettings, 9);
                    break;
            }
        }

static void ChangeSettings(byte x, byte y) //x - около какой строки, у - введенная цифра
        {
            ChangeSettingsText(y);

            if (x == 0)
            {
                SetCursorInSettings();
                fieldSizeX = Convert.ToByte(total);
            }
            if (x == 1)
            {
                SetCursorInSettings();
                fieldSizeY = Convert.ToByte(total);
            }
            if (x == 2)
            {
                SetCursorInSettings();
                difficultLevel = Convert.ToByte(total);
            }
        }

static void ChangeSettingsText(byte y)
        {
            SetCursorInSettings();
            Console.Write(y);
            secondPart = Console.ReadLine();
            total = Convert.ToString(y) + secondPart;
        }
Ковер вне форума Ответить с цитированием
Старый 24.09.2016, 15:35   #9
Ковер
Пользователь
 
Регистрация: 18.09.2016
Сообщений: 30
По умолчанию

Хотя строки SetCursorInSettings(); в функции ChangeSettings(byte x, byte y) – лишние
Ковер вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вводить числа в массив и заканчивать ввод нажатием кнопки Enter! Али Экспресс C# (си шарп) 2 28.12.2015 17:59
dbgrideh как заменить ctrl+enter на enter ? spotip Компоненты Delphi 0 11.09.2014 11:20
считка нажатия на Enter enjo Win Api 15 04.12.2012 16:37
borland c++ как вводить enter продолжения программы SMC512 Помощь студентам 0 13.12.2011 12:45
обработка нажатия ENTER(#13): что-то странное... D][mon Помощь студентам 0 13.10.2010 19:12