05 июля 2011

Console Application, немного эстетики

Как-то раз я уже рассказывал, что такое Console Application, как его создавать и как использовать. Но лично у меня не было больших нужд в консольных приложениях, правда недавно возникла необходимость написания именно такой утилиты. А именно упаковка файлов игры в один data-файл. Довольно удобно и ничего лишнего - передал несколько параметров командной строкой и вперед. Как известно, для вывода используем стандартные Write()/WriteLn().
Но одно удручает - из всего выводимого текста невозможно выделить какие-то важные моменты. Сразу приходит в голову "разукрашивание" слов и предложений, чтобы определенные элементы текста бросались в глаза.

Итак, пришлось изучить маленькие хитрости для более аккуратного вывода инфо-сообщений в консольных приложениях.
Мне было критично два момента:
  • цвет выводимого текста
  • сохранность всей информации на экране (за это отвечает размер буфера для текста)
В общем, приведу просто код, чтобы особо не затягивать с описательной частью.
По поводу цвета все просто, записав такое:

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7 OR 0);


мы укажем, чтобы у нас выводился стандартный серый текст (константа 7) на черном фоне (0).
Наверно, есть определенные константы под каждый цвет, но мне было лень искать и я оставил в числовом варианте.
После этого проблем с выделением информации нет. Приложение сразу запестрило всеми цветами радуги:


Но у меня оставалась еще одна проблема. После вывода большого объема текста (у меня в программе перечислялись упакованные файлы), скроллик окна не позволял подняться выше, чем определенное количество последних строк. Оказалось, есть ограничение в виде буфера экрана. Установить новые размеры можно, например, вот так:

const
  NewSize: TCoord = (x: 80; y: 600);
...
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), NewSize);

После этого у нас будет 600 строк буфера! Замечательно одним словом...
Выглядело у меня это так:



Вот такая незамысловатая информация на сегодня. В принципе, все это гуглится в течение 15-20 минут, но я решил собрать этот маленький код здесь и для себя в том числе, чтобы не рыскать заново, когда потребуется.

Сообщения, схожие по тематике:

7 коммент.:

  1. Классно, сколько 'консолил' не знал про это.

    ОтветитьУдалить
  2. Если 600 строк - то лучше перенаправить вывод в файл

    ОтветитьУдалить
  3. Удваиваю комментарий Bonart-а :)

    В целом, интересно, никогда не задумывался о таких мелочах :)

    ОтветитьУдалить
  4. Bonart, можно и в файл, согласен, но в моем случае это было бы лишним)).. по сути важна информация вначале и в конце...

    perfect daemon, да, согласен, мелочи, но у меня в тот момент было настроение именно заморочиться на мелочи))..

    ОтветитьУдалить
  5. Я не говорю, что это "фу, мелочи, я до такого даже не опускался".

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

    "Мелочь, а приятно" - вот подтекст моего комментария :)

    А "заморочиться на мелочи" - это мне тоже знакомо))

    ОтветитьУдалить
  6. perfect daemon, я наверно с запятыми намудрил и смысл моей фразы потерялся... я понял, что ты имеешь ввиду)).. подтекст моего сообщения был - "нужно было сделать быстро, но я все-таки не удержался, чтобы не погуглить о настройках цветов"))

    ОтветитьУдалить
  7. Еще немного о консольных приложениях можно посмотреть тут: http://delphiprog.it-fg.ru/?dir=programs
    Давненько писал, авось кому пригодится :)

    ОтветитьУдалить