Слияние текста и его выражений в VFP
« Назад Команда \TextLine | \\TextLineвыводит текст TextLine в окно VFP и/или в текстовый файл, например: \Этот текст отобразится на экране монитора Выводимый текст может содержать выражения, обрамленные разделителями. По умолчанию в качестве левого разделителя употребляются символы <<, а в качестве правого – символы >>. При этом выражение выводится как текст (без разделителей), если SET TEXTMERGE установлен в OFF, например: set textmerge off fi = Pi( ) / 4 \Синус угла <<fi>> равен <<Sin(fi)>> Выведенный текст: Синус угла fi равен Sin(fi) После задания SET TEXTMERGE ON обрамленные разделителями выражения будут оцениваться, а выводимый текст будет содержать полученные в результате вычислений результаты, например: set textmerge on fi = Pi( ) / 4 \Синус угла <<fi>> равен <<Sin(fi)>> Выведенный текст: Синус угла 0.7854 равен 0.71 Команда \\ работает так же, как и команда \, за тем исключением, что команда \ начинает вывод с новой строки, а команда \\ продолжает выводить текст на текущей строке. Так, тот же, что и в предшествующем примере текст, выведет следующая программа: set textmerge on fi = Pi( ) / 4 \Синус угла <<fi>> равен && Продолжаем вывод на той же строке \\ <<Sin(fi)>> Комментарий, расположенный после команды \ | \\, выводится как обычный текст. Выражения, включенные в комментарий, будут оцениваться наряду с другими выражениями, присутствующими в строке команды, например: set textmerge on fi = Pi( ) / 4 \Синус угла <<fi>> равен <<Sin(fi)>> && Повторяем: <<Sin(fi)>> Выведенный текст: Синус угла 0.7854 равен 0.71 && Повторяем: 0.71 Аналогичным образом обрабатывается комментарий в рассматриваемой ниже команде TEXT … ENDTEXT. Выводимый командами \ | \\ текст можно предварять символами, например знаками табуляции, записанными в системную переменную _PRETEXT, например: set textmerge on set textmerge to d:\a.txt show close databases open database 'd:\HomeLibrary\HomeLibrary' use authors store {^2004–01–01} to someDate _PRETEXT = "" && или Chr(9) для знака табуляции \ Список авторов, занесенных в базу после <<someDate>> _PRETEXT = " * " && Просматриваем всех авторов с датой большей someDate \ <<Rtrim(Author)>> endScan close databases set textmerge to && Просмотр файла d:\a.txt modify file d:\a.txt noedit && Результат см. на рис. 4.1 Рис. 4.1. Текст с символами, заданными _PRETEXT Команда SET TEXTMERGE [ON | OFF] [TO [FileName] MEMVAR VarName[ADDITIVE]][WINDOW WindowName] [SHOW | NOSHOW]активизирует или отключает режим оценки расположенных между разделителями текста выражений, присутствующих в тексте команд \ | \\ и TEXT ... ENDTEXT. Опции: ON, OFF – соответственно активизирует или отключает режим оценки выражений. По умолчанию оценка текста не выполняется – действует опция OFF. TO [FileName] – направляет вывод команд \ | \\ и TEXT ... ENDTEXT в текстовый файл FileName. Вывод в окно VFP эта опция не отменяет. Если файл не существует, то он будет создан. Если не задана опция ADDITIVE, то существующий файл будет перезаписан. Причем если SET SAFETY установлен в ON и вывод направляется в файл d:\a.txt, то появится приведенный на рис. 4.2 диалог. Рис. 4.2. Команда SET SAFETY установлена в ON При выборе No вывод данных в файл d:\a.txt выполнен не будет. Пример: set textmerge on && Выводим текст в файл, не отображая результат на экране set textmerge to d:\a.txt noshow fi = Pi( ) / 4 \Синус угла <<fi>> равен <<Sin(fi)>> && Закрываем файл d:\a.txt set textmerge to && Просмотр файла d:\a.txt modify file d:\a.txt noedit && Результат см. на рис. 4.3 Рис. 4.3. Вывод текста командой \ в файл Идентификатор файла, открываемого для записи текста, хранит системная переменная _TEXT. Команда SET TEXTMERGE TO закроет файл, идентификатор которого содержит эта системная переменная. В приведенном выше примере будет закрыт файл d:\a.txt, поскольку после его открытия командой SET TEXTMERGE значение системной переменной _TEXT не изменялось. Если же переменная _TEXT получила иное значение, то для закрытия файла d:\a.txt можно употребить функцию FCLOSE, передав ей в качестве параметра идентификатор файла, например: set textmerge on set textmerge to d:\a.txt noshow && Сохраняем идентификатор файла d:\a.txt в переменной h h = _TEXT fi = Pi( ) / 4 \Синус угла <<fi>> равен <<Sin(fi)>> && Закрываем файл d:\a.txt Fclose(h) modify file d:\a.txt noedit Замечание. Вывод в файл также обеспечит соответствующее употребление команды SET ALTERNATE. MEMVAR VarName – обеспечивает запись текста, выводимого командами \ | \\ и TEXT ... ENDTEXT, в переменную VarName. Область видимости переменной VarName определяется в общепринятом порядке посредством команд LOCAL, PUBLIC и PRIVATE. Выполнение SET TEXTMERGE TO без опции MEMVAR разрывает связь переменной VarName с командами \ | \\ и TEXT ... ENDTEXT. Пример. Результат команд \ и TEXT ... ENDTEXT заносится в переменные txt1, txt2, txt3. Для обеспечения работоспособности программы перед каждым заданием VarName (используются имена txt1, txt2 и txt3) выполняется команда SET TEXTMERGE TO. При ее отсутствии возникнет ошибка Textmerge is recursive. fi1 = Pi( ) / 3 fi2 = Pi( ) / 4 fi3 = Pi( ) / 5 set textmerge on noshow && set textmerge to memvar txt1 \Синус угла <<fi1>> равен <<Sin(fi1)>> && set textmerge to && Команда обязательна && set textmerge to memvar txt2 \Синус угла <<fi2>> равен <<Sin(fi2)>> && set textmerge to && Команда обязательна && text to txt3 pretext 7 Синус угла <<fi3>> равен <<Sin(fi3)>> endText && set textmerge off && ? txt1 ? txt2 ? txt3 Результат: Синус угла 1.0472 равен 0.87 Синус угла 0.7854 равен 0.71 Синус угла 0.6283 равен 0.59 Можно указать единственную переменную VarName для разных команд \ | \\ и TEXT ... ENDTEXT, например: fi1 = Pi( ) / 3 fi2 = Pi( ) / 4 fi3 = Pi( ) / 5 set textmerge on noshow set textmerge to memvar txt1 \Синус угла <<fi1>> равен <<Sin(fi1)>> \Синус угла <<fi2>> равен <<Sin(fi2)>> text pretext 7 Синус угла <<fi3>> равен <<Sin(fi3)>> endText && set textmerge to && Команда обязательна && ? txt1 Результат тот же, что и в вышеприведенном примере. Однако переменная txt1 не будет обнаружена VFP и возникнет ошибка Variable 'TXT1' not found, если перед употреблением переменной txt1 не выполнить команду SET TEXTMERGE TO. ADDITIVE – обеспечивает добавление очередной порции данных в существующий файл. При ее отсутствии существующий файл перезаписывается. WINDOW WindowName – направляет вывод в окно WindowName. Окно создается командой DEFINE WINDOW; окно может быть неактивным и невидимым. Пример: define window wForTextMerge at 10, 10 size 3, 40; in desktop system float close title "Синус fi"; font "Times New Roman", 12 activate window wForTextMerge set textmerge on window wForTextMerge show fi = Pi( ) / 4 \Синус угла <<fi>> равен <<Sin(fi)>> && Результат см. на рис. 4.4 Рис. 4.4. Вывод направлен в пользовательское окно SHOW | NOSHOW – разрешает (SHOW) или запрещает (NOSHOW) вывод текста в главное окно VFP, текущее окно или окно, указанное опцией WINDOW. По умолчанию действует опция SHOW. Рассмотренная команда, а также команда TEXT ... ENDTEXT позволяет, используя некоторый шаблон, быстро создавать письма, программы, этикетки и др. В командах \ | \\ и TEXT ... ENDTEXT могут быть использованы вложенные выражения. Для этого используются memo-поля, содержащие текст, ограниченный разделителями. Пример. Memo-поле MemoField первой записи таблицы test.dbf содержит приведенную на рис. 4.5 строку. Рис. 4.5. Memo-поле, предназначенное для оценки в команде Оценка memo-поля выполняется в следующей программе: if not Used("Test") then use d:\HomeLibrary\Test in 0 else select Test go top endif set textmerge on show fi = Pi( ) / 4 \Пример вложенных выражений \<<Test.MemoField>> Результат. Пример вложенных выражений Синус угла 0.7854 равен 0.71 Оценка выражений memo-поля не будет выполнена, если само memo-поле употребить в качестве операнда выражения, например замена последней строки рассматриваемого примера на строку \<<Alltrim(Test.MemoField)>> приведет к появлению следующего результата: Пример вложенных выражений Синус угла <<fi>> равен <<Sin(fi)>> Команда SET TEXTMERGE DELIMETERS [TO cLeftDelimiter [, cRightDelimiter]]устанавливает разделители текста. Параметры: cLeftDelimiter, cRightDelimiter – задают соответственно левые и правые разделители. Если задан один параметр, то левые и правые разделители будут совпадать, например: set textmerge on set textmerge delimiters to "~" fi = Pi( ) / 4 \Синус угла ~fi~ равен ~Sin(fi)~ Вызов команды без параметров восстановит заданные по умолчанию разделители. Команда TEXT [TO VarName [ADDITIVE] [TEXTMERGE] ;
|
Значение |
Действие |
1 |
В каждой строке уничтожаются ведущие пробелы |
2 |
В каждой строке уничтожаются ведущие символы табуляции |
4 |
В каждой строке уничтожаются ведущие символы возврата каретки (удаляются чистые линии) |
8 |
Уничтожает символы новой строки |
Наличие такой возможности позволяет в частности использовать отступы при записи команды TEXT … ENDTEXT.
Значение eExpression, выпадающее из диапазона 0 – 7, приводит к ошибке исполнения.
Если eExpression имеет тип Numeric, то для задания добавляемых в начало каждой строки символов можно использовать системную переменную _PRETEXT.
Опция PRETEXT с числовым значением параметра eExpression не удаляет символы пробела, табуляции, возврата каретки из начальной части строки, если они появились там в результате оценки начинающего строку выражения.
Пример. При выводе пробелы в строке " AAA" сохраняются, а в других строках устраняются.
myVar = " AAA"
text to txt1 noshow textmerge pretext 7
<<myVar>>
BBB
CCC
endText
? txt1
Пробелы перед буквами AAA сохранены:
AAA
BBB
CCC
Опцию PRETEXT со значением параметра eExpression равным 7 следует употреблять при формировании XML-файлов, с тем чтобы удалять ведущие пробелы или знаки табуляции, присутствие которых нарушает правила форматирования XML-документов, передаваемых Web-браузерам.
Чтобы подавить вывод в окно VFP, помимо использования опции NOSHOW, можно установить SET CONSOLE в OFF. Вывод направляется на принтер или в файл при помощи SET PRINTER.
Файл для вывода текста можно открыть или создать, вызывая функцию FOPEN( ) или FCREATE( ). При этом возвращаемый ими идентификатор файла нужно сохранить в системной переменной _TEXT. Для закрытия файла употребляется либо команда SET TEXTMERGE TO, либо функция FCLOSE( ). Например:
set textmerge on
_TEXT = Fcreate("d:\a.txt")
&& Проверяем, удалось ли создать файл
if _TEXT = –1 then
MessageBox("Не могу создать файл d:\a.txt")
cancel
endif
fi = Pi( ) / 4
text pretext 7
Синус угла <<fi>> равен <<Sin(fi)>>
endText
&& Закрываем файл d:\a.txt
Fclose(_TEXT)
modify file d:\a.txt noedit && Результат см. на рис. 4.3
Замечание. Оценка имеющихся в тексте выражений, ограниченных разделителями, также может быть выполнена функцией TEXTMERGE( ).