чтение набора символов из потока ввода консоли - PullRequest
0 голосов
/ 12 апреля 2010

Я пытаюсь сделать что-то вроде текстового поля для консольного приложения, Как ограничить Console.In только для чтения определенного количества символов из пользовательского ввода?

EDIT

Я не могу пойти по петле Readkey(), мне все еще нужно взаимодействовать с этим полем, например, использовать клавиши со стрелками для перемещения влево и вправо, Del или Backspace для редактирования ввода и некоторые некоторые клавиши для проверки. ReadKey печатает эти клавиши как "" (пробел), и я не могу рассчитывать на количество нажатых клавиш, поскольку может произойти переопределение (а в этом проекте нам нужно переписать!)

Я думаю о чем-то вроде чтения из буфера в указанном месте и установки курсора в другое место, когда достигнуто максимальное поле. это можно сделать таким образом?

каковы мои шансы? мне действительно нужна твоя помощь

Ответы [ 3 ]

1 голос
/ 12 апреля 2010

Мне было любопытно посмотреть, можно ли это сделать, вот что я придумал:

    private static string ReadBox(int maxLen)
    {
        var sb = new StringBuilder();
        int pos = 0;
        bool done = false;      
        int start = Console.CursorLeft;

        while (!done)
        {
            var ki = Console.ReadKey(true);

            switch (ki.Key)
            {
                case ConsoleKey.Enter:
                    done = true;
                    break;

                case ConsoleKey.Delete:
                    // todo
                    break;

                case ConsoleKey.Backspace:
                    if (pos > 0)
                    {
                        pos -= 1;
                        sb.Remove(pos, 1);
                    }                                
                    break;

                case ConsoleKey.LeftArrow:
                    if (pos > 0) pos -= 1;
                    break;

                case ConsoleKey.RightArrow:
                    if (pos < sb.Length) pos += 1;
                    break;

                default:
                    if (ki.KeyChar >= ' ')  // simple filter
                    {
                        sb.Insert(pos, ki.KeyChar);
                        pos += 1;
                    }
                    break;
            }
            Console.CursorLeft = start;
            Console.Write(sb.ToString());
            Console.CursorLeft = start + pos;                
        }
        return sb.ToString();
    }

Обратите внимание, что мы на самом деле здесь не используем буфер Console.In, он обойден. О, и я упустил особенность, которая начала все это, максимальная длина. Но вы можете легко реализовать это.

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

1 голос
/ 12 апреля 2010

Вы не можете устанавливать ограничения для Console.ReadLine () и т. Д. Но вы можете, например, создать цикл Console.ReadLine () и проверить ввод в нем.

0 голосов
/ 12 апреля 2010

Вы можете вызвать ReadKey в цикле и передать true для предотвращения эха.

...