Распечатать страницу

Слияние текста и его выражений в 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
scan for InputDate > someDate

                                            \ <<Rtrim(Author)>>

endScan

close databases

set textmerge to

&& Просмотр файла d:\a.txt

modify file d:\a.txt noedit    && Результат см. на рис. 4.1

72.1.-Текст-с-символами-заданными-PRETEXT

Рис. 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 диалог.

72.2.-Команда-SET-SAFETY-установлена-в-ON

Рис. 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

72.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

72.4.-Вывод-направлен-в-пользовательское-окно

Рис. 4.4. Вывод направлен в пользовательское окно

SHOW | NOSHOW – разрешает (SHOW) или запрещает (NOSHOW) вывод текста в главное окно VFP, текущее окно или окно, указанное опцией WINDOW. По умолчанию действует опция SHOW.

Рассмотренная команда, а также команда TEXT ... ENDTEXT позволяет, используя некоторый шаблон, быстро создавать письма, программы, этикетки и др.

В командах \ | \\ и TEXT ... ENDTEXT могут быть использованы вложенные выражения. Для этого используются memo-поля, содержащие текст, ограниченный разделителями.

Пример. Memo-поле MemoField первой записи таблицы test.dbf содержит приведенную на рис. 4.5 строку.

72.5.-Memo-поле-предназначенное-для-оценки-в-команде

Рис. 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] ;
[NOSHOW] [FLAGS nValue] [PRETEXT eExpression]]
TextLines
ENDTEXT

посылает строки текста TextLines на текущее устройство вывода, оценивая, если SET TEXTMERGE установлен в ON, расположенные между разделителями выражения. В качестве выходного устройства могут быть указаны главное окно VFP (по умолчанию), пользовательское окно, текстовый файл и принтер. Также вывод можно направить в переменную VarName.

Команда оказывает такое же действие, что и совместное употребление команд \ | \\ и SET TEXTMERGE, но имеет большие возможности. Может совместно применяться с командами SET TEXTMERGE, SET TEXTMERGE DELIMETERS, SET ALTERNATE, SET CONSOLE, SET PRINTER и др.

Значение, хранимое системной переменной _PRETEXT, имеет в рассматриваемой команде тот же эффект, что и в команде \ | \\.

Команды SET TEXTMERGE и SET TEXTMERGE DELIMETERS при использовании с TEXT … ENDTEXT работают так же, как с командой \ | \\, например:

set textmerge on

&& Выводим текст в файл, не отображая результат на экране

set textmerge to d:\a.txt noshow

fi = Pi( ) / 4

text pretext 7

                                            Синус угла <<fi>> равен <<Sin(fi)>>

endText

&& Закрываем файл d:\a.txt

set textmerge to

&& Просмотр файла d:\a.txt

modify file d:\a.txt noedit    && Результат см. на рис. 4.3

Опции и параметры:

TO VarName – задает то же, что и опция MEMVAR VarName команды SET TEXTMERGE. Если SET TEXTMERGE установлен в файл, а в команде TEXT … ENDTEXT задана опция TO VarName, то вывод будет направляться как в файл, так и в переменную, и вдобавок в окно VFP, если не задана опция NOSHOW.

ADDITIVE, NOSHOW – имеют то же действие, что и одноименные опции команды SET TEXTMERGE.

FLAGS nValue – задает дополнительные установки вывода; параметр nValue задается как сумма следующих значений:

  • 1 – подавляет вывод в файл, заданный системной переменной _TEXT;

  • 2 – если присутствует опция NOSHOW, то сохраняет имеющиеся в TEXT ... ENDTEXT чистые линии, предшествующие тексту. Новый текст будет отделен от ранее выведенного символом новой строки. Если одновременно задать nValue = 2 и PRETEXT = 4, то чистые линии, имеющиеся в TEXT ... ENDTEXT и предшествующие тексту, будут удалены.

TEXTMERGE – задает режим оценки выражений, имеющихся в TextLines и обрамленных разделителями, без установки SET TEXTMERGE в ON.

PRETEXT eExpression – задает, если eExpression имеет тип Character, строку символов, размещаемую перед текстом каждой линии; длина строки не может быть более 255 символов. Строка eExpression замещает содержимое системной переменной _PRETEXT. Область действия опции PRETEXT – текущая команда TEXT … ENDTEXT.

Если тип eExpression – Numeric, то оно параметр задает дополнительный флаг, влияющий на способ вывода текста. Параметр может принимать указанные в табл. 4.2 значения или равняться их сумме или сумме любой пары значений.

Таблица 4.2

Значения параметра eExpression

Значение

Действие

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( ).