Forth http://fforum.winglion.ru/ |
|
*простой текстовый viewer http://fforum.winglion.ru/viewtopic.php?f=19&t=2947 |
Страница 1 из 2 |
Автор: | mOleg [ Вт июл 02, 2013 10:32 ] |
Заголовок сообщения: | *простой текстовый viewer |
Написать определение, позволяющее просматривать текст из файла, заданного строкой asc # VIEW ( asc # --> ) Текст должен отображаться в прямоугольной области на экране (например в консоли), вылазящие за пределы отображаемой области символы не должны отображаться. Должна быть реализована реакция на следующие клавиши: esc - выход из просмотра up - вверх на одну строку down - вниз на одну строку left - влево на один символ (сдвигать все строки) right - вправо на один символ (сдвигать все строки, позволяя увидеть символы, изначально находящиеся за пределами области отображения текста) home - в начало текста end - в конец текста PgUp - на страницу вверх PgDn - на страницу вниз |
Автор: | mgw [ Вт июл 02, 2013 16:38 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
Код: \ Просмотрщик FORTH файлов. Использует цвет для отображения комментариев. \ Использует Qt библиотеку. \ MGW 21.01.11 REQUIRE MGW ~mgw/qtlib.f // Поддержка QT // В программе много лишних определений, т.к. пришлось изменить алгоритм на ходу. // В начале я пытался форматировать текст через теги HTML, но при таком подходе // убираются все ведущие пробелы. От такого форматирования остался только тег HR. // Раскраска осуществляется втроенным объектом QT. Интересно то, что текст можно редактировать // прямо в окне (без сохранения) и при этом вся подсветка синтаксиса сохраняется. // Надо проверить возможность вставки выпад списка, а вообще так и до IDE не далеко .... // ----------------------------------------------- // Добавлено меню, горячие кнопки. Подключена возможность работы с различными // кодировками. fQApplication NEW app1 // Ссылка на QApplicatin (обязательно) fQString NEW qs1 // Строка - сообщение об ошибке, основная строка fQString NEW qKom2 // : fQString NEW qKom3 // : fQString NEW qHR3 // Шаблон замены fQMessageBox NEW box1 // Окно информации fQMessageBox NEW boxviewPath // Окно для строки с полным путем fQString NEW qsTMP // Строка QString для вывода информации в окно fQTextEdit NEW te1 // ЭкранныйРедактор fQFont NEW font1 // Шрифт fQFont NEW font2 // Шрифт fSyntaxHL NEW higl1 // Раскраска текста fQString NEW qsTMP2 // Строка QString для вывода информации в окно fQColor NEW color1 fQColor NEW color2 fQChar NEW qcTek fQChar NEW qcTek-1 fQChar NEW qcTek+1 // --------------------- 2 версия ------ строка сообщений + меню ------- if=W Library@ msvcrt 2 CDECL-Call" strcpy" strcpy // ( Aоткуда Aкуда -- ) Копировать strz if=L Library@ libc 2 CDECL-Call" strcpy" strcpy // ( Aоткуда Aкуда -- ) Копировать strz // Функции для вычисления имен файлов if=W Library" kernel32.dll" kernel32 if=W Library@ kernel32 3 WINAPI-Call" GetLongPathNameA" GetLongPathName if=W Library@ kernel32 4 WINAPI-Call" GetFullPathNameA" GetFullPathName 0x4000000 CONSTANT Qt:ControlModifier 0x51 CONSTANT Qt:Key_Q 0x47 CONSTANT Qt:Key_G 0x1000000 CONSTANT Qt:KeyEsc 0x1000030 CONSTANT Qt:Key_F1 0x1000031 CONSTANT Qt:Key_F2 0x1000032 CONSTANT Qt:Key_F3 0x1000033 CONSTANT Qt:Key_F4 fQMainWindow NEW wc1 fQStatusBar NEW sb1 fQMenuBar NEW menubar1 fQAction NEW actDOS866 fQAction NEW actWin1251 fQAction NEW actUTF8 fQAction NEW actKOI8R fQAction NEW actExit fQAction NEW actAboutQT fQAction NEW actAbout fQAction NEW actviewPath fQMenu NEW menuКодировка fQMenu NEW menuAbout fQDialog NEW aboutDialog fQTextEdit NEW aboutText fQLayout NEW aboutLayout fQDialog NEW viewPath fQTextEdit NEW viewPathText fQLayout NEW viewPathLayout 256 CONST$ strbuf // Буфер под прочитанную строку 256 CONST$ NameFile // Строка под имя файла VARIABLE fid // Идентификатор открытого файла // Буфера для преобразования имен файлов 256 CONSTANT РазмерБуфераИмениФайла РазмерБуфераИмениФайла CONST$ ВходноеИмяФайла РазмерБуфераИмениФайла CONST$ ВыходноеИмяФайла VARIABLE АдресИмяФайла : msgboxError // ( Astr u -- ) Отобразить сообщение об ошибке DROP qsTMP.set qsTMP.@ S" Внимание ошибка!" DROP qs1.set qs1.@ 1 // Количество кнопок (см докум по QMessageBox) 3 // 3=Критическое 1=информ 2=внимание 4=вопрос 0 // te1.@ // Родитель для окна сообщения box1.msgbox DROP ; VARIABLE isChange // Была замена? : TYPE_te1 // Вот оно, форматирование HTML qs1.set // Базовая стока в qs1 FALSE isChange ! 0 qKom3.@ qs1.indexOf DUP 0< IF // Не найдено DROP ELSE // Найдено DUP 0 = IF isChange @ // а замена уже была? IF // да была замена ELSE S" <hr></hr>" DROP qs1.set strbuf qsTMP.set qsTMP.@ qs1.append TRUE isChange ! THEN // 2 0 qHR3.@ qs1.replace ELSE THEN DROP THEN 0 qKom2.@ qs1.indexOf DUP 0< IF // Не найдено DROP ELSE // Найдено isChange @ // а замена уже была? IF // да была замена ELSE S" <hr></hr>" DROP qs1.set strbuf qsTMP.set qsTMP.@ qs1.append TRUE isChange ! THEN DROP THEN qs1.@ te1.append // Строку в окно te1 ; : ОбработатьФайл // ( -- ) Под влиянием обсуждения на форуме, русский в именах NameFile COUNT R/O OPEN-FILE // Открываем файл 0= IF fid ! // Если нет ошибки открытия файла, то запоминаем его хендл // Проверим работу кодовой таблицы // Поддерживаются: IBM 866, KOI8-R, UTF-8, Windows-1251, UTF-16 и ещё штук 20. NameFile 1+ qsTMP.set qsTMP.@ wc1.setwindowtitle NameCodec$ qsTMP.set qsTMP.@ sb1.setMes BEGIN strbuf 255 fid @ READ-LINE 0<> IF S" Ошибка чтения файла -> " strbuf A>CS strbuf NameFile COUNT CS+A strbuf COUNT msgboxError BYE THEN WHILE // Если чтение строки =TRUE DUP 0 > IF DUP 1- strbuf + C@ 32 < IF 1- THEN THEN strbuf + 0 SWAP C! // Запишем 0 в конец прочитанной строки strbuf TYPE_te1 // Строку в окно REPEAT DROP fid @ CLOSE-FILE 0<> IF S" Ошибка закрытия файла -> " strbuf A>CS strbuf NameFile COUNT CS+A strbuf COUNT msgboxError BYE THEN NameFile COUNT DROP qsTMP.set qsTMP.@ te1.setwindowtitle // Имя файла в заголовок окна ELSE DROP S" Ошибка открытия файла -> " strbuf A>CS strbuf NameFile COUNT CS+A strbuf COUNT msgboxError BYE THEN ; VARIABLE ДлинаСтроки VARIABLE БылКомментарий // N - да, был -1 нет VARIABLE БылаКавычка // N - да, был -1 нет VARIABLE ТекСимвол : ТекущийСимвол // ( Nпозиции -- Char ) Выдать след символ за позицией в строке qcTek+1.@ qsTMP2.at qcTek+1.unicode ; : ФорматируемСтроку // ( НачПоз Длин -- ) // 2DUP font2.@ higl1.formatFont // мда, и цвет и шрифт одно и тоже :( а зря .. // по одному и тому же участку нельзя применять несколько форматов color1.@ higl1.formatColor ; :NONAME // ( Aqstr -- ) Обработчик раскраски qsTMP2.! // Схватили параметр (строку) из Qt -1 БылКомментарий ! -1 БылаКавычка ! qsTMP2.length ДлинаСтроки ! ДлинаСтроки @ 0= IF qsTMP2.@ EXIT THEN // строка пустая, уйди в C++, положив возврат ДлинаСтроки @ 0 DO I ДлинаСтроки @ = IF S" I=N" _3W _3 THEN I qcTek.@ qsTMP2.at qcTek.unicode ТекСимвол ! // Взяли текущий символ // Ловим '\' ТекСимвол @ 92 = IF // Это '\' I 1+ ДлинаСтроки @ < IF I 1+ ТекущийСимвол ELSE 0 // ( в послед позиции строки THEN 33 < IF // След сим пробел I 0 > IF // ком но не в первой позиции I 1- ТекущийСимвол 33 < IF I ДлинаСтроки @ ФорматируемСтроку LEAVE ELSE THEN ELSE // Точно коментарий, стоящий в начале строки 0 ДлинаСтроки @ ФорматируемСтроку LEAVE THEN ELSE // Привычка писать ELSE THEN сразу THEN // меньше ошибок и проще найти алтер. ветку ELSE THEN // Ловим '//' ТекСимвол @ 47 = IF // Это '/' I 1+ ДлинаСтроки @ < IF I 1+ ТекущийСимвол ELSE 0 // ( в послед позиции строки THEN 47 = IF // След сим / I 2 + ДлинаСтроки @ < IF I 2 + ТекущийСимвол ELSE 32 // ( в послед позиции строки THEN 33 < IF I 0 > IF // ком но не в первой позиции I 1- ТекущийСимвол 33 < IF I ДлинаСтроки @ ФорматируемСтроку LEAVE ELSE THEN ELSE // Точно коментарий, стоящий в начале строки 0 ДлинаСтроки @ ФорматируемСтроку LEAVE THEN ELSE THEN ELSE THEN ELSE THEN // Ловим '(' ТекСимвол @ 40 = IF // Это '(' I 1+ ДлинаСтроки @ < IF I 1+ ТекущийСимвол ELSE 32 // ( в послед позиции строки THEN 33 < IF // След сим пробел I 0 > IF // ком но не в первой позиции I 1- ТекущийСимвол 33 < IF // Комм не в пер поз I БылКомментарий ! ELSE THEN ELSE // Точно коментарий, стоящий в начале строки 0 БылКомментарий ! THEN ELSE THEN ELSE THEN // Ловим ')' ТекСимвол @ 41 = IF // Это ')' I 1+ ДлинаСтроки @ < IF I 1+ ТекущийСимвол ELSE 32 // ( в послед позиции строки THEN 33 < IF // След сим пробел I 0 > IF // ком но не в первой позиции I 1- ТекущийСимвол 33 < IF // Комм не в пер поз БылКомментарий @ -1 > IF БылКомментарий @ DUP I SWAP - 1+ ФорматируемСтроку -1 БылКомментарий ! ELSE THEN ELSE THEN ELSE THEN ELSE I 1+ ДлинаСтроки @ = IF БылКомментарий @ DUP I SWAP - 1+ ФорматируемСтроку THEN THEN ELSE THEN // Ловим ' " ' ТекСимвол @ 34 = IF // Это ' " ' БылаКавычка @ -1 > IF // Да была БылаКавычка @ DUP I SWAP - 1+ color2.@ higl1.formatColor -1 БылаКавычка ! // Сбросить признак кавычки ELSE I 1+ ДлинаСтроки @ < IF I 1+ ТекущийСимвол ELSE 0 // Это не кавычка THEN 32 = IF // След сим Кав I БылаКавычка ! ELSE THEN I БылаКавычка ! THEN THEN LOOP qsTMP2.@ ; 1 CELLS CALLBACK: onHLparser VARIABLE aonHLparser ' onHLparser aonHLparser ! : str->qstr DROP qsTMP.set qsTMP.@ ; // aonviewPath :NONAME NameFile 1+ ВходноеИмяФайла COPYZ // Имя во входной параметр // Вызовем WINAPI функцию для опред полного пути АдресИмяФайла ВыходноеИмяФайла РазмерБуфераИмениФайла ВходноеИмяФайла GetFullPathName DROP // Заберем вычесленный полный путь и имя ВыходноеИмяФайла 0 str->qstr viewPathText.append viewPath.exec DROP ; 0 CELLS CALLBACK: onviewPath VARIABLE aonviewPath ' onviewPath aonviewPath ! // aonAboutQt :NONAME S" view.f (v2.0) использует:" DROP qsTMP set qsTMP @ 0 box1.aboutQt ; 0 CELLS CALLBACK: onAboutQt VARIABLE aonAboutQt ' onAboutQt aonAboutQt ! // About view.f :NONAME aboutDialog.exec DROP ; 0 CELLS CALLBACK: onAbout VARIABLE aonAbout ' onAbout aonAbout ! : ПереключитьКодировку // ( Astr N -- ) DROP NameCodec$ strcpy DROP // Скопируем символьную строку в глобальный адрес. te1.clear ОбработатьФайл te1.cursorStart ; // aonKOI8-R :NONAME S" KOI8-R" ПереключитьКодировку ; 0 CELLS CALLBACK: onKOI8-R VARIABLE aonKOI8-R ' onKOI8-R aonKOI8-R ! // aonUTF-8 :NONAME S" UTF-8" ПереключитьКодировку ; 0 CELLS CALLBACK: onUTF-8 VARIABLE aonUTF-8 ' onUTF-8 aonUTF-8 ! // aonDOS866 :NONAME S" IBM 866" ПереключитьКодировку ; 0 CELLS CALLBACK: onDOS866 VARIABLE aonDOS866 ' onDOS866 aonDOS866 ! // aonWin1251 :NONAME S" Windows-1251" ПереключитьКодировку ; 0 CELLS CALLBACK: onWin1251 VARIABLE aonWin1251 ' onWin1251 aonWin1251 ! // aonExit :NONAME BYE ; 0 CELLS CALLBACK: onExit VARIABLE aonExit ' onExit aonExit ! : aboutAddStr str->qstr aboutText.append ; : СоздатьМеню_и_СтатусБар // ( -- ) wc1.create // Главное окно wc1.@ sb1 create // создадим СтатусСтрока // Подпункты меню wc1.@ actWin1251.create S" Win-1251" str->qstr actWin1251.setText Qt:Key_F1 actWin1251.setHotKey aonWin1251 @ actWin1251.onClick wc1.@ actDOS866.create S" DOS-866" str->qstr actDOS866.setText Qt:Key_F2 actDOS866.setHotKey aonDOS866 @ actDOS866.onClick wc1.@ actUTF8.create S" UTF-8" str->qstr actUTF8.setText Qt:Key_F3 actUTF8.setHotKey aonUTF-8 @ actUTF8.onClick wc1.@ actKOI8R.create S" KOI8-R" str->qstr actKOI8R.setText Qt:Key_F4 actKOI8R.setHotKey aonKOI8-R @ actKOI8R.onClick wc1.@ actAbout.create S" О Программе" str->qstr actAbout.setText aonAbout @ actAbout.onClick wc1.@ actAboutQT.create S" О Qt" str->qstr actAboutQT.setText Qt:ControlModifier Qt:Key_Q + actAboutQT.setHotKey aonAboutQt @ actAboutQT.onClick wc1.@ actviewPath.create S" полный путь файла" str->qstr actviewPath.setText Qt:ControlModifier Qt:Key_G + actviewPath.setHotKey aonviewPath @ actviewPath.onClick wc1.@ actExit.create S" Выход" str->qstr actExit.setText Qt:KeyEsc actExit.setHotKey aonExit @ actExit.onClick // Главная строка меню wc1.@ menuКодировка.create S" Кодировка" str->qstr menuКодировка.setTitle wc1.@ menuAbout.create S" Справка" str->qstr menuAbout.setTitle // Добавим подпункты меню в "Кодировка" actWin1251.@ menuКодировка.addAction actDOS866.@ menuКодировка.addAction actUTF8.@ menuКодировка.addAction actKOI8R.@ menuКодировка.addAction // Добавим подпункты меню в "Справка" actAbout.@ menuAbout.addAction actAboutQT.@ menuAbout.addAction actviewPath.@ menuAbout.addAction menuAbout.addSep actExit.@ menuAbout.addAction wc1.@ menubar1.create menuКодировка.@ menubar1.addMenu menuAbout.@ menubar1.addMenu // Делаем диалог для полного имени файла 0 wc1.@ viewPath.create 500 40 viewPath.resize S" Полный путь редактируемого файла" DROP qsTMP.set qsTMP.@ viewPath.setwindowtitle viewPathLayout.createV viewPathText.create viewPathText.@ viewPathLayout.addWidget viewPathLayout.@ viewPath.setlayout // Делаем окно диалога для About 0 wc1.@ aboutDialog.create 400 140 aboutDialog.resize S" About view ..." DROP qsTMP.set qsTMP.@ aboutDialog.setwindowtitle aboutLayout.createV // Вертикальный выравниватель aboutText.create aboutText.@ aboutLayout.addWidget aboutLayout.@ aboutDialog.setlayout // Установим надпись на About S| <font color=red size=5>view.f</font> (v2.3) просмотр исходных текстов форта.| aboutAddStr S| Написана на <B>SPF 4.20 + Qt (~mgw\qtdlib.f)</B> для демонстрации работы SPF с Qt.| aboutAddStr S| Работает в <font color=blue>Windows</font> и <font color=blue>Linux</font>.| aboutAddStr S| <B>mgw</B> - 15.02.2011 | aboutAddStr ; :NONAME // ( Aapp -- ) // Главная процедура работы с QT. main() в примерах на С++ app1.create // Запомнить указатель на Application initDebug3 // Инициализировать отладчик _3, он определен в FQT // применение SWAP _3 ( смотрим стек и переменные ) DROP ... // ---------- Тело программы ---------------- 0 БылКомментарий ! 0 ДлинаСтроки ! qsTMP.create // qsTMP2.create // box1.create // font1.create font2.create color1.create color2.create qcTek.create qcTek+1.create qcTek-1.create qs1.create // создадим QString // Попытка форматировать через HTML, но не получилось, т.к уничтож ведущие пробелы qKom2.create S" :NONAME" DROP qKom2.set qKom3.create S" : " DROP qKom3.set qHR3.create S" <hr>:" DROP qHR3.set te1.create // создадим QTextEdit // Формируем шрифты if=W S" Lucida Console" DROP qsTMP.set qsTMP.@ font1.setFamily 10 font1.setPointSize if=L S" DejaVu Sans Mono" DROP qsTMP.set qsTMP.@ font1.setFamily 10 font1.setPointSize S" Lucida" DROP qsTMP.set qsTMP.@ font2.setFamily 14 font2.setPointSize font1.@ te1.setFont // Формируем цвета для раскраски 255 155 155 0 color1.setRGB // A B G R - Комментарий 255 0 50 255 color2.setRGB // A B G R - Строки te1.document higl1.create // вычленим из редактора раскраску aonHLparser @ higl1.onParser // Жуть ... обработчик на раскраску синтаксиса ... Qt-это супер!!! if=W GetCommandLineA ASCIIZ> args DROP if=L 2 \ Моделирование параметров на входе ком строки 2 = IF qsTMP.@ 1 app1.narg NameFile qsTMP.text // Забрать из комманд строки имя файла СоздатьМеню_и_СтатусБар menubar1.@ wc1.setMenuBar sb1.@ wc1.setStatusBar te1.@ wc1.setCentralWidget 700 800 wc1.resize // Размер окна 10 10 wc1.move // Где нарисовать ОбработатьФайл te1.cursorStart wc1.show // Отобразить окно ELSE S" usage: view.exe file.f" msgboxError BYE THEN // ---------- Конец программы ---------------- app1.@ // Положить на стек параметр из SO 0 // возвращаемое значение (треб SPF) ; 1 CELLS CALLBACK: onForth // Сработает на CR в le1:QLineEdit VARIABLE aonForth ' onForth aonForth ! // Главная функция : run if=W LibraryLoad user32 if=W LibraryLoad msvcrt // Проверка на доступность, нужна для QtGui if=L LibraryLoad libc if=W LibraryLoad mingwm10 // Проверка на доступность, нужна для QtGui if=W LibraryLoad kernel32 // Работа с именами файлов LibraryLoad QtGui LibraryLoad QtCore LibraryLoad libfqt if=L aonForth @ ARGV ARGC фСоздатьПриложение if=W aonForth @ GetCommandLineA ASCIIZ> args SWAP фСоздатьПриложение DROP BYE ; \ run // \EOF ' run MAINX ! S" view.exe" SAVE BYE Вызов из программы на форте: Код: : view // ( Astr N -- ) Вызвать view.exe c аргументом if=W DROP 0 SWAP S" view.exe" DROP S" " DROP 0 5 ShellExecute if=L DROP NameFileViewEdit ! fork if=L DUP 0 = IF if=L 0 NameFileViewEdit @ S" view.exe" DROP S" ./view.exe" DROP 4 execl if=L ELSE if=L DUP 0 > IF ELSE if=L DUP IF ( perror ) ELSE if=L THEN if=L THEN if=L THEN DROP Всё написано на SPF-4.20 Сам текст программы мультиплатформенный (Windows 32 и Linux 32) |
Автор: | mOleg [ Чт июл 04, 2013 08:56 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
написано для форка используемая версия 4-mc10-b750. source file: view.fts |
Автор: | gudleifr [ Чт июл 04, 2013 09:18 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
Цитата: Он показал нам блок-схему программы, предназначавшейся для решения этой задачи, но стрелки, которые вели от одного квадратика к другому, были так беспорядочно расположены, что мы оба решили не рассматривать это решение (если оно было решением, что мы так и не смогли выяснить!). Цитата: [Нужны ли константы клавиш?] Ответ зависит от того, считаете ли Вы, что другим компонентам надо будет "знать" числовое значение, связанное с каждой клавишей. Чаще этого "не" требуется. Простая, более компактная форма здесь поэтому предпочтительнее. Также в первой версии [с константами] добавление нового кода клавиши потребует изменений в двух местах. А, если серьезно, я вижу несколько важных ошибок: 1. Программа написана не на Forth, а на плохом C (с механической заменой операторов на слова). Коробит, наше отношение к Броуди. Мы его чтим, но то, что он писал, пропускаем мимо ушей. 2. Программа, очевидно, очень сильно ОС-зависима (ср. мое решение), но эти зависимости в решении не обособлены. 3. Разбиение на слова было произведено по-чайниковски: по командам интерфейса, а не по правилам организации вычислений и/или доказательства корректности. 4. Заодно видны недостатки выбранного средства программирования: обилие не нужных для решения танцев с бубном. Зачем писать сверхмощный Forth, если половина листинга полностью состоит из его настроек? Был бы умный, сам бы настроился. |
Автор: | Alex [ Пт июл 05, 2013 13:11 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
используем для реализации просмотрщика сторонние (html,hta) технологии, так как поведение на стрелки, начало и конец и листание страниц такое-же как и требуется. заданный файл обернем в начале и в конце заготовленными фрагментами для формирования приложения view.hta при копировании строк исходного файла дополним их hnml символами перевода строки решение не соответствует полностью заданию, так нет выхода по ESC но оно здесь и не надо, так как действует как независимое приложение и закрывается штатно. написано на SPF4, под win. Код: mutex.f
process.f locals.f str5.f : VIEW { a u \ buf inpfile outfile -- } 500 ALLOCATE THROW -> buf a u R/O OPEN-FILE-SHARED THROW -> inpfile S" view.hta" R/W CREATE-FILE THROW -> outfile " <html> <head> <SCRIPT language={''}javascript{''}> document.onkeydown = function(event){ S' {' } events = event || window.event; if (events.keyCode == 27) { S' {' } window.close();}} window.resizeTo (480,240); window.moveTo((screen.width-480)/2,(screen.height-240)/2); </SCRIPT> <hta:application id=v_i_e_w applicationName=view maximizeButton=yes border=thin innerBorder=no selection=no contextMenu=no singleinstance=yes WINDOWSTATE={''}normal{''} /> <title> V I E W </title> </head>{CRLF}<body>" DUP STR@ outfile WRITE-FILE THROW STRFREE BEGIN buf 500 inpfile READ-LINE THROW WHILE buf SWAP outfile WRITE-FILE THROW S" <br>" outfile WRITE-FILE THROW LT 2 outfile WRITE-FILE THROW REPEAT DROP inpfile CLOSE-FILE THROW " </body>{CRLF}</html>" DUP STR@ outfile WRITE-FILE THROW outfile CLOSE-FILE THROW STRFREE S" cmd.exe /c view.hta" StartApp THROW DROP ; |
Автор: | mOleg [ Пт июл 05, 2013 14:55 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
Alex писал(а): используем для реализации просмотрщика сторонние Смысл задания не в том, чтоб вызывать сторонний компонент, а чтобы использовать штатные. |
Автор: | gudleifr [ Пт июл 05, 2013 16:12 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
mOleg писал(а): Смысл задания не в том, чтоб вызывать сторонний компонент, а чтобы использовать штатные. Вы что-то путаете. В Вашем задании про это - ни слова. (Про "смысл" - это, пожалуйста, в мое задание). Поэтому в решении коллеги Alex, как и у меня, задача решается минимумом затрат, что можно только приветствовать.(Разве что, имело заменить тег <br> на <pre>). Раздражает только опять наличие плясок с бубном. И, заметьте, это при 4-х подключенных либах. Forth-у в листинге и места не находится. Оффтоп. Когда-то я поминал 6 этапов разработки программы по Кнуту. Видимо, каждый программист подсознательно тяготеет к одному из этапов, начиная со временем остальные считать чем-то второстепенным. Любители сверхмощных ОО и прочих визуальных монстров, которые мы здесь наблюдаем, очевидно, тяготеют к пункту (4) - "Начальные установки". |
Автор: | mOleg [ Пт июл 05, 2013 16:24 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
gudleifr писал(а): В Вашем задании про это - ни слова. Вполне достаточно выхода по 'ESC' - как вы уже заметили в стандартных компонентах этого нет. gudleifr писал(а): пожалуйста, в мое задание ваше "баба Яга против" мне не интересно в принципе. gudleifr писал(а): Поэтому в решении коллеги Alex, как и у меня, задача решается минимумом затрат, что можно только приветствовать. Задача решается с отступлением от задания, а, значит, не решена. |
Автор: | gudleifr [ Пт июл 05, 2013 16:30 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
mOleg писал(а): Задача решается с отступлением от задания, а, значит, не решена. Как было сказано выше, задача была решена столько раз, что Ваши "перламутровые пуговицы" никому не интересны. (Если угодно, в мое решение выход по Esc втюхать легко. Но зачем?). Это как прийти к спортсменам прыгунам и поставить задачу - прыгать в зеленых кедах. Зачем?Кстати, вопрос по Вашему решению. Если мы после выполнения вертикального смещения из позиции "в хвостовой части длинной строки" попадаем на фрагмент коротких строк, окно уходит в пустоту или идет влево - пока не найдет текст? |
Автор: | mOleg [ Пт июл 05, 2013 16:42 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
gudleifr писал(а): Как было сказано выше Смотрим, в каком разделе находится задача Если еще остались вопросы, пожалуйста, задавайте их где-нибудь в другом месте, мне на вас нет желания тратить время. Троли мне не симпатичны, в данном разделе я стролями нянчиться не намерен. |
Автор: | Alex [ Пт июл 05, 2013 19:58 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
добавил выход по клавише ESC, прошу таки оставить в этой теме, мож кто искать будет решение, и этот вариант подойдет |
Автор: | mOleg [ Пт июл 05, 2013 20:07 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
Alex писал(а): мож кто искать будетрешение, и этот вариант подойдет да, конечно. |
Автор: | Alex [ Сб июл 06, 2013 21:13 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
предыдущий вариант не сработает если файл будет с html разметкой для этого надо делать замену некоторых символов нa подстроки (вот она цена использования сторонних компонентов - мы не только подгоняем поведение под требуемое, но и еще готовим для него правильные входные данные!) Код: mutex.f process.f locals.f str5.f case.f : VIEW { a u \ buf inpfile outfile -- } 1000 ALLOCATE THROW -> buf a u R/O OPEN-FILE-SHARED THROW -> inpfile S" view.tmp" R/W CREATE-FILE THROW -> outfile BEGIN buf 1000 inpfile READ-LINE THROW WHILE buf + buf ?DO I C@ CASE [CHAR] & OF S" &" outfile WRITE-FILE THROW ENDOF [CHAR] ' OF S" '" outfile WRITE-FILE THROW ENDOF [CHAR] " OF S" "" outfile WRITE-FILE THROW ENDOF [CHAR] < OF S" <" outfile WRITE-FILE THROW ENDOF [CHAR] > OF S" >" outfile WRITE-FILE THROW ENDOF I 1 outfile WRITE-FILE THROW ENDCASE LOOP LT 2 outfile WRITE-FILE THROW REPEAT DROP inpfile CLOSE-FILE THROW outfile CLOSE-FILE THROW buf FREE THROW S" cmd.exe /c copy /B head.tmp+view.tmp+tail.tmp /B view.hta > null.tmp" StartAppWait THROW S" cmd.exe /c view.hta" StartApp THROW DROP ; содержимое файла head.tmp Цитата: <html> <head> <SCRIPT language="javascript"> document.onkeydown = function(event){ events = event || window.event; if (events.keyCode == 27) { window.close();}} window.resizeTo (480,240); window.moveTo((screen.width-480)/2,(screen.height-240)/2); </SCRIPT> <hta:application id=v_i_e_w applicationName=view maximizeButton=yes border=thin innerBorder=no selection=no contextMenu=no singleinstance=yes WINDOWSTATE="normal"/> <title> V I E W </title> </head><body><pre> содержимое файла tail.tmp Цитата: </pre></body></html>
|
Автор: | mOleg [ Сб июл 06, 2013 22:54 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
source file: view.fts использовать так: rel/ view.fts s" view.fts" VIEW |
Автор: | mOleg [ Чт июл 25, 2013 21:35 ] |
Заголовок сообщения: | Re: *простой текстовый viewer |
Продолжаю баловаться. Теперь правила раскраски в отдельном файле, имена, определенные в просматриватриваемом файле автоматически расцвечиваются, правда есть побочные эффекты в случае повторного определения слов. Вообще, так как файл по сути интерпретируестя правила расцветки ограничиваются фантазией. p.s. не делал многострочные строковые литералы и коментарии. для того, чтобы текст выглядел контрастно нужно в свойствах окна поправить значение серого цвета со 128 128 128 на 80 80 80 source file: view.fts source file: color.rule |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |