Псевдографика. Рисование линий, рамок и таблиц в текстовой моде |
Псевдографика. Рисование линий, рамок и таблиц в текстовой моде |
Lapp |
4.06.2011 14:27
Сообщение
#1
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Псевдографика - это рисование линий (только горизонтальных и вертикальных) в текстовой моде посредством специальных символов. Во времена DOS эта возможность выглядела крайне привлекательно. Символы псевдографики размещаются во второй половине кодов ASCII, причем в в некоторых национальных кодировках они конфликтуют с буквами национального алфавита, что нехорошо. В кодировке 866 (которая в основном и использовалась в DOS) с этим все в порядке, и есть возможность и рисовать рамочки и таблицы, и писать по-русски.
Основная особенность, которая делает всю эту кухню сложной для "ручного" применения - это сопряжение линий на поворотах и пересечениях (что делается подставлением на пересечение специального символа). Линии бывают одинарные и двойные - это добваляет шарму, но немало усложняет ситуацию. Код, в котором вручную набраны рамки (скажем, на титульном листе) выглядит крайне громоздко и непритязательно. А слегка подправить текст в рамке - занятие не для слабонервных.. )) В предствленном модуле эта задача решена - линии сопрягаются между собой автоматически. Символы псевдографики в кодировке 866 простираются от 176 до 222 номера: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Такую табличку вы всегда можете вывести простеньким двойным циклом, вроде такого: varПри внимательном взгляде на этот набор символов вы обнаружите, что он обладает как некоторой полнотой, так и ограничениями. Например, во всей полноте представлены символы перехода с одинарной на двойную линию при поворотах. Но при этом совершенно отсутствуют переходы на прямых участках (даже на пересечениях - и это совершенно оправдано, если вникнуть. Короче говоря, возможность рисовать талицы/рамочки в тексте была и есть, но если раньше она была весьма и весьма востребована (скажем, все менюшки в тексте делались с ее помощью), то сейчас про нее мало кто и помнит. Но время от времени все же всплывает.. Например, недавно проскочила тема про судоку, в которой автор пытался рисовать доску именно псевдографикой. Она и побудила меня полезть в архивы и вытащить на свет мой юнит аж 1993 г (!!)).. Его, конечно, пришлось несколько переделать (в оригинале использовался прямой доступ к видеопамяти) и урезать (многое было нужно только для меню), но основная функциональность сохранена. Этот модуль использует CRT, и это его основной минус. CRT не предоставляет функциональности чтения видеопамяти, и приходится заводить промежуточный массив. Размер этого массива задан константами и может быть изменен при компиляции (у меня он задан с приличным запасом). В модуле только четыре процедуры: - рисование горизонтальной линии; - рисование вертикальной линии; - рисование прямоугольника; - очистка промежуточного массива. Пояснения.. При пересечении или касании, а также близком расположении линии взаимодействуют между собой. Нужно хорошо понимать, как именно это происходит, чтобы добиться нужного результата. Нарисованная линия остается в промежуточном массиве до тех пор, пока он не будет очищен. Все линии, проведенные после нее (но до очистки буфера) и пересекающие или касающиеся ее будут по возможности сопряжены с ней. Простой пример показывает, что я имею в виду:
Тут видны как желательные эффекты, так и нежелательные (звездочки, ко всему прочему, означают места, где сопряжение оказалось принципиально невозможным). Тут все линии взаимодействуют между собой, даже если это не нужно, нежелательно или вредно. Эта картинка была произведена с помощью следующего кода, использующего рассматриваемый юнит: uses В конце программы есть закомментированная строка, которая представляет собой вызов очистки буфера. Если мы раскомментируем ее, результирующая картинка будет выглядеть так: ╔═════════════════════════════════════════════════════════╕ Тут мы видим просто набор прямоугольников - некоторые "внизу", другие "поверх" них. Этот пример поясняет, зачем и как следует вызывать очистку буфера. И последнее. Этот юнит, как я уже сказал, вряд ли представляет какую-либо практическую ценность. Но он может служить демонстрацией подхода к организации того, что кажется на первый взгляд неорганизуемым )). { рисование в текстовой моде символами псевдографики -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Lapp |
15.06.2011 5:48
Сообщение
#2
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Вариант кода, доработанный IUnknown с целью убрать ложку дегтя (unit CRT). Он, по идее, должен быть системонезависимым (не проверялось пока) и при этом все же компилиться под TP/BP!! (дань традиции, видимо)).
код (Показать/Скрыть)
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Текстовая версия | 16.11.2024 16:25 |