itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков...

371
InterTrus t Е.В. Поляков А,,В. Ходырев

Transcript of itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков...

Page 1: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

InterTrustЕ.В. Поляков

А,,В. Ходырев

Язык программирования LotusScript в Lotus/Domino R 8: базис языка,

Page 2: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

встроенные функции и встроенные классы (том 1)

Page 3: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

УДК 004.45

ББК 22.18 П

16

Поляков Е.В., Ходырев А. В.

«Язык программирования LotusScript в Lotus/Domino R 8: базис языка, встроенные функции и встроенные классы (том 1)»

Книга посвящена вопросам программирования на языке LotusScript в среде Lotus Domino версии R 8. В первый том издания вошли описания базиса языка LotusScript, встроенных операторов и функций, а также ряда встроенных классов с детальным рассмотрением их свойств, методов и обработчиков событий. Во втором томе приведены аналогичные детальные описания встроенных классов, не вошедших в первый том, и сегмент приложений, дающий более углубленное представление о некоторых технологиях, реализованных с помощью встроенных LotusScript-классов.

Изложение материала сопровождается обширным набором примеров, наглядно демонстрирующих варианты применения конкретных операторов, встроенных функций, свойств, методов и обработчиков событий встроенных классов LotusScript.

Книга предназначена разработчикам приложений в среде Lotus Domino, и может быть полезна как начинающим разработчикам, так и специалистам со стажем.

Lotus, Lotus Domino и Lotus Notes являются зарегистрированными торговыми знаками фирмы IBM Company. Все другие упомянутые в данном издании товарные знаки и зарегистрированные товарные знаки принадлежат их законным владельцам.

© InterTrust Co., 2008

© Поляков Е., Ходырев А., 2008

© Оформление обложки Букина А., 2008

Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.

ООО «Светотон» 109341, г. Москва, ул. Верхние Поля, д. 18 E-mail: svton @ from . ru

Подписано в печать 27.08.2008 г. Формат 60x90/8 Печать офсетная. Бумага офсетная № 1. Усл. печ. л. 82,75. Тираж 500 экз. Заказ 6592.

Отпечатано с готового оригинал-макета в ФГУП «Производственно-издательский комбинат ВИНИТИ», 140010, г. Люберцы Московской обл., Октябрьский пр-т, 403.

ISBN 978-5-904156-01-5

Page 4: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Предисловие авторов

Всем влюбленным, и в Лотус в том числе, людям посвящается эта книга.

Книга, которую Вы держите в руках, является первым томом двухтомника, посвященного вопросам программирования на языке LotusScript в среде Lotus Domino/Notes версии R 8 - программного продукта компании IBM Company.

В первый том настоящего издания вошли: описание языка LotusScript, его встроенных операторов и функций, имеющихся ограничений и межплатформенной специфики реализации языка, а также описание общей иерархии встроенных классов LotusScript и подробное описания ряда встроенных классов с примерами использования их свойств, методов и обработчиков событий. Во втором томе описаны встроенные классы, не вошедшие по соображениям физического объема в первый том, а также сегмент приложений, содержащий ряд параграфов, которые можно опустить при первоначальном знакомстве с языком LotusScript, однако, их содержание может помочь разработчику при более глубоком «погружении» в технологии Lotus Domino.

Авторы будут искренне рады Вашим замечаниям и предложениям по содержанию книги и любой информации технического характера по затронутым в книге вопросам. Направляйте их по e-mail: ibicus 77@ rambler . ru (Е. Поляков) и AHodyrev @ inttrust . ru (А. Ходырев) или «оставляйте» на WWW-сервере нашей компании http :// www . intertrust . ru .

Материал книги подготовили: глава 1 - А. Ходырев, глава 2 - Е . Поляков.

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

» Е. Поляков - особые благодарности ведущим сотрудникам компании InterTrust Co.: Киселеву Е. А., Баранову

О. В., Панову В. А., Иванову Д. Ю. - без помощи которых, книга выглядела бы другой. Специальные

благодарности: Линеву А. А., Бреусу И. Б., Зыковой Н. П., Улазовской С. Д., Поляковой Г. Д. и Полякову

В. Г. за существенную помощь, оказанную при написании настоящей книги;

А. Ходырев - особые благодарности ведущим сотрудникам компании InterTrust Со. А так же специальная

благодарность Линеву А. А., Зыковой Н.П., Пронину Л.Б., Пономореву М.Н, Фадеевой М.Д. и своим

родным и близким за огромную поддержку, оказанную при работе над настоящей книгой. .

С уважением, Е. Поляков, А. Ходырев.1 Язык LotusScript в Domino

LotusScript это встроенный BASIC-подобный объектно-ориентированный язык программирования, предназначенный для создания приложений в рамках продуктов фирмы Lotus, независимо от платформы базирования программного обеспечения.

Допустимо использование LotusScript при разработке приложений в следующих продуктах фирмыLotus:

• Lotus Notes/Domino R 4.0 и выше;• Approach 96 и выше;• Freelance Graphics 96 и выше;• Word Pro 96 и выше;• Lotus 1-2-3 97 и выше;• LSCube;

• IBM Lotus Enterprise Solution Builder Конкретные реализации LotusScript включают в себя:

• предопределенные описания классов, событий и функций (отличающиеся для различных продуктов), позволяющие разрабатывать полноценные коммерческие приложения;

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

4

Page 5: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• редактор исходных текстов программ (скриптов) с синтаксическим анализатором;• отладчик скриптов;• возможность использования внешних классов, разработанных с помощью программного обеспечения

LSX Toolkit;• возможность использования внешних библиотек С-функций;• возможность работы с OLE-объектами.

1.1 Основные положения и элементы языка

Исходный текст программы на языке LotusScript называется скриптом. Скрипт состоит из операторов программы (не путайте с арифметическими, логическими и т.п. операторами). Каждый оператор, в свою очередь, состоит из ключевых слов языка, операторов (арифметических, логических и т.п.), идентификаторов, литералов и специальных символов.

1.1.1 Синтаксис языка LotusScript

В теле скрипта допускается вставлять неограниченное число пустых строк.

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

Оператор обычно занимает одну строку.

В случае необходимости продолжения оператора, за исключением блочных операторов, на следующую строку в конце строки ставится символ "_" (символ нижнего подчеркивания).

Перед символом "_" должен стоять как минимум один пробел. За символом "_" могут стоять только символы пробела или однострочного комментария.

Допустимо использование нескольких операторов на одной строке. В этом случае они должны быть разделены символом":" (двоеточие).

1.1.2 Комментарии

В языке LotusScript допустимо использование как однострочных, так и многострочных строк- комментариев, которые игнорируются компилятором, но улучшают читабельность скрипта.

Однострочные комментарии задаются с помощью оператора Rem, или символа апострофа ""'. Весь последующий текст до конца строки, в этом случае, воспринимается компилятором как комментарии.

Однострочный комментарий не обязательно должен быть первым оператором в строке скрипта. Различие в применении оператора Rem и символа апострофа состоит в том, что если комментарии является не первым оператором в строке, то перед Rem должен стоять символ разделителя операторов ":" (двоеточие), а перед апострофом двоеточие не требуется. В связи с этим только комментарии, начинающиеся символом апострофа, допустимо использовать после символа продолжения оператора на следующую строку

Примеры допустимых однострочных комментариев: Rem

это комментарий

а = Len (b) ' присваиваем а длину строки b Flag = True : Rem

устанавливаем flag в True Call uidoc.InsertText _ 'вставляем

текст в текущее поле (" " & strl & " .")

Многострочные комментарии задаются с помощью директив компилятора %Rem . . . %End Rem. Весь текст между этими двумя директивами компилятором игнорируется. Данные директивы обязательно должны стоять первыми в строке.

Разрешается после директивы %End Rem продолжить текст комментария до конца строки. Однако не допускается использование вложенных многострочных комментариев.

Пример многострочного комментария:

%Rem ниже будет идти блок

в котором мы будем обрабатывать каждый конкретный документ в виде "Продавцы" %End Rem цикл

будет идти по всем документам в виде

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

5

Page 6: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.1.3 Идентификаторы

Идентификатор - это имя, присваиваемое элементам скрипта (переменным, константам, типам данных, классам, функциям, подпрограммам и свойствам) с целью их однозначного определения (идентификации).

При задании идентификатора должны выполняться следующие правила:

• первым символом идентификатора должна быть прописная или заглавная буква;• все символы, кроме первого, могут быть буквами, цифрами или знаком подчеркивания;• суффиксы типов данных (%, &, !, #, @, $) могут стоять в конце идентификатора, но они не являются

частью идентификатора;• максимальная длина идентификатора не должна превышать 40 символов;• идентификатор не "чувствителен" к регистру клавиатуры, например, VerAd и verad один и тот же

идентификатор;• допустимо использование в идентификаторах символов с кодами ANSI более 127.

LotusScript позволяет использовать в скрипте элементы, идентификаторы которых не полностью соответствуют правилам объявления идентификаторов. Это увеличивает область применяемых в LotusScript идентификаторов, позволяя, при необходимости, использовать идентификаторы, содержащие символы, недопустимые правилами LotusScript. Возможность применения таких идентификаторов обеспечивается наличием перед недопустимым символом идентификатора знака тильда ( ~ ).

Пример. Использование символа тильда делает возможным использование идентификаторов, содержащих недопустимые символы $ и @.

Недопустимые идентификаторы:

Call ProductClas s.LoMethod$

X = OLEClass.Hi@Prop

Допустимые идентификаторы:

Call ProductClas

s.LoMethod~ $ X =

OLEClass.Hi~@Prop

1.1.4 Литералы

В языке LotusScript допустимы строковые и числовые литералы.

1.1.4.1 Строковые литералы

Строковый литерал в LotusScript - это любой набор символов, заключенных слева и справа в символы ограничители. В качестве таких символов могут выступать двойные кавычки """, символ вертикальной черты "|" или фигурные скобки "{" и "}".

п ~ "Iм

Литерал, занимающий несколько строк, должен использовать в качестве ограничителей символы или"{" и"}".

При необходимости использования в теле литерала символов """ и и если они же выступают в качестве ограничителей, данные символы в теле должны удваиваться. Например,

"Контора ""Рога и Копыта"""

| Поисковый запрос "река"

|| "рука" |

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

Пустая строка не содержит символов и представляется как""1.1.4.2 Числовые литералы

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

6

Page 7: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В языке LotusScript допустимы следующие числовые литералы:Тип литерала Пример Диапазон

допустимых значений

Тип данных по умолчанию Допустимые типы суффиксов

Целые числа 777 Long

[-2'147'483'648; 2'147'483'647]

Если число попадает в допустимый диапазон чисел типа Integer, то его тип - Integer, в противном случае - Long.

• % - для Integer;

• & - для Long;

• !-для Single;

• # - для Double;

• @ - для Currency.

Числа сплавающей точкой

-7.7 Double Double• ! - д л я Single;

• # - для Double;

• @ - для Currency.

Числа вэкспоненциальном представлении

7.77Е+03 Double Double• ! - д л я Single;

• # - для Double;

• @ - для Currency.

Двоичные числа &В1100101 Long В представлении числа допустимо до 32 значащих разрядов из 0 или 1. Значения больше или равные &В100...000 (31 разряд из нулей) представляют отрицательные числа. Префикс для двоичных чисел &В.

• % - для Integer;

• & - для Long.

Восьмеричные числа &O1413 Long

Значения больше или равные&O4000000000 0 выходят за границы допустимых значений

В представлении числа допустимо до 11 значащих разрядов из цифр от 0 до 7. Значения больше или равные &O20000000000 представляют отрицательные числа. Префикс для восьмеричных чисел &O. Если число попадает в допустимый диапазон чисел типа Integer, то его тип - Integer, в противном случае - Long.

• % - для Integer;

• & - для Long.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

7

Page 8: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В представлении числа допустимо до 8 значащих разрядов из цифр от 0 до F. Значения больше или равные &Н80000000 представляютотрицательные числа. Префикс для шестнадцатеричных чисел &Н. Если число попадает в допустимый диапазон чисел типа Integer, то его тип - Integer, в противном случае - Long.

Шестнадцатеричн % - д л я

Integer; & - для

Long.

Long&Н308ые числа

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

8

Page 9: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

9

Page 10: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.1.5 Ключевые слова

Ключевое слово - это слово, зарезервированное для внутреннего использования в языкеLotusScript. Ключевые слова являются идентификаторами операторов, встроенных процедур и констант,опций (необязательных параметров) в объявлениях элементов скрипта, типов данных и областей видимости (ОВ) данных.

Так, например, ключевые слова:

• New и Delete определяют имена встроенных процедур;• Call, GoTo или Eqv являются идентификаторами операторов;• Long, Currency или String являются идентификаторами стандартных типов данных;• Private, Public являются идентификаторами опций, определяющих область видимости (ОВ) данных в

скрипте.

Значения ключевых слов нельзя переопределять, т.е. использовать для идентификации других элементов скрипта. У этого правила существует одно исключение: можно использовать многие ключевые слова для создания идентификаторов переменных и процедур для членов классов и переменных для членов пользовательских типов данных. Ниже приводится список всех ключевых слов языка LotusScript:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

10

Page 11: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

11

Page 12: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

AcosArrayAppend Atn

ActivateAppArrayReplaceAtn2

AliasArrayGetlndex As

AndArrayUnique

Access Append Asin

Abs Any Asc

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

12

Page 13: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

13

Page 14: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

14

Page 15: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Bin$Beep Boolean

Base ByVal

Binary BindBin Byte

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

15

Page 16: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

16

Page 17: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Ccur Chr$CodeLockCheck CosCurDrive CDatCDat ClntCodeUnlockCreateLockCurDrive$

CallС ByteCloseCompareCurDirChDir

Case ChrCodeLock Const CurDir$ Ch Drive

CDblClassCommandCSngCurrency

CBool CLngCommand$CStrCVar

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

17

Page 18: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

DDataType Day DefSng Dir

DoEven

ts EElse Environ Err Exit

FFALSE

FullTrimFormats

G

Get

H

Hex

I

If%lnclud

eInputBo

xSInStrCIsDate

IsObject

J

Join

К

Kill

LLBound LeftB$ Len BP Line LOF _ LTrim'

M

MeMidB$ Month

Date Declare DefStr Dir$

%Else Environ$ Error Exp

FileAttrFunctionFraction

Hex$

%lf Input InputBP IntIsElement IsScalar

LCaseLeftBPLenCListLogLTrimS

MessageBox MidBPSDate$ DefBool DefCur DestroyLock

Elself EOF Error$ Explicit

FileCopy FixFreeFile

Hour

IMESetModelnput$lnputBP$

IntegerIsEmptyIsUnknown

LCaseS LeftBPS LeftCS ListTag Long -

Mid Mid

CDateNumber DefByte DefDbl Delete

%Elself EqvEvaluate

FileDateTime For

IMEStatus InputB InStr IsIsList Implode

LeftLeftCLetLMBCS Loop

MidS MinuteDateSerial Deflnt DefVar Double

EndEraseEvent

FileLen ForAII

GoTo

ImpInputBSInStrBIsAIsNulllmplode$

LeftSLenLibLOCLSet

MidB MkDirDateValue DefLng Dim Do

%End ErlExecute

From Format

GetAttr

InInputBox InStrBP IsArray

IsNumeric

LeftB Len В Like LockLSServer

MidBP Mod

GetFileAttr GetThreadlnfo GoSub

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

18

Page 19: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

N

Name New Next NoCase NoPitch NotNOTHING Now NULL

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

19

Page 20: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

20

Page 21: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Oct Output

Open Option

Oct$ On Or

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

21

Page 22: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print PropertyPIPublic

PitchPublished

Preserve Put

Private

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

22

Page 23: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

23

Page 24: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

R

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

24

Page 25: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

25

Page 26: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Randomize Resume RightBP RSet

ReDim Right RightC RTrim$

Rem Right$ RmDir Replace

Read Return RightBP$ RTrim

RemoveRightBRndRightC$

Random Reset RightB$ Round

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

26

Page 27: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

27

Page 28: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Second Sgn Space StopStrLeftBack SetAttr

StrRightBack$

TSelect Shell

Spc Str$StrRightBackStrCompStrToken$SendKeysSinSqr

String StrLeft$SetSingle

StaticString$ StrLeftBack$

SetFileAttrSleepStepStrLeftSubStrRight$

Seek Shared Space$ StrStrRight SplitStrToken

StrCompare StrConv

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

28

Page 29: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

29

Page 30: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

TanTimeValueType

UCase UnlockThen To

TypeName

UCase$ Uchr UntilUse

TimeNumber Trim$

UniUstring

Tab TimerTRUE

U

Ubound Unicode UStringS

Time$ Trim

TimeTodayTimeSerial

UChr$ UseLSX

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

30

Page 31: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

31

Page 32: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

VarTypeVariantVal

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

32

Page 33: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

33

Page 34: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

W

Weekday

Xor

Width With WriteWend While

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

34

Page 35: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

35

Page 36: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

YieldYear

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

36

Page 37: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.1.6 Специальные символы

В LotusScript используются специальные символы для следующих целей:

• в строковых литералах - для обозначения их границ;• в именах переменных - для обозначения их типов данных;• в списках таких, как списки аргументов, - для разделения элементов списка;• в операторах - для их разделения;• в скрипте - для определения строк продолжения.

Специальные символы, встречающиеся в теле строковых литералов, воспринимаются языком LotusScript как обычные символы.

Конкретное предназначение специальных символов в зависимости от контекста приведено в следующей таблице:

Специальный символ Предназначение

.... (двойные кавычки) В однострочных строковых литералах используются как ограничители литерала

(символ вертикальной черты)

В многострочных строковых литералах используются как ограничители литерала

"{" и "}" (символы открывающих и закрывающих фигурных скобок)

В многострочных строковых литералах используются как ограничители литерала

и . п / \

(двоеточие) • разделяет операторы, стоящие в скрипте на одной строке;

• используется при определении меток.

"$" (знак доллара) • используется как суффикс для явного или неявного определения идентификатора типа

String;

• как префикс для внутренних констант.

"%" (символ процента) • используется как суффикс для явного или неявного определения идентификатора типа

Integer;

• используется как префикс для директив компилятора.

"&" (символ амперсанд) • используется как суффикс для явного или неявного определения идентификатора типа

Long;

• используется как префикс для определения числовых литералов типа двоичные,

восьмеричные и шестнадцатеричные числа;

• используется как оператор конкатенации строк в выражениях.

"!" (восклицательный знак)

Используется как суффикс для явного или неявного определения идентификатора типа Single.

"#" (символ решетки) • используется как суффикс для явного или неявного определения идентификатора типа

Double;

• используется как префикс в идентификаторах и значениях переменных для задания

номера файла при файловых операциях ввода-вывода.

"@"(сим Используется как суффикс для явного или неявного определения идентификатора типа Currency.

""(сим • используется в операторе объявления строк фиксированной длины;

• используется как оператор умножения в выражениях.

"(" и ")" (символы открывающих и закрывающих круглых скобок)

• используются в выражениях для определения порядка выполнения вычислений;

• используются как ограничители списка аргументов функций и процедур;

• используются в объявлениях и ссылках на элементы массивов;

• используются в ссылках на элементы списка.

а и

• используется в составных^имёнах перЭДмшн ых, ссылающихся на объекты,

определенные пользователем типы данных и в операторе With;

• используется как разделитель целой и дробной части в числовых литералах с плавающей

точкой.

".."(два символаточка)

Используется в производном классе для ссылки на одноименную процедуру в базовом классе при объявлении перегружаемой процедуры.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

37

Page 38: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.1.7 Метки

Метки используются для присвоения операторам скрипта имен. В языке LotusScript существует ряд операторов, которые могут менять последовательность выполнения скрипта, путем передачи управления на операторы с меткой.

Формирование имени метки соответствует правилам формирования имен идентификаторов. Помимо этого, при употреблении меток должны выполняться следующие условия:

• метка должна стоять в начале строки;• следующий символ за меткой должен быть символ двоеточия (":");• метка не должна иметь суффикса, определяющего тип данных;• на одной строке может быть только одна метка;• если на строке с меткой присутствует оператор, то метка ссылается на первый оператор в этой строке (в

строке может быть несколько операторов, разделенных символом двоеточие

• если на строке с меткой присутствует только одна метка, то она ссылается на первый оператор в следующей строке;

• один оператор в скрипте может иметь несколько меток, но в этом случае они должны располагаться на разных строках;

• в теле определенной процедуры метка с одним именем может встречаться только одни раз.

• Список операторов, которые Меняют последовательность выполнения скрипта, передавая управление метке:1.1.8 Директивы компилятора

В параграфе, посвященном комментариям, мы уже рассмотрели одну директиву компилятора %Rem ... %End Rem. Кроме нее в LotusScript существует еще две директивы компилятора %lnclude и %lf.

С точки зрения синтаксиса, директивы компилятора это предложения скрипта, начинающиеся с символа процента (%). Функциональная нагрузка данных конструкций обеспечивает выполнение определенных действий и указаний до момента компиляции программы.

Директива %lnclude дает указание компилятору заменить эту директиву на текст ASCII-файла, имя которого указано в качестве параметра директивы. Синтаксис %lnclude следующий:

открывающих и закрывающих квадратных скобок)

Используется как о"ррн долитесь имаднмвояыределенных продуктах фирмы Lotus для определения объектов продукта.

","(символ запятая) • разделяет аргументы в списке при вызове процедур и функций и в их описаниях;

• разделяет размерности в объявлениях и ссылках на элементы массива;

• разделяет выражения в операторах Print и Print#.

";" (символ точка с запятой)

Разделяет выражения в операторах Print и Print#.

U I H Начинает однострочны с иивмилеанпгазсрпрй).ф)

(символ нижнего подчеркивания)

Используется как символ переноса для многострочных операторов в скрипте.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

38

Page 39: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

%lnclude имя файла

где:

имяфайла - текстовый литерал, значение которого есть имя файла, возможно с путем к нему. В случае если в именифайла опущено его расширение, LotusScript автоматически добавит расширение LSS. Если файл, который необходимо добавить в скрипт директивой %lnclude, не содержит расширения, то в имени файла после собственно имени необходимо добавить символ точки. В этом случае LotusScript не будет добавлять расширение по умолчанию LSS.

Директива %lnclude должна быть единственной конструкцией в строке скрипта, за исключением комментария, начинающегося символом апострофа. Если в имени файла опущен путь к нему, то директории поиска файла будут определяться в зависимости от конкретного продукта Lotus (для Domino/Notes это директория данных "notes\data"). В файле с именем имя файла могут также встречаться директивы %lnclude. Допускаемый уровень таких вложений %lnclude -16.

В процессе компиляции директива %lnclude заменяет содержимое указанного файла, и данный файл затем компилируется как часть текущего скрипта.

При возникновении ошибок во включаемом файле в процессе выполнения, функция, возвращающая номер строки с ошибкой, вернет номер строки с соответствующей директивой %lnclude. Для ошибок стадии компиляции, возникающих во включаемом файле, также будет указана как ошибочная - строка с директивой %lnclude. Следует заметить, что при использовании включаемых файлов, компилятор обнаруживает меньше ошибок, чем без них. Так, например, не отслеживаются ошибки несоответствия типов.

Содержимое включаемого файла должно состоять только из операторов и конструкций LotusScript. В противном случае генерируется сообщение об ошибке. Также генерируется сообщение об ошибке, если LotusScript не может найти включаемый файл.

Директиву %lnclude можно использовать как дополнительный способ защиты исходного текста собственного скрипта от несанкционированного копирования. В этом случае включаемый файл размещается на локальном диске разработчика, а в элементе дизайна указана только директива %lnclude. После компиляции такой элемент дизайна будет нормально работать и на другой станции/сервере, однако модифицировать его сможет только разработчик.

Пример. Демонстрирует варианты применения директивы %lnclude.

%Include "C:\abc.txt"

'включает в скрипт файл АВС. ТХТ из корневого каталога диска С

%Include "BCD"

'включает в скрипт файл BCD.LSS из директорий поиска продукта Lotus ' (для

Notes/Domino это директория данных "notes\data" ) %Include "C:\Notes\Cde."

'включает в скрипт файл CDE из каталога Notes диска С

Директива %lf указывает компилятору пропускать или компилировать входящие в директиву блоки операторов, в зависимости от текущего состояния констант продукта. Данная директива обычно используется для написания платформо-независимых приложений. Синтаксис директивы следующий:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

39

Page 40: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

где:

• константа1, ... константаЫ - есть либо встроенные константы продукта, либо константы, определяющие платформу из следующей таблицы:

%lf константа1

группаоператоров 1[ %Elself константа2

группа_операторов2\

[%Else

группаоператоровЩ%End If

Константа Платформа

WIN16 Windows с 16-разрядным API (Windows 3.1)

WIN32 Windows с 32-разрядным API (Windows NT или Windows 95)

WINNT Windows NT

WIN95 Windows 95

WIN40 Windows NT 4.0 или Windows 95

WINDOWS Любые Windows платформы (любые соответствующие перечисленным выше константам WINxx)

HPUX HP/UNIX 9.x и выше

SOLARIS Sun/OS 5.0 и выше

UNIX Любые UNIX платформы, включая HPUX и SOLARIS

OS2 OS/2 версии 2.0 и выше

LINUX Linux

MAC Macintosh System 7

OLE Поддержка OLE-2

МАС68К Macintosh Motorola версии 68000 (поддерживается на всех Macintosh 68ххх и PowerPC

МАСРРС Macintosh PowerPC

OS400 IBM AS400

OS390 IBM S/390 User System Services или IBM z/OS

ZOS IBM z/OS (QS390 так же будет TRUE)

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

40

Page 41: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

При использовании этих констант в директиве %lf компилятор LotusScript не вызывает соответствующий продукт для их вычисления, а делает это самостоятельно.

Грynna_nepamopoeJ компилируются только в случае, если соответствующая KOHcmaHmaJ равна True. Если ни одна конcmaнmaJ не равна True, то компилируются группа операторови, соответствующая конструкции %Else.

Запрещается непосредственное указание директивы %lf в среде разработки (IDE, для Domino это Lotus Domino Designer), в случае необходимости можно указать данные директивы в ASCII-файле, и затем включить этот файл в IDE директивой %lnclude.

KoнcтaнтaJ должна находиться в той же самой строке, что и конструкция %lf или %Elself. Никакие другие конструкции, кроме комментариев, начинающихся с апострофа, не могут быть размещены в данных строках. Причем комментарии могут быть размещены только в самом конце этих строк (после констант), или в строках %Else или %End If, после этих конструкций. Все перечисленные выше строки не могут быть продолжены символом продолжения строки ("_").

Вся конструкция обрабатывается сверху вниз, и проверка константьЗ на истинность производится только в том случае, если все предыдущие константы имели значение False. В случае обнаружения первой константы, значение которой есть True, компилируется соответствующая группа операторов. Дальнейшие проверки констант не производятся, и никакие другие группы операторов при этом не компилируются. Если ни одна константа не имеет значения True, то компилируется группа операторов, соответствующая конструкции %Else.

Допускается использование любого числа конструкции %Elself внутри директивы %lf. Вложенные директивы %lf не допускаются.

Пример. Демонстрирует применение директивы %lf.

Dim doc As NotesDocument %If WINDOWS

Print IsObject (doc)

'функция IsObject поддерживается на платформах WINDOWS,

'но не поддерживается в OS/2, Unix и Macintosh %End If

1.2 Переменные и константы

Переменные и константы - это поименованные области памяти, предназначенные для хранения значений определенного типа.

Константы отличаются от переменных тем, что их значения не могут меняться в процессе выполнения программы.

1.2.1 Типы данных, поддерживаемые LotusScript

LotusScript позволяет оперировать шестью скалярными (элементарными) и шестью комбинированными типами данных. Тип значения любой переменной или константы должен соответствовать этому набору.

1.2.1.1 Скалярные типы данных

LotusScript поддерживает следующие скалярные типы данных:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

41

Page 42: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Имя типа данных

Пояснения Диапазон допустимых значений Суффик с типа данных

Размер выделя емой памяти

Начальное значение при объявлении переменной

Integer целоеодинарнойточности

[-32'768; 32'767] % 2 байта

Long целое двойной точности

[-2'147'483'648; 2'147'483'647] & 4 байта

Single вещественноеодинарнойточности

[-3.402823Е+38; 3.402823Е + 38] ! 4 байта

Double вещественноедвойнойточности

[-1.7976931348623158Е+308; 1.7976931348623158Е+308]

# 8 байт 0

Currency вещественное с фиксированной точкой и четырьмя знаками после запятой

[-922'337'203'685'477.5807; 922'337'203'685'477.5807]

@ 8 байт 0

String строковое ограничено доступной памятью $ 2 байта насимвол

• "" (пустая строка) для строк переменной длины;

• строка из символов Chr(0) для строк фиксированной длины.

Byte Целое [0; 255] нет 1 байт 0

Boolean Целое, логическоеИмеют смысл 2 значения 0 (False)

или -1 (True)

нет 2 байт 0

1.2.1.2 Комбинированные типы данных

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

42

Page 43: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.2.2 Преобразование типов данных

Значение константы или переменной должно иметь определенный тип, поэтому при вычислении выражений, присвоении значений, передаче параметров процедуре и т. д. данные должны приводиться к одному типу. Преобразование типов данных может производиться как автоматически, самим LotusScript, так и явно, с помощью встроенных функции преобразования типов.

Функции явного преобразования типов будут рассмотрены позднее в настоящей главе.

1.2.2.1 Автоматическое преобразование типов данных

LotusScript автоматически производит преобразования типов данных в следующих случаях:

LotusScript поддерживает также типы данных, являющихся комбинацией скалярных типов. Эти типы данных приведены в таблице:

Тип данных Пояснения Размер выделяемой памяти

Array Массив. Совокупность элементов одного типа. Максимальная размерность - 8. Индексы массива могут изменяться в пределах [-32'768; 32'767].

ограничено доступной памятью

List Список. Соответствует одномерному массиву, но ссылка на элемент списка производится не по индексу, а по уникальному имени.

ограничено доступной памятью

User defined data type Тип данных определяемый пользователем. Совокупность элементов, возможно, различного типа. Аналог структуры в языке Си или записи в Паскале.

64 Кбайта

User defined class Класс, определяемый пользователем. Совокупность элементов, возможно, различного типа и процедур, оперирующих этими данными.

Object reference Ссылка на объект типа OLE или класс. 4 байта

Variant Специальный тип данных, который может содержать любые скалярные типы данных, массивы, списки и ссылки на объект. Также Variant может содержать данные типа дата/время и булевские.

16 байт

Более детально комбинированные типы данных будут рассмотрены позднее в настоящей главе.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

43

Page 44: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Выполнение операций с числовыми типами данных

При выполнении операций с числовыми типами данных, в случае если операнды имеют разный тип данных, то перед выполнением операции данные приводятся к одному типу.

LotusScript, приводя данные к одному типу, преобразует их к наивысшему (по признаку разрядности). Приоритет типов (от наименьшего к высшему) Integer, Long, Single, Double, Currency.

Пример. Перед выполнением операции сравнения произойдет преобразование типа операнда Mylnt от Integer к Currency.

Mylnt% = 123

MyCurr@ = 22.3456

If Mylnt% > MyCurr@ Then

End IfДетальные описания правил преобразования типов для каждой операции приведены в документации.

Передача параметров в процедуры

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

44

Page 45: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

45

Page 46: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

При передаче по значению числовых преобразования типов в соответствии с типами, выходят за допустимые границы, то генерируется

параметров в процедуру LotusScript осуществляет объявленными в процедуре. Если при этом значения ошибка.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

46

Page 47: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

47

Page 48: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

При передаче по ссылке числовых параметров в процедуру, их тип должен соответствовать объявленному типу в процедуре, за исключением случая, когда аргументы в процедуре были объявлены как Variant.

Операции с данными типа Variant

В случае, когда значение в выражении имеет тип Variant, то преобразование в строку или число происходит в зависимости от контекста.

Если значение переменной типа Variant выходит за границы допустимых значений определенного типа, то происходит преобразование значения к высшему типу данных.

Пример. При изменении значения переменной MyVar от 32767 к 32777 происходит преобразование типа от Integer к Long. Обратите внимание, что при обратном переходе от 32777 к 32757 преобразование типов не происходит.

Dim MyVar as VariantMyVar = 32767MessageBox TypeName (MyVar), 16,"Demo" 1 Выводит INTEGERMyVar = MyVar +10MessageBox TypeName (MyVar), 16,"Demo" ( Выводит LONGMyVar = MyVar - 20MessageBox TypeName (MyVar), 16,"Demo" ' Выводит LONG

Преобразование типов происходит также при выполнении операций сложения и конкатенации, в случаях, если одно из значений типа Variant содержит строковые данные, а другое числовые данные.

Операция сложения в этих случаях выполняется, если один оператор содержит числовое значение, а второй строку, которая может быть преобразована в число. Соответственно, операция конкатенации выполняется, если оба оператора содержат строковые значения, причем один операнд имеет тип String (а не Variant), а второй Variant, который не может быть преобразован в число.

Пример. В настоящем примере демонстрируется преобразование типов при операциях сложения/конкатенации значений типа Variant.

Dim MyVar, MyVarl, MyVar2 As Variant Dim

MyStr As String Dim Mylnt As Integer

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

48

Page 49: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Mylnt = 32

MyVar =32

Msgbox Typename (MyVar)

MyVar1 = "43.3" Msgbox

Typename (MyVarl)

MyStr="16"

Msgbox Typename (MyStr)

MyVar2 = MyStr + MyVar1

Msgbox Typename (MyVar2)

Msgbox MyVar2 MyVar2 =

MyStr + Mylnt Msgbox

Typename (MyVar2) Msgbox

MyVar2 MyVar2 = MyStr +

MyVar Msgbox Typename

(MyVar2) Msgbox MyVar2

MyStr="ABC"

Msgbox Typename (MyStr)

MyVar2 = MyStr + MyVar

Msgbox Typename (MyVar2)

Msgbox MyVar2 MyVar2 =

MyVar + MyVarl Msgbox

Typename (MyVar2) Msgbox

MyVar2

Выводит INTEGER

Выводит STRING

Выводит STRING

Выводит STRING

Выводит 1643.3

Выводит DOUBLE

Выводит 4 8

Выводит STRING

Выводит 1632

Выводит STRING

Выводит STRING

Выводит АВС32

Выдаст ошибку!

так как оба операнда Variant

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

49

Page 50: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

50

Page 51: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В завершении данного параграфа хотелось бы высказать некоторые пожелания разработчикам:

все необходимые преобразования типов выполнять явно, за исключением простейших типа повышения разрядности;не прибегать к экзотическим преобразованиям типа сложения числа со строкой.

1.2.3 Константы

Константы в LotusScript, как уже упоминалось ранее, есть поименованные области памяти, предназначенные для хранения значений определенного типа. Значение констант не могут меняться в процессе выполнения программы.

В языке LotusScript могут использоваться константы следующих типов:

• встроенные непосредственно в язык константы. Данные константы всегда доступны в приложениях;• константы, определенные в файле LSCONST.LSS и аналогичных файлах. Данные константы доступны в

приложениях только в случае включения в тела скрипта вышеуказанного файла с помощью директивы компилятора %lnclude;

• константы, определенные для конкретного продукта фирмы Lotus. Данные константы могут быть доступны как сразу непосредственно из языка, так и после загрузки из определенного файла;

• константы, определенные пользователем.• Значение константы актуально внутри скомпилированного объектного кода. Если изменить значение

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

1.2.3.1 Встроенные в язык константы

Ниже перечислены все встроенные в язык константы и их значения:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

51

Page 52: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.2.3.2 Константы, определяемые пользователем

Разработчик может определить свои собственные константы внутри процедуры или модуля. Тип данных константы должен быть скалярным и поддерживаемым LotusScript.

Синтаксис оператора определения собственных констант:

[ опция области видимости] Const имя_константы = выражение,

где:

• опцияобластивидимости - необязательный элемент оператора определения константы. Может быть либо Public, либо Private. Допускается использование только при определении константы внутри модуля (но не внутри процедуры). Public определяет константу с областью видимости, выходящей за пределы модуля, в котором константа была определена. Соответственно Private используется при определении константы с областью видимости в пределах модуля, в котором константа была определена. По умолчанию используется опция Private;

Константа Значение и комментарий

NOTHING Начальное значение переменной ссылающейся на объект. После того как такая переменная начинает ссылаться на существующий объект, ее значение перестает быть NOTHING.

Можно явно присвоить переменной значение NOTHING, также можно сравнивать значение переменных с NOTHING с помощью оператора Is.

NULL Специальное значение, представляющее неизвестные или пропущенные данные.Данное значение можно присвоить только переменной типа Variant. Для проверки переменной на значение NULL необходимо использовать функцию IsNull.

PI Число Пи (3.141592 ...).

Константа может быть использована только для присваивания значения переменной числового типа или в числовых выражениях.

TRUE и FALSE Представляют булевские значения True и False, в LotusScript соответственно - 1 и 0. Любое не нулевое значение полагают равным True. Данные значения возвращают все операторы сравнения и логические операторы.

EMPTY Начальное значение переменной типа Variant. LotusScript конвертирует это значение:

• в пустую строку для операции со строками;

• в 0 для числовых операций.

Для проверки переменной на значение EMPTY необходимо использовать функцию IsEmpty. Данное значение нельзя присвоить явно никакой переменной.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

52

Page 53: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• имя константы - имя идентификатора для ссылки на данную константу. Не должно совпадать с именами других констант, переменных или процедур в пределах области видимости данной константы;

• выражение - определяет значение, присваиваемое данной константе. Выражение должно представлять собой комбинацию из других констант, литералов, логических и арифметических операторов. Допустимо также использование некоторых встроенных функций LotusScript (например, Abs, или UCase$), которые вычисляются в момент компиляции и имеют в качестве своих аргументов значения, представляющие константы. В определенных случаях допустимо использование в выражении суффиксов типов данных.

1.2.3.3 Типы данных констант

Константы могут иметь только скалярный тип данных, который определяется по следующим правилам:

• если в имени константы присутствует суффикс типов данных, то он и определяет тип данных константы. Например,

Const MyStr$ = "Это строка-константа"

В данном примере явно задан тип константы MyStr как строковый;• если суффикс типов данных отсутствует и в имени, и в определяющем выражении для константы, то тип данных

константы определяется по значению выражения. А именно:

При ссылке на константу можно указывать суффикс ее типа данных, независимо от того имел ли оператор ее определения суффикс или нет. Например,

Public Const MyStr$ = "строка1"

Private Const MyStrl = "строка2"

MessageBox MyStr$, 16, "Demo"

MessageBox MyStrl$, 16, "Demo"

Однако, при указании суффикса типа данных при ссылке на константу нельзя забывать о реальном типе данных константы. Так для вышеприведенного примера оператор:

MessageBox MyStr@, 16, "Demo"

выдаст сообщение об ошибке на стадии компиляции.

Для точного определения типа данных константы можно воспользоваться встроенными функциями TypeName и DataType языка LotusScript. Эти функции будут рассмотрены позднее в настоящей главе.

Тип данных значения выражения Тип данных константы

String String

Single, Double Double

Integer Integer

Long Long

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

53

Page 54: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.2.3.4 Область видимости констант

Область видимости - это часть скрипта, в рамках которого значение константы/переменной доступно.

Область видимости констант, определенных в процедурах, есть сама процедура. Такие константы могут быть доступны вне процедуры только с помощью самой процедуры (например, в случае передачи ее значения через аргумент процедуры).

В случае если имя константы, определенной в процедуре, совпадает с именем константы или переменной определенной/объявленной уровнями выше данной процедуры, то при ссылке на такую константу в теле процедуры берется значение из определения константы в текущей процедуре. При этом значение одноименной переменной/константы не портится. Данный эффект называется "shadowing".

Пример. В вызывающем модуле определяется константа Mylnt, одноименная константа определяется и в вызываемой процедуре. При печати из тела процедуры выдается результат 123, а при печати из вызывающего модуля результат 987.

Public Const Mylnt% = 987

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

54

Page 55: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

55

Page 56: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Call MySub 'выводит 123 Print

Mylnt% ' выводит 987 Sub

MySub

Const Mylnt% = 123

Print Mylnt% End Sub

Область видимости констант, определенных внутри Private). Расширения области видимости констант на следующих путей: модуля, есть, по умолчанию, сам модуль (опция все модули приложения достигается одним из

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

56

Page 57: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

57

Page 58: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• включением в оператор определения константы ключевого слова Public. Например,

Public Const MyGlobalStr$ = "глобальная строка-константа"

• включением оператора Option Public - в качестве первого оператора модуля, загружаемого при запуске конкретного приложения. В этом случае все идентификаторы данного модуля получают опцию области видимости типа Public.

Для доступа к Public константам, определенным в другом модуле, необходимо включить в текущий модуль текст модуля с определениями с помощью оператора Use.

1.2.4 Переменные

Переменные в LotusScript, как уже упоминалось ранее, есть поименованные области памяти, предназначенные для хранения значений определенного типа. Значение переменных могут меняться в процессе выполнения программы.

В данном параграфе будут рассмотрены переменные всех допустимых скалярных типов данных, а из комбинированных типов будут рассмотрены только массивы, списки и тип данных Variant (контекст типа ссылок на объекты будет рассмотрен в параграфе, посвященном классам). Изложение материала, касающегося переменных остальных типов данных, будет дано позднее в настоящей главе.

1.2.4.1 Область видимости переменных

Область видимости переменных в LotusScript может быть одна из следующих:

• в пределах модуля;• в пределах процедуры;• в пределах класса или определенного пользователем типа данных.

В рамках одной области видимости нельзя объявить две одноименные переменные или процедуры. При обнаружении такого события ("конфликт имен") компилятор генерирует ошибку.

Допускается объявлять переменные или процедуры с одинаковыми именами в различных областях видимости.

В этом случае, если:

• области видимости не пересекаются, то LotusScript интерпретирует такие имена как имена различных переменных/процедур;

• области видимости пересекаются, и ссылка на такое имя осуществляется во внутренней области видимости, то ссылка указывает на переменную/процедуру, объявленную во внутренней области видимости. При этом переменная/процедура из внешней области видимости не затрагивается (shadowing);

• области видимости пересекаются, и ссылка на такое имя осуществляется во внешней области видимости, то ссылка указывает на переменную/процедуру, объявленную во внешней области видимости. При этом переменная/процедура из внутренней области видимости не затрагивается.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

58

Page 59: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Область видимости в пределах модуля

Переменная имеет область видимости в пределах модуля, если она объявлена в самом модуле, но не во входящих в него процедурах, классах или пользовательских типах данных.

В этом случае ссылка на такую переменную имеет смысл до тех пор, пока модуль загружен.

Значение такой переменной доступно везде в пределах модуля, за исключением случаев, когда в процедурах, классах или пользовательских типах данных, входящих в модуль, есть одноименные переменные.

По умолчанию переменная объявляется с опцией области видимости типа Private (т.е. доступной только в пределах своей области видимости). Для расширения области видимости переменной на другие модули, ее объявляют с опцией Public, причем в модулях, на которые должна распространиться область видимости, должен быть явно включен модуль, в котором переменная была определена. Это достигается оператором Use. При использовании этого оператора в модулях, у которых объединяются объявления (переменных, констант и т.д.), могут возникнуть следующие "конфликты имен":

"Конфликты имен" могут также возникать и в рамках одного модуля:

имя пользовательского типа совпадает с именем класса;для переменной с областью видимости в пределах модуля существует одноименная константа или процедура тоже с областью видимости в пределах модуля;для константы с областью видимости в пределах модуля существует одноименная процедура тоже с областью видимости в пределах модуля.

Область видимости в пределах процедуры

Переменная имеет область видимости в пределах процедуры, если она объявлена в теле процедуры, функции или свойства. Значение такой переменной доступно везде в пределах процедуры (функции, свойства).

Обычно такие переменные создаются и инициализируются при вызове процедуры, и удаляются по окончании процедуры. Этот процесс можно модифицировать, если объявить переменную, как статическую с помощью опции Static. В этом случае:

• если переменная объявлена, как статическая, то ее значение сохраняется между последующими вызовами этой процедуры;

• если сама процедура объявлена, как статическая, то значения всех переменных в этой процедуре (явно и неявно объявленных) сохраняются между последующими вызовами этой процедуры.

При объявлении переменных с областью видимости в пределах процедуры могут возникнуть следующие конфликты имен:

• два аргумента процедуры имеют общее имя;• две метки имеют общее имя;• две переменных имеют общее имя;• аргумент процедуры и переменная имеют общее имя;• функция содержит переменную или аргумент с именем, совпадающим с именем самой функции;• свойство содержит переменную с именем, совпадающим с именем самого свойства.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

59

Page 60: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Область видимости в пределах класса или определенного пользователем типа данных

Переменная имеет область видимости в пределах класса или определенного пользователем типа данных, если она объявлена в теле пользовательского типа данных или класса. В случае если переменная объявлена во входящей в описание класса процедуре, она также может иметь область видимости в пределах класса. Такие переменные называются переменными членами класса или пользовательского типа данных.

Переменные члены типов данных создаются и инициализируются при объявлении экземпляра типа данных, и удаляются, когда тип данных или его переменная выходит за границы видимости.

Опция видимости переменных членов типов данных автоматически определяется как Public.

Переменные члены классов создаются и инициализируются при создании экземпляра класса, и удаляются при удалении экземпляра класса.

Любая переменная член класса может быть объявлена с опцией как Public, так и Private. Ссылки на переменные члены класса, объявленные с опцией Private допустимы только в пределах класса, членами которого они являются, либо в классах потомках от исходного класса.

По умолчанию опция видимости переменных членов класса - Public.

Видимость переменных членов типов данных (которые всегда Public), и переменных членов классов с опцией Public для различных типов данных и классов зависят от объявлений, ссылающихся на экземпляры классов/типов данных. В частности:

• если переменная, ссылающаяся на экземпляр класса/типа данных, объявлена с опцией Private, то ее видимость определяется в пределах класса/типа данных;

• если переменная, ссылающаяся на экземпляр класса/типа данных, объявлена с опцией Private, то ее видимость совпадает с видимостью переменной ссылки на экземпляр класса/типа данных. На такие переменные можно ссылаться даже в других модулях, при условии включения в них модуля с их описанием при помощи оператора Use.

При объявлении переменных с областью видимости в пределах классов или типов данных могут возникнуть следующие конфликты имен:

• для членов типов данных, если два члена типа данных имеют одинаковое имя;• для членов классов, если два члена класса (переменные или процедуры) имеют одинаковое имя.

1.2.4.2 Переменные скалярного типа

Переменные скалярного типа это переменные, тип данных которых явно или в процессе выполнения оператора присваивания был объявлен как скалярный.

При объявлении переменной создается идентификатор, определяется область видимости, тип данных, который будет у выделяемой области памяти, на которую ссылается переменная, а также присваивается выделенной области памяти начальное значение.

Для явного объявления переменных используется оператор следующего синтаксиса:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

60

Page 61: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

опция области видимости объявление1 [, объявление2].. [, объявление N] ,

где:

опция области видимости - обязательный элемент оператора объявления переменной. Может быть либо: Dim, Private, Public, Static. Опции Dim, Private используются для объявления переменных с областью видимости типа Private (не допускается использование опции Private для объявления переменных внутри процедуры). Опция Public используется для объявления переменных с областью видимости типа Public (не допускается использование данной опции для объявления переменных внутри процедуры). Опцию Static разрешается применять только в процедурах. Статические переменные сохраняют свои значения между последовательными вызовами процедуры до тех пор, пока модуль, в котором процедура была определена, остается загруженным в памяти.

Каждое объявлениеи представляет собой конструкцию вида:

имя_переменной [As тип данных],

где:

• имяпеременной есть идентификатор, представляющий имя объявляемой переменной. При объявлении переменных внутри модуля или процедуры допускается присутствие в именипеременной суффикса типа данных. Однако добавление суффикса типа данных разрешено только в случае отсутствия за именем_ переменной конструкции As тип_данных,

• As типданных определяет тип хранимых в переменной данных. Эта конструкция необходима при объявлении переменных ссылающихся на экземпляры определяемых пользователем типов данных или классов. Но для объявлений переменных в пределах модуля или процедуры эта конструкция не является обязательной.

Следует обратить особое внимание на то, что при объявлении нескольких переменных в одном операторе объявления, для каждой из переменных должен быть явно указан их тип данных, либо с помощью конструкции As тип данных, либо с помощью суффикса типа данных. В противном случае переменная будет иметь тип Variant (за исключением применения оператора Deftype).

Пример. Следующий оператор объявления переменных определяет переменную str3 как переменную типа String, а переменные strl и str2 как переменные типа Variant. Многие читатели знакомые с другими языками программирования (например, Си) могли ожидать, что все переменные strl, str2 и str3 будут иметь тип String.

Dim strl, str2, str3 As String 'объявляет переменную str3 как String,

'а переменные strl и str2 как Variant

Как уже упоминалось выше, при явном объявлении переменных LotusScript производит их инициализацию (т.е. присваивает им начальные значения). Начальные значения зависят от типа данных переменных, и определяются по следующим правилам:

для переменных с числовыми типами данных (Integer, Long, Single, Double, Currency, Byte) - начальное значение ноль;для переменных с типом данных строка произвольной длины - начальное значение пустая строка;для переменных с типом данных строка фиксированной длины - начальное значение есть строка указанной длины, заполненная символами с кодом ноль (Chr(0)).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

61

Page 62: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример 1. Следующее объявление, используемое в пределах модуля, декларирует и инициализирует переменные с опцией видимости Public: My_int как Integer, с начальным значением - 0; My_Double как Double, с начальным значением - 0; My_Cur как Currency, с начальным значением - 0.

Public My_int%, My_Double as Double, My_Cur as Currency

Пример 2. Следующий пример демонстрирует применение опции видимости Static.

Sub My_Sub

Static My_Count as Integer

My_Count = My_Count + 1

Print "Число вызовов процедуры My_Sub равно: " & _ CStr

(My_ Count)

End Sub

Call My_Sub ' Выводит Число вызовов процедуры My_Sub равно: 1 Call

My_Sub 1 Выводит Число вызовов процедуры My_Sub равно: 2

1.2.4.3 Особенности объявления и использования переменных строкового типа

Переменные с типом данных String представляются в LotusScript последовательностью символов в кодировке Unicode. Эта кодировка представляет каждый символ в виде двухбайтовой последовательности. LotusScript перед выполнением компиляции конвертирует необходимые данные к формату Unicode.

Помимо уже рассмотренного выше объявления строк произвольной длины, можно объявить строки с фиксированной длиной. Это достигается оператором:

опцияобластивидимости имя переменной As String * число_символов,

где: число символов - это необходимая длина строки.При применении оператора присваивания к строке с фиксированной длиной, в случае, если реальная длина

выражения в правой части оператора присваивания не равна объявленной длине строки, то:

• если длина выражения больше длины строки, то результирующие значения справа усекаются;• если длина выражения меньше длины строки, то результирующие значения справа дополняются

пробелами (Chr(32)).

Пример. Демонстрирует операции со строками фиксированной длины.

Dim strl as String, str2$, i%

Dim str3 as String * 5

strl = "123"

* если при неявном объявлении переменной в ее идентификаторе присутствовал суффикс типа данных, то LotusScript будет требовать включения этого суффикса при каждой ссылке на данную переменную. В противном случае генерируется ошибка. Напротив, если неявное объявление состоялось без суффикса типа данных, и попало под действие оператора Deftype, то использование (или не использование) при ссылке суффикса типа данных, соответствующего реальному типу, не влечет за собой ошибки;

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

62

Page 63: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Str2 = "987654321"

str3 = strl

For i = 1 to 5

Print "i = " & CStr (i) & " " _

Mid ( str3, i, 1 ) & " " & CStr ( Asc ( Mid ( str3, i, 1 ))) Next

' выводит последовательно

str3 = str2 For i = 1 to 5

Print "i = " & CStr (i) & " " _

Mid( str3, i, 1 ) & " " & CStr( Asc( Mid( str3, i, 1 ))) Next

' выводит последовательно

• если при неявном объявлении переменной в ее идентификаторе отсутствовал суффикс типа данных, и объявление не попало под действие оператора Deftype, то тип данных переменной будет Variant. В этом случае, если при ссылке на такую переменную указать суффикс типа данных, то это вызовет ошибку.

i = 1 9 57i = 2 8 56

i = 3 7 55

i = 4 6 54

i = 5 5 53

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

63

Page 64: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.2.4.4 Неявное объявление переменных

Для переменных с областью видимости в пределах модуля или процедуры допускается неявное объявление. Оно достигается присвоением ранее необъявленной переменной некоторого значения с помощью оператора присваивания.

Пример. Демонстрирует неявное объявление переменной.

Strl = "one"

%REM

выполнение данного оператора приводит к такому же результату, что и Dim Strl

As String Strl = "one" %END REM

должен не забывать об имеющихся в данной икновения ситуации "конфликта имен".

случае их неявного объявления переменные

Deftype, который при неявном объявлении переменных позволяет явно задавать тип данных, в зависимости от первой буквы идентификатора. Его синтаксис будет детально рассмотрен позднее в настоящем параграфе.

В общем случае тип данных, неявно объявленной переменной, определяется по следующим правилам:

• если при неявном объявлении в идентификаторе переменной присутствовал суффикс типа данных, то он и определяет тип данных переменной;

• если суффикс типа данных отсутствовал, то ищется оператор Deftype, подходящий для данного идентификатора. Если таковой имеется, то он и определяет тип данных переменной;

• в противном случае, переменная будет иметь тип Variant.

Эти же правила действуют и при явном объявлении переменных, в случае если их тип явно не указан (с помощью суффикса или с помощью конструкции As тип_данных).

Неявное объявление переменных иногда упрощает программирование, однако, это может привести к ряду ошибок:

При неявном объявлении переменных, разработчик области видимости идентификаторах, чтобы избежать возн

Также как и при явном объявлении переменных, в приобретают определенный тип данных.

В LotusScript существует специальный оператор

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

64

Page 65: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Рассмотрим подробнее синтаксис оператора Deftype:

Deftype [диапазону [, диапазон2]... [, диапазонN]

где:

• Deftype - определяет тип данных и может быть: Deflnt для Integer, DefLng - Long, DefSng - Single, DefDbl - Double, DefCur - Currency, DefStr - String, DefVar - Variant, DefBool - Boolean, DefByte - Byte;

• диапазони - конкретная буква или их интервал (с точки зрения синтаксиса две буквы, разделенные символом тире), определяющие первый символ идентификаторов, для которых при неявном объявлении будет задаваться указанный тип данных. Значением диапазона^ должны быть буквы (a), ASCII коды которых меньше 128. Буквы (а) в диапазони не "чувствительны" к регистру. При указании в качестве диапазонаи интервала значений, его границы включаются в диапазон. Также допускается между буквами, границами диапазона и символом тире вставлять любое количество пробелов или символов табуляции.

Оператор Deffype указывается только на уровне модуля, но не на уровне процедур, пользовательских типов данных или классов. Оператор имеет действие на объявления на уровне модуля и внутри всех функций и не имеет действия на членов типов данных и классов, определенных пользователем. Исключение составляют методы и свойства класса, определенного пользователем.

Все операторы Deftype должны стоять в модуле перед любыми другими операторами объявления данных, явными или неявными, за исключением операторов явного объявления констант.

Диапазон А - Z обладает дополнительными свойствами. Он включает в себя буквы с ASCII кодами больше 128 (в случае если спецификация конкретной реализации LotusScript поддерживает такие символы в именах идентификаторов).

Явное объявление типа идентификаторов, попадающих под действие оператора Deftype, перекрывает действие Deffype.

Пример. Демонстрирует применение оператора Deftype. %REM

декларирует, что при неявном объявлении идентификаторов, имя

которых начинается с i,j,k,l, будут иметь тип Integer %END REM

DefStr O - г %REM

декларирует, что при неявном объявлении идентификаторов, имя

которых начинается с О,Р,Г, будут иметь тип String %END REM

Dim locate as String 'явно объявляет переменную locate как String longl =

111

Print TypeName (longl) ' Выводит Integer по оператору Deflnt

Print TypeName (locate) ' Выводит String по оператору Dim

Print TypeName (prost) 1 Выводит String по оператору DefStr1.2.4.5 Массивы

Массив - это поименованная совокупность элементов одного типа данных. Доступ к конкретному элементу массива осуществляется по его индексу (аналог координат в линейной алгебре). Число индексов, необходимое для позиционирования элемента в массиве, называется размерностью массива (аналог размерности пространства в линейной алгебре). LotusScript поддерживает массивы с размерностью не более 8.

Индексы массива есть целые числа, и для каждого индекса существуют его верхняя и нижняя граница.

LotusScript позволяет оперировать с массивами фиксированного размера (размерность такого массива не меняется в процессе вычислений) и динамическими массивами (их размерность может меняться в процессе вычислений).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

65

Page 66: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В LotusScript существует специальный оператор Option Base, который определяет нижнюю границу изменения индекса по умолчанию. Его синтаксис будет детально рассмотрен позднее в настоящем параграфе.

Для объявления массивов используется оператор:

опция_области_видимости имямассива ([список_размерностей])

__________[As тип_данных]

где:

• опция области видимости - обязательный элемент оператора объявления массива. Может быть либо: Dim, Private, Public, Static. Опции Dim, Private используются для объявления массивов с областью видимости типа Private (не допускается использование опции Private для объявления переменных внутри процедуры). Опция Public используется для объявления массивов с областью видимости типа Public (не допускается использование опции Public для объявления переменных внутри процедуры). Опцию Static разрешается применять только в процедурах. Статические массивы сохраняют свои значения между последовательными вызовами процедуры до тех пор, пока модуль, в котором процедура была определена, остается загруженным в памяти;

• имя массива задает идентификатор для ссылки на значения массива. Для области видимости в пределах модуля или процедуры в имя массива можно включать суффикс типа данных, который будет определять реальный тип данных элементов массива. Включать в имя массива суффикс типа данных можно только при отсутствии в этом объявлении конструкции As тип_данных;

• As тип данных определяет тип, хранимых в элементах массива, данных. Эта конструкция необходима при объявлении массивов с областью видимости в пределах определяемых пользователем типов данных или классов. Но для объявлений массивов в пределах модуля или процедуры эта конструкция не является обязательной. Данная конструкция, как уже упоминалось ранее, не совместима с суффиксом типов данных в имени массива. Тип_данных должен быть либо скалярным, либо Variant, либо определенного пользователем типа данных, или ссылкой на объекты.

В случае если в объявлении массива явно отсутствует ссылка на тип данных его элементов (с помощью суффикса или конструкции As тип_данных), и если имя массива не попадает ни под одно действие оператора Deffype, то элементы массива приобретают тип Variant. В противном случае, тип данных определяется оператором Deffype.

При выполнении оператора объявления массива фиксированного размера происходит инициализация его элементов значениями, соответствующими типу данных массива.

Следует обратить внимание, что ссылка на элементы массива с индексами, выходящими за пределы объявления, вызывает ошибку только на стадии выполнения, а не компиляции.

Массив с областью видимости в пределах процедуры не может занимать в памяти более 32 Кбайт. Размер занимаемой памяти легко вычислить, исходя из типа данных элементов массива и числа его элементов.

Пример. Объявление массива My_Dim, занимающего в памяти 4 байта на элемент * 4 элемента по первой размерности * 6 элементов по второй размерности * 21 элемент по третьей размерности * 8 элементов по четвертой размерности = 16128 байт = 15,75 Кбайт.

Option Base О

* список_размерностей - обязательный элемент оператора для массивов фиксированного размера, для динамических массивов должен отсутствовать. Определяет размерность массива и границы изменения индекса. С точки зрения синтаксиса - это список значений, разделенных символом запятая. Каждое значение такого списка представляет собой конструкцию вида [нижняя граница_индекса То] верхняяграницаиндекса. В этой конструкции нижняя_граница_индекса определяет соответственно нижнюю границу индекса, а верхняя_граница_индекса - верхнюю границу индекса. В случае если конструкция [нижняя_граница_индекса То] была опущена при объявлении, то нижняя_граница_индекса становится равной 0, если не был ранее применен оператор Option Base с параметром 1 (в этом случае нижняя_граница_индекса будет равна 1). Нижняя_граница_индекса и верхняя_граница_индекса должны быть числовыми литералами типа Integer, и, следовательно, они должны лежать в пределах [-32'768; 32'767]. Для массивов фиксированного размера допускается в качестве нижней_границы_индекса и верхней_границы_индекса указывать имена констант, значения которых определены на момент компиляции, и имеют тип данных Integer;

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

66

Page 67: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Dim My_Dim (1 То 4, 5, -10 То 10, 7) as Single

Рассмотрим подробнее синтаксис оператора Option Base:

Option Base нижняя_граница_индексов_массивов_по_умолчанию

где:

нижняя_граница_индексов_массивов_по_умолчанию - есть числовой литерал (0 или 1), который задает нижнюю границу индексов для всех массивов, у которых она явно не будет задана, в рамках текущего модуля.

Оператор Option Base можно применять только в рамках модуля (не процедуры, класса и т.д.), и для конкретного модуля допустимо использование только одного оператора Option Base. Кроме этого он должен стоять в модуле перед всеми объявлениями и переопределениями массивов.

При отсутствии в модуле оператора Option Base нижняя граница индексов массивов считается равной 0.

Динамические массивы

Динамические массивы, обычно используются, когда истинная размерность на момент объявления неизвестна, или когда необходимо менять границы индексов в момент вычисления.

Синтаксис объявления динамических массивов отличается от объявлений массивов фиксированного размера, только отсутствием списка_размерностей.

Пример. Объявление динамического массива My_arr_dinamic с типом данных элементов String.

Dim My arr dinamic ( ) as String

При объявлении динамического массива не происходит реальное выделение памяти под его элементы, происходит только занесение имени массива в пространство имен, и запоминается тип данных (если он имеется) будущих его элементов.

После объявления динамического массива, он остается недоступным до тех пор, пока ему не будут определены его истинная размерность и границы изменения индексов. Данная процедура выполняется с помощью оператора ReDim.

Синтаксис оператора ReDim следующий:

ReDim [Preserve] имя_массива1 (список_размерностей1) [As тип_данныхТ\ [,

имя_массива2 (список_размерностей2) [As тип_данных1]] ,

где:

• имя массива, список_размерностей и As типданных имеют тот же смысл, что и при объявлении массивов фиксированного размера. Отличия в их использовании будут рассмотрены ниже;

• Preserve - необязательный параметр оператора, заставляющий сохранять уже определенные значения динамического массива при его переопределении. Если он опущен, то все элементы массива будут проинициализированы в соответствии с типом данных массива.

В документации сказано, что в качестве имени_массива не может выступать переменная типа Variant, которая содержит значения массива. Однако опыт показывает, что если переменная типа Variant, которая содержит массив, была предварительно явно объявлена, то она может быть использована в теле оператора ReDim.

С помощью оператора ReDim нельзя переопределить тип данных элементов массива, если он уже ранее был определен. Поэтому для массивов, тип данных которых был ранее определен, конструкция As тип данных должна в точности совпадать со своим аналогом при определении. В противном случае генерируется ошибка на стадии компиляции.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

67

Page 68: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В качестве значений нижнейграницыиндекса и верхней границы индекса в списке_размерностей, в дополнение к числовым литералам и константам, допускается использование имен переменных, значение которых на момент выполнения оператора ReDim определено, и имеет тип Integer.

Оператор ReDim резервирует память под динамический массив. Эту процедуру можно проделывать неоднократно. Существует только одно ограничение - первый вызов оператора ReDim определяет размерность для конкретного массива, дальнейшие вызовы оператора ReDim могут только изменить границы изменения индексов, но не могут изменить саму размерность массива. В противном случае генерируется ошибка на стадии компиляции.

При использовании в операторе ReDim опции Preserve допускается изменение только верхней границы индексов по любой размерности. Изменение нижней границы индекса влечет за собой ошибку на стадии выполнения.

Не допускается применение оператора ReDim в цикле ForAII, где переменная контейнера представляет собой ссылку на массив, в этом случае генерируется ошибка "Illegal ReDim" (недопустимое применение оператора ReDim).

Для массивов фиксированного размера также не разрешается применять оператор ReDim.

Пример 1. Оператор ReDim объявляет фиксированный массив х типа Variant. ReDim х

(5)Print DataType (х (1)) 'Выводит О

Пример 2. Оператор Dim объявляет динамический массив Y с типом String. Dim Y ( ) As

String

Пример 3. Оператор ReDim изменяет тип данных уже существующего массива Y. ReDim Y

(5) As StringPrint DataType(Y$ (1)) 'Выводит 8

Пример 4. Оператор Option Base 1 устанавливает начальное значение нижних границ размерностей массива равным 1. Элементам массива присваиваются значения 1, 2, 3 и 4.

Option Base 1

ReDim markMar (2, 2)

markMar (1, 1) = 1

markMar (2, 1) =2

markMar (1, 2) = 3

markMar (2, 2) = 4

Пример 5. Изменения верхнего значения индекса markMar с 2 до 3, Сохранение уже существующих значений массива markMar, и присваивание значений добавленным элементам массива markMar

ReDim Preserve markMar (2, 3)

markMar (1, 3) = 5

markMar (2, 3) =6

Print markMar (2, 3) 'Выводит 6

Print markMar (2, 1) 'Выводит 2

Для освобождения памяти, занятой динамическим массивом, можно использовать оператор Erase. Более подробно он будет рассмотрен в параграфе, посвященном спискам. После применения этого оператора к динамическому массиву, будет освобождена вся память, занимаемая элементами массива, но его имя, тип данных и размерность (если они были определены) будут сохранены в пространстве имен.

Применение оператора Erase к массивам фиксированного размера, вызовет реинициализацию его элементов.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

68

Page 69: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Демонстрирует реинициализацию массива фиксированного размера. Dim My_Dim

(5, 3) As String ' объявляем массив My_Dim My_Dim (1, 1) = "1,1" "определяем

элемент 1, 1

Print "My_Dim (1, 1) =" & _

MyDim (1, 1) 'выводит My_Dim (1, 1) = 1, 1

Erase My_Dim 'освобождаем память, занятую элементами1массива

Print "My_Dim (1, 1) =" & _

My_Dim (1, 1) 'выводит My_Dim (1, 1) =1.2.4.6 Списки

Список - это одномерная совокупность элементов одного типа данных. В процессе выполнения приложения можно динамически менять размеры списка, т.к. LotusScript не выделяет под его элементы памяти на шаге компиляции. Список автоматически "сжимается" или "расширяется" при добавлении/удалении в него элементов. Доступ к элементам списка осуществляется по уникальному имени (типа String), называемому тегом списка.

Список можно объявить на уровне модуля, процедуры, или определения класса, но нельзя объявлять список на уровне пользовательского типа данных. Для объявления списка используется уже рассмотренный оператор Dim в следующем синтаксисе:

опция_области_видимости имя списка List [As тип_данных],

где:

опция_области_видимости, имя списка и As тип данных имеют тот же смысл, что и при объявлении массивов. Аналогично нельзя использовать опции области видимости типа Private и Public на уровне процедуры, и точно так же, если пропущена конструкция As тип_данных, то для определения типа данных элементов списка, сначала ищется суффикс типа данных в именисписка, а затем подходящий оператор Deftype, иначе элементы списка приобретают тип Variant.

После выполнения оператора объявления списка - он первоначально пуст. Добавить элемент в список можно с помощью следующего оператора присваивания:

имя списка (имя тега) = значение,

где:

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

Пример. Демонстрирует объявление списка, добавление в него элемента и переопределение элемента списка.

Dim My list List as String * 25

My list ("One") = "Первый элемент списка"

Print My list ("One") ' выводит "Первый элемент списка"

My list ("One") = "Элемент переопределен"

Print My list ("One") ' выводит "Элемент переопределен"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

69

Page 70: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Удаление элементов списка производится с помощью оператора Erase. Проверить наличие элемента в списке можно с помощью встроенной функции IsElement. "Чувствительность" имени тега к регистру зависит от способа сравнения строк, и определяется с помощью оператора Option Compare, который будут рассмотрен позднее в параграфе, посвященном операторам сравнения и подобия.

Рассмотрим подробнее оператор Erase и функцию IsElement. Общий синтаксис

оператора Erase следующий:

Erase имя_удаляемого_объекта1 [, имя_удяляемого_объекта2]

где имя_удаляемого_объекта может представлять собой:

• имямассива - в этом случае для массивов фиксированного размера - произойдет реинициализация элементов массива, для динамических массивов - будет освобождена вся память, занимаемая элементами массива, но его имя, тип данных и размерность (если они были определены) будут сохранены в пространстве имен;

• имя_списка - из списка удаляются все его элементы, но он сохраняет свое имя и тип данных в пространстве имен;

• имясписка {имятега) - удаляет из списка конкретный элемент по имени_ тега.

Встроенная функция IsElement языка LotusScript проверяет по имени тега и имени списка является ли этот элемент элементом списка. Синтаксис функции следующий:

IsElement (имя списка (имя_тега))

Возвращаемое значение True (-1), если элемент с данным тегом содержится в списке, и False (0) в противном случае.

Если имя_списка не соответствует ни одному ранее объявленному списку, то генерируется ошибка. Если имя_тега имеет числовой тип, то LotusScript преобразовывает его к типу String.

Зависимость чувствительности имени_тега к регистру определяется оператором Option Compare.

Пример. Демонстрирует применение оператора Erase и функции IsElement. Dim My_list List As String

My_list ("One") = "Первый элемент списка"

Print My_list ("One") ' выводит Первый элемент списка

My list ("Two") = "Второй элемент списка"Print My list (" Two

") выводит Второй

Erase My list (" Two"

)

Print IsElement (My_

list ("Two"

)) выводит False

Print IsElement (My_

list ("One"

)) выводит True

Erase My list

Print IsElement (My_

list ("One"

)) выводит False

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

70

Page 71: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.2.4.7 Переменные типа Variant

Variant есть специальный тип данных для переменных, которые могут содержать значения любых, поддерживаемых LotusScript, типов данных, за исключением определяемых пользователем типов данных. Тип данных значения переменной Variant может быть одним из следующих:

• любой скалярный тип данных (Integer, Short, Long, Double, Currency, String, Byte);• булевский тип данных (True, False);• тип дата/время;• массив или список;• указатель на OLE-объект, или экземпляр встроенного или определяемого пользователем класса (данный

контекст будет рассмотрен позднее в настоящей главе);• значение Null;• значение Empty.

Объявление переменных типа Variant, аналогично скалярным переменным, и может быть как явным, так и неявным. При явном объявлении переменной, в случае если ее имя не попадает под действие ни одного оператора Deftype, то при отсутствии суффикса типа данных и конструкции вида As тип_данных, переменная получает тип Variant. В приводимом примере переменные задаются с суффиксом V, для того, чтобы было удобно их отличать от переменных типа ссылка на объект, или переменных, определяемого пользователем типа данных.

Dim myVariantlV As Variant Dim

myVariant2V Public myVariant3V As

Variant myVariant4V = 123.45

При явном объявлении переменных типа Variant, LotusScript инициализирует их специальным значением Empty. При присвоении такой переменной значения LotusScript, в зависимости от контекста, определяет тип данных значения по следующим правилам:

• если тип данных присваиваемого значения известен, то этот тип и сохраняется у значения переменной;• если присваиваемое значение есть литерал, то тип данных значения переменной определяется по типу

данных, соответствующему литералу.

Пример. Демонстрирует правила присвоения типа данных значению переменной Variant.

Dim my varl, my var2 Dim

my long As Long my long

= 123 my varl = my long

Print TypeName (my varl) 'выводит LONG

my_var2 = 123

Print TypeName (my_var2) 'выводит INTEGER

В некоторых случаях тип данных значения переменной типа Variant может изменяться для соответствия типу данных, используемых в определенных операндах операций внутри оператора присваивания.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

71

Page 72: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Демонстрирует, как определяется значение переменной типа Variant. Dim my_varl, my_var2, my_var3

Dim my_int As Integer my_int = 66 my_varl = "1234" Print TypeName (my_varl) Print my_varl

my_var2 = my_varl + my_int Print TypeName (my_var2) Print my_var2

my_var3 = my_varl & my_int Print TypeName (my_var3) Print my_varl

Рассмотрим подробнее использование переменных типа Variant для хранения значений типа булевских и дата/время.

Булевский тип данных

В LotusScript R8 для хранения значений логического (булевского) типа не нужно использовать переменные типа Variant (тип данных Boolean появился в LotusStript R6). Переменная типа данных Boolean может принимать только два

My_Varl = 10 > 100 Print My_Varl Print Typename Print Datatype My_Varl = True Print My_Varl Print CInt (My_Varl) Print My_Varl + " Print My_Varl + 2 My_Var2 = True My_Var3 = 0My_Varl= My_Var2 And My_Var3 Print My_Varl

' Выведет: FalseMy_Var2 = 2 My_Var3 = 0My_Varl= My_Var2 Or My_Var3Print My_Varl ' Выведет: True

(My_Varl) (My Varl)

Выведет: True' Выведет: -1 Green"' Выведет: True Green' Выведет: 1

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

72

Page 73: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

значения TRUE (Истина) и FALSE (Ложь). Значение переменной типа Boolean сохраняется как 16-ти битное число (2 байта). Значение True или False можно также присваивать любому числовому типу данных, поддерживаемому LotusScript, в этом случае значение True конвертируется к значению (-1), a False соответственно к 0. В случае же обратного конвертирования типов данных из какого- либо числового типа данных к типу данных Boolean, то 0 представляет собой значение False, а все другие значения представляют True. Допускается также объявление констант

булевского типа.

Пример. Демонстрирует результаты выполнения операторов присваивания и вывода для булевских значений.Dim My_VarlDim My_Var2 As Boolean, My_Var3 As Boolean

My_Var присваивается False т.к. выражение 10 > 100 - Ложно Выведет: False' Выведет: BOOLEAN ' Выведет: 11

1 выводит

STRING 'выводит

1234

'выводит DOUBLE

'выводит 13 00

1 выводит

STRING 'выводит

1234 66

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

73

Page 74: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Тип данных дата/время

В LotusScript не содержит специального типа данных для объявления переменных, содержащих значения даты/времени, тем не менее, в LotusScript существует целый ряд функций (будут рассмотрены позднее) для ввода и операций со значениями типа даты/времени. Такие значения представляются в LotusScript восьмибитовыми числовыми значениями типа Double. Целая часть таких значений представляет собой собственно дату в интервале от 01.01.0100 г. до 31.12.9999 года, а дробная часть - время, прошедшее от полуночи для дня, определенного в целой части значения.

Для сохранения значений переменных типа дата/время в LotusScript используются переменные типа Variant.

В LotusScript существуют отличия в интерпретации значений типа дата/время, если год представлен только двумя последними символами. LotusScript в этом случае, если год представлен числом меньше 50, считает, что это 21 век, в противном случае - 20 век.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

74

Page 75: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

75

Page 76: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print CInt (my_var2 - my_varl)

my_varl = Datenumber (49, 11, 05) Print

Format (my_varl, "d-mmm-yyyy") my_varl =

Datenumber (50, 06, 12) Print Format

(my_varl, "d-mmm-yyyy") 'выводит

29.12.86 'присваивается текущая дата

'выводит 29.01.2008, если скрипт

'выполнялся 2 9 января 2008 года

'выводит 7701 - число дней, прожитых

'автором на момент выполнения скрипта'выводит 5-Nov-204 9

'выводит 12-Jun-1950

Пример. Демонстрирует операции со значениями типа дата/время Dim

my_varl As Variant, my_var2 As Variant my_varl = Datenumber

(1986, 12, 29) Print my_varl my_var2 = Date Print my var2

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

76

Page 77: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

77

Page 78: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.3 Выражения и операторы выполнения операций

В LotusScript понятие оператор имеет как минимум два значения:

• оператор языка или программы (statement) - с точки зрения синтаксиса, это понятие определяет, как программу разбить на элементарные составляющие - предложения.

Например,

с = Len (а & "ответ необходим" & _

b & "автор: " & d) 'две строки кода - один оператор присваивания

Понятие в данном контексте уже было рассмотрено в настоящей главе;

С точки зрения функциональности - это встроенная конструкция языка LotusScript для выполнения определенных действий над данными.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

78

Page 79: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Например,

Веер

Call My_Sub (1, Abs (а)) For i = 1 to 100 Print i

Next 'три строки кода - один оператор цикла

В этом контексте, понятие будет рассмотрено позднее в настоящей главе;

Оператор выполнения операции (operator) - конструкция, выполняющая определенные действия над своими аргументами, называемыми операндами (operand), и ^возвращающая определенное значение. Можно рассматривать как некий аналог встроенных функций языка.

Например,

+ - * / арифметические операторы

< > > = < = < > = операторы сравнения и

подобия Not Or And Xor логические операторы

Именно операторам выполнения операций и будет посвящен настоящий параграф. Далее везде в этом параграфе (если это не оговорено специально) под термином оператор будет пониматься оператор выполнения операции. Операторы бывают:

• унарными - операция выполняется над одним операндом. Например, логический оператор Not;

• бинарными - операция выполняется над двумя операндами. Например, арифметический оператор сложения

2 + 3.

Выражение есть совокупность операторов и операндов, которая в процессе выполнения приложения вычисляется и принимает одно определенное значение. Выражение может состоять из:

• литералов. Например, числовой литерал 5, или строковый литерал "Это тоже литерал";• констант, переменных, свойств, функций, значения которых на момент вычисления представляют

единичное (а не совокупность) значение. Например, My_int, address$, NotesUIDocument.lsNewDoc, Len(My_str$);

• унарных операторов со своим операндом. Например, Not Nothing;• бинарных операторов со своими операндами. Например, 2 + а - Ь;• выражений, разделенных бинарным оператором. Например, (My_int% >10) And (My_int% <= 12).

В процессе вычисления выражение должно принимать значение либо числовое, либо строковое (включая пустую строку), либо Null, либо Empty, либо Nothing, либо логическое False (0) или True (-1).

Порядок выполнения операторов в выражении определяется порядком их следования и приоритетом. Для изменения порядка выполнения операторов в выражении, нужно использовать круглые скобки. Внутри таких скобок операторы выполняются в первую очередь. При отсутствии скобок в первую очередь выполняются операторы с наивысшим приоритетом, затем операторы с одинаковым приоритетом вычисляются слева направо.

'оператор подачи звукового сигнала

'оператор вызова подпрограммы

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

79

Page 80: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Ниже приводится сводная таблица всех операторов языка LotusScript в порядке их приоритетов, от наибольшего к наименьшему:

В данном параграфе достаточно детально будут рассмотрены все операторы, за исключением Is и IsA, которые будут рассмотрены в параграфе, посвященном классам. Оператор присваивания будет рассмотрен применительно к уже описанным типам данных, его применение в контексте классов и пользовательских типов данных будет рассматриваться в соответствующих параграфах.

Тип оператора Оператор Выполняемые действия

Арифметические возведение в степень.- +

- +• смена знака (унарный минус, унарный плюс).

* И / умножение и деление.

\ целочисленное деление.

Mod вычисление остатка отделения (деление по модулю).

- и + вычитание и сложение.

Конкатенации & конкатенация строк.

Сравнения и подобия < <= =< 1 1 1 сравнение чисел =и<=стр5> Соответственно, равенство, неравенство, неравенство, меньше, меньше или равно, меньше или равно, больше, больше или равно, больше или равно, сравнение с образцом.

Сравнение ссылок на объекты.

Is и IsA сравнение с указанным объектом, ссылка на текущий объект.

(Имеет тот же приоритет, что и у операторов сравнения и подобия)

Логические Not унарное логическое НЕ, или поразрядное дополнение.

And логическое или поразрядное И.

Or логическое или поразрядное ИЛИ.

Xor логическое или поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ.

Eqv логическая или поразрядная ЭКВИВАЛЕНТНОСТЬ.

Imp логическая или поразрядная ИМПЛИКАЦИЯ.

Присваивание присваивание.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

80

Page 81: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример 1. Зависимость порядка выполнения операций от приоритета операций и от использования скобок в выражении. Операция сложения в скобках выполняется в первую очередь, хотя приоритет операции деления выше приоритета операции сложения.

1.3.1 Арифметические операторы

В LotusScript для выполнения арифметических операций имеется семь бинарных и один унарный оператор. Следующая таблица представляет эти операторы:

Print 6 + 4 / 2 ' Выводит

8

Print (6 + 4) / 2 ' Выводит

5

Print (-2) Л 2 ' Выводит

4

Print 5 < 3 ' Выводит

False

Приме р 2. Конкатенация и сравнение строк.

Print "Hello" = "Hell"

& "о" 1 Выводит True

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

81

Page 82: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Опера тор

Выполняемое действие

Синтаксис Пример Примечания

возведение в степень.

Л

степеньPrint 4 Л з основаниеЛ

'выводит 64

Основание и степень должны иметь тип данных Double или Variant, содержащий значение Double. Если основание отрицательное число, то значение степени должно быть целочисленным.

изменение знака - выражениеDim х As Long х = 10

- 12 Print x 'выводит

-2 x = -x Print x

'выводит 2

Выражение должно иметь числовой тип данных, или Variant, содержащий значение числового типа. Если выражение содержит значение Empty, то возвращаемое значение 0.

умножение выражение1 * выражение2 Dim x As Integer x% =

2 * 3 Print x% * 3.4

'выводит 20.4

Выражение1 и выражение2 должны иметь числовой тип данных, или Variant, содержащий значение числового типа. Если выражение1 или выражение2 содержит значение Empty, то возвращаемое значение 0.

I деление выражение1 / выражение2 Print 8 / 5 'выводит

1.6 Print 16.9 / 5.6

'выводит3.01785714285714

Выражение1 и выражение2 должны иметь числовой тип данных, или Variant, содержащий значение числового типа. Если выражение1 содержит значение Empty, то возвращаемое значение 0. Если выражение2 содержит значение 0 или Empty, то генерируется ошибка "деление на ноль".

\ целочисленное деление

выражение1\ выражение2 Print 8 / 5 'выводит

1.6 Print 8 \ 5

'выводит 1 Print 16.9

/ 5.6 'выводит

3.01785714285714

Print 16.9 \ 5.5

Выражение1 и выражение2 должны иметь числовой тип данных, или Variant, содержащий значение числового типа. Если выражение1 содержит значение Empty, то возвращаемое значение 0. Если выражение2 содержит значение 0 или Empty, то генерируется ошибка "деление на ноль".

Mod вычисление остатка от деления (деление по модулю).

выражение1 Modвыражение2 Print 17 Mod 3

'выводит 2

Выражение1 и выражение2 должны иметь числовой тип данных, или Variant, содержащий значение числового типа. Если выражение1 содержит значение Empty, то возвращаемое значение 0. Если выражение2 содержит значение 0 или Empty, то генерируется ошибка "деление на ноль". Перед выполнением операции операнды округляются до целочисленного значения (Long, Integer).

+ сложение выражение1 + выражение2 Dim a As Variant Dim

b As Integer a = "8"

b% = 7 Print 8 +7

Print a + 7 Print 8 +

b% Print a + b%

Детально рассматривается в следующей таблице

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

82

Page 83: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Если при выполнении любого арифметического оператора один из его операндов имеет значение Null, то и результат выполнения операции будет иметь значение Null.

В процессе выполнения арифметических операторов, в случае необходимости, происходит попытка автоматического преобразования типов данных операндов (включая преобразование от строковых типов к числовым и наоборот).

При выполнении оператора присваивания, в случае, когда результат выполнения арифметического оператора выходит за границу допустимых значений для типа данных переменной, находящейся в левой части оператора присваивания, LotusScript пытается сначала автоматически преобразовать полученный результат, и если это невозможно, то генерируется сообщение об ошибке.

LotusScript интерпретирует оператор "+" как оператор сложения чисел или, как оператор конкатенации (сцепления) символьных строк, в зависимости от типа используемых операндов.

Следующая таблица иллюстрирует правила использования оператора "+" в зависимости от контекста:

'выводит 15

Print "Hello " + "there"

'выводит "Hello there"

Print a + "7" 'выводит

"87"

вычитание выражение1 - выражение2 Print 5 - 3 . 4 'выводит

1 . 6

Выражение1 и выражение2 должны иметь числовой тип данных, или Variant, содержащий значение числового типа. Если выражение1 или выражение2 содержит значение Empty, то возвращаемое значение 0.

Выражение1 Выражение2 Выполняемое действие

числовой тип числовой тип сложение

числовой тип строковый тип генерируется ошибка "смешение типов данных"

числовой тип тип Variant (значение отлично от Null)

сложение

строковый тип тип Variant (значение отлично от Null)

конкатенация строк

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

83

Page 84: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Хорошим стилем программирования считается использование знака "+" для операций сложения и знака "&" для операций конкатенации строк.

1.3.2 Операторы сравнения

Операторы сравнения выполняют операцию сравнения двух выражений. Общий синтаксис этого оператора следующий:

выражение1 оператор сравнения выражение2

строковый тип строковый тип конкатенация строк

любой допустимый тип данных

тип Variant (значение Empty)

возвращаемое значение совпадает со значением выражения1

любой допустимый тип данных

тип Variant (значение Null)

возвращаемое значение Null

тип данных Variant, содержащий числовой тип данных

тип данных Variant, содержащий числовой тип данных

сложение

тип данных Variant, содержащий числовой тип данных

тип данных Variant, содержащий строковый тип данных

сложение (в случае возможности преобразования выражения2 к числовому типу данных), сообщение об ошибке смешения типов в противном случае

тип данных Variant, содержащий строковый тип данных

тип данных Variant, содержащий строковый тип данных

конкатенация строк

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

84

Page 85: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.3.2.1 Преобразования данных при выполнении операций сравнения

Как можно было уже увидеть из предыдущей таблицы, LotusScript при необходимости пытается выполнить автоматическое преобразование типов данных операндов к совместимому типу перед выполнением операций сравнения.

Данные преобразования типов подчиняются следующим правилам:

Тип выражения 1 Тип выражения2 Выполняемые действия

числовой числовой сравнение чисел

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

сравнение чисел

числовой Variant, содержащий данные типа String, которые нельзя преобразовать к числу

генерируется ошибка несоответствия типов данных

числовой Variant, содержащий значение Empty сравнение чисел (сравнивается значение выражения1 с нулем)

строковое строковое сравнение строк

строковое Variant, содержащий значение отличное от Null

сравнение строк

строковое Variant, содержащий значение Empty сравнение строк

Variant, содержащий данные типа String

Variant, содержащий данные типа String сравнение строк

Variant, содержащий значение Empty

Variant, содержащий данные типа String сравнение строк (сравнивается значение выражения2 с пустой строкой)

Variant, содержащий данные числового типа

Variant, содержащий данные числового типа

сравнение чисел

Variant, содержащий значение Empty

Variant, содержащий данные числового типа

сравнение чисел (сравнивается значение выражения2 с нулем)

Variant, содержащий данные числового типа

Variant, содержащий данные типа String сравнение чисел. Числовое выражение всегда меньше чем строковое выражение.

Variant, содержащий значение Empty

Variant, содержащий значение Empty выражение1 и выражение2эквивалентны

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

85

Page 86: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• если один операнд имеет тип Variant, содержащий значение Empty, а второй имеет числовое значение, то выполняется сравнение второго операнда с нулем. Под это правило попадает и случай, когда второй операнд имеет тип Variant, содержащий данные числового типа;

• если операнды содержат числовые значения разных типов данных, то происходит преобразование типов данных от младших к старшим, в соответствии с последовательностью приоритетов Integer, Long, Single, Double, Currency. В этом случае, при преобразовании типов данных от Single или Double к Currency может возникнуть ситуация переполнения или потери порядка;

• если один операнд содержит данные типа Single, а второй Double, то дробная часть значения типа Double округляется до типа Single;

• строковые значения, которые можно преобразовать к числовым значениям, будут к ним преобразовываться в случае необходимости;

• при сравнении значений дата/время для получения эквивалентности должны быть эквиваленты обе составляющие, соответственно даты и времени. В противном случае, значения не эквиваленты. В первую очередь сравниваются значения даты, и если они эквивалентны, то выполняется сравнения для составляющих времени.

1.3.2.2 Сравнение строк

Метод сравнения строк определяется оператором языка Option Compare. Рассмотрим подробнее его синтаксис:

Option Compare опция1 [, опция2]

где, опция1 и опция2 могут принимать следующие значения:

• Binary - указывается для побитовой (поразрядной) операции сравнения. При выборе данногозначения в качестве опции1, нельзя указывать опцию2;

• Case и NoCase - сравнение идет, соответственно, в режиме "чувствительном" к регистру (данныйрежим используется по умолчанию) или безразличном к регистру. Не допускается совместное использование обеих опций. Разрешается указывать вместо опции NoCase - ее синоним Text;

• Pitch и NoPitch - сравнение идет, соответственно, в режиме "чувствительном" к системесортировки символов языка (данный режим используется по умолчанию) или безразличном к сортировке. Имеет смысл только для двухбайтовых кодировок восточных языков (таких как японский, корейский, упрощенный и классический китайский). Не допускается совместное использование обеих опций.

Опции Case, NoCase, Pitch, NoPitch определяют методы сравнения строк, базирующиеся на системе сортировки символов, применяемой в используемом программном обеспечении фирмы Lotus.

Опция Binary определяет метод сравнения строк, базирующийся на системе сортировки символов, применяемой в используемой операционной системе. При этом "чувствительность" к порядку сортировки и регистру определяется самой операционной системой.

Допускается неоднократное применение оператора языка Option Compare в рамках одного модуля (при условии отсутствия конфликта опций). Данный оператор языка можно размещать в любом месте, среди других операторов скрипта, в рамках модуля. По умолчанию используется метод сравнения строк, задаваемый оператором языка Option Compare Case, Pitch

В определенных встроенных функциях (например, InStr и StrCompare) "чувствительность" к порядку сортировки и регистру определяется либо по умолчанию оператором языка Option Compare, либо соответствующими аргументами функций.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

86

Page 87: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример 1. Демонстрирует использование опции Case оператора Option Compare.

Option Compare Case

Print "A" > "а" 'выводит True

Пример 2. Демонстрирует использование опции NoCase оператора Option Compare.

Option Compare NoCase

Print "A" > "а" 'выводит False

Пример 3. Демонстрирует использование опции Binary оператора Option Compare. Option

Compare Binary

Print "A" > "а" 'выводит False

Сравнение строк производится посимвольно, начиная с первого символа каждой строки. При выполнении операции определяется положение сравниваемых символов в таблице сортировки символов (зависящей от оператора Option Compare и используемого национального языка). Если символ первой строки стоит "раньше" в таблице сортировки, чем соответствующий символ другой строки, то эта строка считается "меньшей". При совпадении соответствующих значений символов LotusScript переходит к сравнению следующей пары символов. Если обе строки имеют одинаковую длину, то строки считаются равными при совпадении всех символов. Иначе, более длинная строка считается большей.

Пример. Сравнение строк.

Print "hello" < "hellp" ' Выводит True

Dim myVar As Variant, myStr As Variant myStr =

"34" myVar = 34

Print myVar < myStr ' Выводит True

Print 45 > myStr ' Выводит True

Print "45" > myVar ' Выводит True

1.3.3 Оператор Like - "оператор подобия"

Выполняет сравнение строкового выражения со строкой-образцом, и имеет следующий синтаксис:

строковое выражение Like строкао_бразец,

Оператор возвращает значение True, если строковое выражение соответствует строке_образцу, False - в случае несоответствия, и Null - если один из операндов имеет значение Null.

Операнд строка образец представляет собой строковое выражение, которое может содержать ряд символов обобщения из следующей таблицы:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

87

Page 88: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

При использовании в строкеобразце конструкции [список значений] или [!список значений], должны соблюдаться следующие правила:

• весь список должен быть заключен в квадратные скобки;

• элементы списка не должны отделяться друг от друга никакими символами разделителями (за исключением случая, когда данные символы-разделители сами участвуют в операции сравнения). Например, список [1, 2, 3, 4] представляет список значений из символов "1", "," (символ запятая), "" (символ пробел), "2", "3", "4". Получившийся список соответствует списку [1, 234];

• повторяющиеся элементы списка исключаются из него (см. пример к предыдущему пункту);

• каждый элемент из списка может представлять собой единичный символ, или диапазон значений в формате символ - символ. При задании диапазона значений необходимо указывать границы диапазонов в порядке от младшего к старшему, в соответствии с установленным в системе порядком сортировки символов. Т.е. для задания диапазона значений от символа "А" до символа "Z", необходимо указать список [A-Z], а не [Z-A];

• порядок сортировки символов задается оператором языка Option Compare. Если установлен побитовый (поразрядный) метод сравнения (Option Compare Binary), то результат выполнения оператора Like не зависит от платформы и продукта, использующего LotusScript. Для остальных методов сравнения (Option Compare Case NoCase, Pitch, NoPitch), результат выполнения оператора Like может зависеть от платформы и продукта (за исключением использования в списке международных символов ANSI);

• одиночные символы "-" (дефис), "?" (знак вопроса), "*" (символ звездочки), "#" (символ решетки), "[" (открывающая квадратная скобка) - разрешается включать в список значений со следующими ограничениями. Символ дефис должен быть первым элементом списка для конструкции [список значений], или вторым для конструкции [!список значений]. Остальные символы из этого пункта могут встречаться везде в пределах списка. Например, [!-5-8[а-д*С];

• одиночные символы "," (запятая), "]" (закрывающая квадратная скобка), "!" (восклицательный знак) не разрешается включать в список значений.

Замечание: по умолчанию при сравнении учитывается регистр клавиатуры, поэтому при необходимости отмены этого режима используется соответствующая опция оператора Option Compare.

Символ Использование

? Соответствует любому одному символу.

# Соответствует любому одному символу цифры от 0 до 9.

Соответствует любой строке (любому количеству символов, включая пустую строку).

[список значений] Соответствует любому одному символу из списка значений.

[!список значений] Соответствует любому одному символу, не входящему в список значений.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

88

Page 89: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример 1. Вывод чисел от 1 до 100, содержащих цифру 5. For х = 1 То 100

If CStr (х) Like " *5*" Then Print х

Next х 'Вывод:

'5 15 25 35 45 50 51 52 53 54 55 56 57 58 59 65 75 85 95

1.3.4 Оператор конкатенации

Оператор конкатенации (сцепления) строк использует следующий синтаксис:

выражение1 & выражение!_________________,

* Variant, содержащий значение Empty. В этом случае LotusScript конвертирует такое выражение в строку нулевой длины для конкатенации ее со значением другого выражения.

выводит String

Print TypeName (x & y)

выводит 123

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

89

Page 90: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.3.5 Логические операторы

Логические операторы предназначены для выполнения булевских операций над данными. Наиболее часто эти операторы встречаются в условных операторах и операторах цикла языка LotusScript. Однако возможно их применение и в других допустимых контекстах.

В LotusScript включены пять бинарных и один унарный логических операторов. Рассмотрим более подробно их синтаксис:

1.3.5.1 Оператор Not - "логическое отрицание"

Имеет синтаксис:

Not выражение

Выполняет операцию логического отрицания по отношению к выражению. Выражение должно иметь значение, которое

можно преобразовать к типу Long.

Операция выполняется по шагам следующим образом:

• производится попытка преобразование выражения к типу Long;• значение, полученное на предыдущем шаге, округляется до ближайшего целого;• значение, полученное на предыдущем шаге, меняет знак• из значения, полученного на предыдущем шаге, вычитается единица.

Применение указанных шагов (кроме первого) равносильно замене значения каждого бита выражения на обратный.

Ниже представлены две таблицы. Первая из них определяет результат операции в зависимости от ее аргумента, вторая - бит результирующего выражения относительно бита исходного выражения.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

90

Page 91: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Тип данных результирующего выражения зависит от типов данных операндов, и принимает значение Variant DataType 8 (String), если оба операнда имеют тип Variant. В противном случае тип данных результата - String.

Допускается также для выполнения операции конкатенации использовать оператор "+". Однако, желательно этого не делать, так же как и не конкатенировать строки с числами (всегда можно явно преобразовать число к строке с помощью встроенных функций).

Пример. Демонстрирует применение оператора конкатенации. Dim х As Variant, у As Variant

Dim strl As String, str2 As String * 5, str3$ strl = "123" str2 = "99"

str3 = strl & str2 ' выводит 12399Print str3

x = strl

Print TypeName (x & "234")

выводит String (Variant DataType 8)

Print strl & у

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

91

Page 92: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Выражение Результат

True False

False True

Null Null

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

92

Page 93: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

N-ый бит выражения

N-ый бит результата

1 0

0 1

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

93

Page 94: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Демонстрирует применение оператора Not.

Print Not True ' Выводит False

Print Not 12.57 ' Выводит -14

Print Not -17.36 ' Выводит 16

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

94

Page 95: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.3.5.2 Оператор And -"конъюнкция"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

95

Page 96: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

96

Page 97: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Имеет синтаксис:

выражение1 And выражение2

Выполняет операцию логической конъюнкции по отношению к своим операндам.

Выражение1 и выражение2 должны иметь значение, которые можно преобразовать к типу Long.

Операция выполняется по шагам следующим образом:

• производится попытка преобразование выражения1 и выражения2 к типу Long;• значения, полученные на предыдущем шаге, округляются до ближайшего целого;• к значениям, полученным на предыдущем шаге, применяется операция конъюнкции.

Применение указанных шагов (кроме первого) равносильно побитовой операции конъюнкции к операндам And.

Ниже представлены две таблицы. Первая из них определяет результат операции в зависимости от ее аргументов, вторая - бит результирующего выражения относительно битов исходных выражения1 и выражения2.

N-ый бит N-ый бит N-ый бит

выражения1 выражения2 результата

1 1 1

1 0 0

0 1 0

0 0 0

Выражение1 Выражение2 Результат

True True True

True False False

True Null Null

False True False

False False False

False Null False

Null True Null

Null False False

Null Null Null

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

97

Page 98: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Демонстрирует применение оператора And.

Print True And True ' Выводит True

Print Null And False ' Выводит False

Print 12.3 And -7.8 ' Выводит 8 %RemT.k 12.3 преобразуется к 12,а это 00...01100, A -7.8 преобразуется к -8, а это11...11000 , результат 00 01000 , в десятичной системе это 8

%End Rem

Print 3. 45 And 12. 9 ' Выводит 1

Print Bin$ (&Ы110000 And &Ы001100) ' Выводит 11000000

1.3.5.3 Оператор Or -"дизъюнкция"

Имеет синтаксис:

выражение1 Or выражение2

Выполняет операцию логической дизъюнкции по отношению к своим операндам.

Выражение1 и выражение2 должны иметь значение, которые можно преобразовать к типу Long.

Операция выполняется по шагам следующим образом:

• производится попытка преобразование выражения1 и выражения2 к типу Long;• значения, полученные на предыдущем шаге, округляются до ближайшего целого;• к значениям, полученным на предыдущем шаге, применяется операция дизъюнкции.

Применение указанных шагов (кроме первого) равносильно побитовой операции дизъюнкции к операндам Or.

Ниже представлены две таблицы. Первая из них определяет результат операции в зависимости от ее аргументов, вторая - бит результирующего выражения относительно битов исходных выражения1 и выражения2.

N-ый бит N-ый бит N-ый бит

выражения1 выражения2 результата

1 1 1

1 0 1

0 1 1

0 0 0

Выражение1 Выражение2 Результат

True True True

True False True

True Null True

False True True

False False False

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

98

Page 99: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Демонстрирует применение оператора Or.

результат 00 01100 , в десятичной системе это 12%End Rem

Print 3.45 or "1 2. 9" ' Выводит 15

Print Bin$ (&Ы1110000 Or &Ы1001100) 1 Выводит 11111100

1.3.5.4 Оператор Хог -"исключающее ИЛИ"

Имеет синтаксис: выражение1 Хог выражение2

Выполняет операцию логического исключающего ИЛИ по отношению к своим операндам.

Выражение1 и выражение2 должны иметь значение, которые можно преобразовать к типу Long.

Операция выполняется по шагам следующим образом:• производится попытка преобразование выражения1 и выражения! к типу Long;• значения, полученные на предыдущем шаге, округляются до ближайшего целого;• к значениям, полученным на предыдущем шаге, применяется операция логического исключающего ИЛИ.

Применение указанных шагов (кроме первого) равносильно побитовой операции логического исключающего ИЛИ к операндам Хог.

Ниже представлены две таблицы. Первая из них определяет результат операции в зависимости от ее аргументов, вторая - бит результирующего выражения относительно битов исходных выражения1 и выражения2.

False Null Null

Null True True

Null False Null

Null Null Null

Print True Or True 1 Выводит TruePrint Null Or False 1 Выводит Null

Print 12.3 Or 7.8 ' Выводит 12%Rem

Т.к. 12.3 преобразуется к 12, а это 00...01100 ,a 7.8 преобразуется к 8 , а это 00...01000 ,

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

99

Page 100: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример.

Демонстрирует применение оператора Хог.

Print True Хог True 1 Выводит False

Print Null Xor False ' Выводит Null

Print 12.3 Xor

7.8 ' Выводит 4

%RemТ.к. 12.3 преобразуется к 12, а это00... 01100 ,a 7.8 преобразуется к 8 , а это00...01000 , результат 00 00100 , в десятичной системе это 4

%End Rem

Print 3.45 Xor 12.9 1 Выводит 14

Print Bin$ (&Ы1110000 Xor &Ы1001100) 1 Выводит 00111100

1.3.5.5 Оператор Eqv "логическая эквивалентность"

Имеет синтаксис:

выражение1 Eqv выражение2

Выполняет операцию логической эквивалентности по отношению к своим операндам. Выражение1 и

выражение! должны иметь значение, которые можно преобразовать к типу Long.

Операция выполняется по шагам следующим образом:• производится попытка преобразование выражения1 и выражения2 к типу Long;• значения, полученные на предыдущем шаге, округляются до ближайшего целого;• к значениям, полученным на предыдущем шаге, применяется операция логической эквивалентности.

Применение указанных шагов (кроме первого) равносильно побитовой операции логической эквивалентности к операндам Eqv.

N-ый бит N-ый бит N-ый бит

выражения1 выражения2 результата

1 1 0

1 0 1

0 1 1

0 0 0

Выражение1 Выражение2 Результат

True True False

True False True

True Null Null

False True True

False False False

False Null Null

Null True Null

Null False Null

Null Null Null

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

100

Page 101: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Ниже представлены две таблицы. Первая из них определяет результат операции в зависимости от ее аргументов, вторая - бит результирующего выражения относительно битов исходных выражения1 и выражения!

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

101

Page 102: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

102

Page 103: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Выражение1 Выражение2 Результат

True True True

True False False

True Null Null

False True False

False False True

False Null Null

Null True Null

Null False Null

Null Null Null

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

103

Page 104: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

N-ый бит N-ый бит N-ый бит

выражения1 выражения2 результата

1 1 1

1 0 0

0 1 0

0 0 1

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

104

Page 105: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Демонстрирует применение оператора Eqv.

Print True Eqv True ' Выводит True

Print Null Eqv False 1 Выводит Null

Print 12.3 Eqv -7.2 ' Выводит 10 %RemТ.к. 12.3 преобразуется к12, а это 00...01100 ,a -7.2 преобразуется к -7, а это11...11001 , результат 00 01010 , в десятичной системе это 10

%End RemPrint 3.45 Eqv 12.9 ' Выводит -15

1.3.5.6 Оператор imp "импликация"

Имеет синтаксис:

выражение1 Imp выражение2

Выполняет операцию импликации по отношению к своим операндам.

Выражение1 и выражение! должны иметь значение, которые можно преобразовать к типу Long.

Операция выполняется по шагам следующим образом:

• производится попытка преобразование выражения1 и выражения! к типу Long;• значения, полученные на предыдущем шаге, округляются до ближайшего целого;• к значениям, полученным на предыдущем шаге, применяется операция импликации.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

105

Page 106: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Применение указанных шагов (кроме первого) равносильно побитовой операции импликации к операндам Imp.

Ниже представлены две таблицы. Первая из них определяет результат операции в зависимости от ее аргументов, вторая - бит результирующего выражения относительно битов исходных выражения1 и выражения2.

%End Rem

Print 3.45 Imp 12.9 ' Выводит -3

1.3.6 Оператор присваивания

Оператор присваивания имеет следующий синтаксис:

[ Let] идентификатор_переменной = выражение

Выполняет присвоение переменной, заданной своим идентификатором_переменной, значения выражения. Let - необязательное ключевое слово.

N-ый бит N-ый бит N-ый бит

выражения1 выражения2 результата

1 1 1

1 0 0

0 1 1

0 0 1

Выражение1 Выражение2 Результат

True True True

True False False

True Null Null

False True True

False False True

False Null True

Null True True

Null False Null

Null Null Null

Пример. Демонстрирует применение оператора Imp. Print True Imp True ' Выводит True

Print Null Imp False ' Выводит Null

Print -7.8 Imp 12.3 ' Выводит -2

%Rem

Т.к. -7.8 преобразуется к -8, а это 11...11000 , a 12.3 преобразуется к 12, а это 00...01100

результат 00 01111 , в десятичной системе это 15

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

106

Page 107: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В качестве идентификатора_переменной может использоваться.

• имя скалярной переменной любого допустимого в LotusScript типа, в том числе типа Variant, содержащего значения типа массив или список, но не допускается указывать непосредственно имя массива или списка;

• имя массива (индекс) - элемент массива. Имя массива может также иметь тип Variant, содержащий значения типа массив;

• имя списка (имя тега) - элемент списка. Имя списка может также иметь типа Variant, содержащий значения типа список.

• пользовательский_тип_данных.член_типа для элемента определенного пользователем типа данных, или класс.членкласса для элемента объекта или класса, или Ме.член класса для элемента класса внутри процедуры класса. Применение оператора присваивания в данных контекстах будет рассмотрено позднее в соответствующих параграфах.

Выражение может принимать любое значение, кроме ссылок на объекты и классы. Тип данных выражения должен или соответствовать типу переменной, или LotusScript будет пытаться привести его к этому типу.

Пример. Демонстрирует применение оператора присваивания (ключевое слово Let может быть опущено)

Dim a As Integer, b As Integer, с As Integer Dim devArray (3) Dim devList

List Let a% = 2 Let b% = a% Print b% Let c% = b% + 1 Print c%

Let devArray (1) = b% Print devArray (1) Let devList ("one") = c%Print devList ("one")

'Выводит: 2

'Выводит: 3 1

Выводит: 2

1Выводит: 3

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

107

Page 108: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.4 Операторы языка

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

1.4.1 Условные блочные операторы

Данная группа операторов называется блочной, т.к. содержит внутри себя другие законченные, с точки зрения синтаксиса, операторы языка.

1.4.1.1 Оператор lf_____'Then...Else - "однострочный If

Имеет следующий синтаксис:

If условие Then группа_операторов1 /Else группа_ операторов2] _____________________________________

Выполняет либо группу_операторов1, либо группу_операторов2, в зависимости от значения условия. Если условие принимает значение True, то выполняется группа_операторов1, в противном случае - группа_операторов2.

Весь оператор по синтаксису должен занимать одну строку. Допускается переносить часть оператора на другие строки, используя при этом стандартный символ продолжения оператора ("_" - подчеркивание). Операторы внутри группы _операторов1 и группы_операторов2 отделяются друг от друга стандартным символом разделителя операторов, расположенных на одной строке, (":" - двоеточие).

В случае, когда какая-либо из групп операторов содержит в себе много составляющих ее операторов языка, то рекомендуется вместо "однострочного If использовать "многострочный If (будет рассмотрен в следующем параграфе).

Пример. Демонстрирует применение однострочного оператора If.

If 2 > 3 Then _

а = 2 : Print а _ Else

а = 3 : Print а выводит 3

If а > 1 Then а = а - 1

Print а 'выводит 2

CurRu = "RUB"

CurUs = "USD"

If CurRu > CurUs Then _

Print "Власть сменилась"ElsePrint "Все по прежнему" 'Выводит "Все по прежнему"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

108

Page 109: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.4 .1 .2 Оператор I f . . .Then. . .E lse l f - "многострочный I f '

Имеет следующий синтаксис: If

условие1 Thenгруппа_операторов 1 [ Elself условие2 Thenгруппа_операторов2 ] [ Elself условиеЗ Thenгруппа_операторовЗ ]

[Elseгруппа_операторовЫ\

End If

Выполняет только ту группу_onepamopoвJ, для которой условие^ принимает значение True, или группу_операторовЫ, если значения всех условийJ является False. Если ни одно из условийJ не является True и конструкция E lse отсутствует, то не выполняется ни одна из гpynn_onepamopoвJ. Проверка условийJ осуществляется сверху вниз, и при нахождении первого истинного условийL выполняется групп_операторов^, и затем управление передается первому, следующему за конструкцией End I f , оператору.

Оператор If...Then...Elself, не имеет соответствующего ему оператора выхода, такого как Exit Do, Exit For - "Exit If не существует. Это означает, что если оператор If...Then...Elself не содержится внутри другого оператора типа Do или For, то любая из гpynn_onepamopoвL может быть пропущена только с помощью операторов Exit (Sub, Function, Property), End или операторов передачи управления на метку (операторы GoTo, GoSub, метки).

Пример. Демонстрирует применение многострочного оператора If. Dim a As Integer, Ь As Integer, с As Integer a = 4 b = 8If a > b Thenс = b + a Elseс = b - a

End IfPrint с ' выводит 4If с = a Then с = с + 3 If с = 1 Thend = "один"

Elself с = 2 Thend = "два" Elself

с = 3 Thend = "три" Elsed = "много" End

IfPrint d 'выводит "много"

1.4.1.3 Оператор Se lec t Case - "блок переключателей"

Имеет следующий синтаксис:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

109

Page 110: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Select Case проверяемое_выражение [ Case

список_значений1

[группа_операторов1 ] ] [Case

список_значений2

[ группа_операторов2] ]

[ Case Else

[ zpynna onepamopoeN ] ]

End Select

Выполняет только ту группу операторовJ, для которой значение проверяемого_выражения лежит в списке_значенийи, или группу_операторовЫ, если значение проверяемого_выражения не входит ни в один список_значенийи. В последнем случае при отсутствии конструкции Case Else, не выполняется ни одна из групп_операторовч). Проверка вхождения значения проверяемого_выражения в список_значенийи осуществляется сверху вниз, и при нахождении первого вхождения выполняется соответствующая rpynna_onepaTopoBJ, и затем управление передается первому, следующему за конструкцией End Select, оператору.

Список_значени(М может представлять собой:

• просто список значений, разделенных символом запятая. Например, "1", "2";• диапазон значений - конструкция значение1 То значение2. Например, 2 То 100;• условие - конструкция Is оператор сравнения значение. Например, Is >=100.

Пример. Демонстрирует применение оператора Select Case,

Dim a As Integer

a = 45

Select Case a Case 1, 2

Print "мало"

Case 3 To 10

Print "много"

Case Is < 100

Print "очень много" 'выводит очень много

Case Else

Print "столько не бывает"

End Select

1.4 .2 Операторы передачи управления по метке 1 .4 .2 .1 GoTo - "оператор безусловного перехода"

Оператор имеет следующий синтаксис: GoTo метка При выполнении данного оператора, LotusScript передает управление оператору, имеющему соответствующую

метку. Передача управления может осуществляться только внутри одной процедуры, и не может выходить за ее границы. Реальная схема переходов генерируется в момент выполнения скрипта.

Пример. С помощью оператора GoTo организуется цикл, вычисляющий сумму целых чисел от 1 до

100.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

110

Page 111: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Dim i As Long, sum As Long i

= 1 mult = 1 IncI: i = i + 1

If i > 10 Then

Print "Произведение чисел от 1 до 10 =" & Str( mult )

'выводит "Произведение чисел от 1 до 10 = 3628800" Else

mult = mult + i

GoTo IncI End If

1.4 .2 .2 l f . . .GoTo. . .E lse - "оператор условного перехода"

Имеет следующий синтаксис:

If условие GoTo метка [ Else группа_операторов ] ___________________________________________________

Выполняет либо передачу управления на оператор с меткой, либо группу операторов, в зависимости от значения условия. Если условие принимает значение True, то выполняется передача управления, в противном случае - группа операторов.

Данный оператор используется как сокращенная форма однострочного If, в котором конструкция Then группа_операторов1 заменена на GoTo метка. Синтаксис однострочного If при этом сохраняется, т.е. весь оператор должен занимать одну строку. Допускается переносить часть оператора на другие строки, используя при этом стандартный символ продолжения оператора ("_" - подчеркивание). Операторы внутри группы_операторов отделяются друг от друга стандартным символом разделителя операторов, расположенных на одной строке, (":" - двоеточие).

Пример. Модифицированный пример из предыдущего параграфа. С помощью оператора If... GoTo ... Else организуется цикл, вычисляющий сумму целых чисел от 1 до 100.

Dim i As Long, mult As Long

i = 1

mult= 1

IncI: i = i + 1

mult = mult * i

If i < 10 GoTo IncI Else Print "Произведение чисел от 1 до 10 = " s Str(mult) 'выводит

"Произведение чисел от 1 до 10 = 3628800"

1.4 .2 .3 On. . .GoTo - "оператор перехода по метке из набора"

Имеет следующий синтаксис:

On выражение GoTo метка1, [ метка2 [ ................................. меткаЛ/ ] . . . ]

Выполняет передачу управления на оператор с меткой из набора метка1 ... меткаЫ в зависимости от значения выражения. Если выражение принимает значение 1, то управление передается на оператор с меткой 1, если выражение равно 2, соответственно с меткой2, и т.д.

Передача управления может осуществляться только внутри одной процедуры, и не может выходить за ее границы. Реальная схема переходов генерируется в момент выполнения скрипта.

Пример. Демонстрирует применение оператора On...GoTo Dim i As

Integer GoToInI

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

111

Page 112: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Labell: Msgbox "Введена единица" : End

Label2: Msgbox "Введена двойка" : End

Label3: Msgbox "Введена тройка" : End

InI: i = Cint( InputBox$( "Введите целое число" ))

On i GoTo Label1, Label2, Label3 Msgbox "Введено число меньше единицы или больше тройки"

1.4 .2 .4 GoSub и On . . . GoSub - "операторы перехода в BASIC-процедуру"

Имеют следующий синтаксис:

GoSub меткаOn выражение GoSub метка1, [ метка2 [ ....................... метка N/1...1

GoSub выполняет передачу управления на оператор с меткой, a On ... GoSub выполняет передачу управления на оператор с меткой из набора метка1 ... меткаЫ в зависимости от значения выражения. Если выражение принимает значение 1, то управление передается на оператор с меткой 1, если выражение равно 2, соответственно с меткой2, и т.д.

После выполнения оператора с выбранной или фиксированной меткой начинают выполняться следующие за ним операторы до тех пор, пока не встретился один из перечисленных ниже операторов (или конструкций):

• Return - в этом случае управление передается на следующий за GoSub оператор;• End - заканчивается выполнение всего скрипта;• End Function, End Sub, End Property, Exit Function, Exit Sub или Exit Property - заканчивается выполнение входящих

в скрипт соответственно функции, подпрограммы или свойства.

Передача управления может осуществляться только внутри одной процедуры, и не может выходить за ее границы. Реальная схема переходов генерируется в момент выполнения скрипта.

Группа операторов от метки до оператора Return в BASIC-подобных языках воспринимается как процедура. Она отличается от процедур, к которым привыкли программисты в других языках тем, что в такую процедуру нельзя передать и возвратить параметры иначе как через общие (одноименные) переменные.

Пример. Демонстрирует применение оператора On ... GoSub.

Dim i As Integer

i = Cint( InputBox$( "Введите целое число" )) If (i

>= 1 And i <=3) Then

On i GoSub Label1, Label2, Label3 End

Else

Msgbox "Введено число меньше единицы или больше тройки" End End

If

Labell: Msgbox "Введена единица" : Return

Label2: Msgbox "Введена двойка" : Return Label3:

Msgbox "Введена тройка" : Return

1.4 .2 .5 Return - "оператор возврата управления из BASIC-процедур"

Имеют следующий синтаксис:

Return

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

112

Page 113: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Осуществляет возврат управления из BASIC-процедур. Управление передается на следующий за GoSub или On ... GoSub оператор. Оператор не осуществляет возврата из обычных, а не BASIC-процедур. В данном случае в момент вычисления генерируется ошибка "Return without GoSub".

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

113

Page 114: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.4 .3 Операторы организации циклов 1 .4 .3 .1 Цикл For

Имеет следующий синтаксис:

For счетчик_цикла = начальное_значение То конечное_значение [ Step шаг ]

[ группа_операторов ]

Next [ счетчик_цикла1 [, счетчик_цикла2 ]... ]

Обеспечивает организацию цикла по счетчику. Переменная счетчик_цикла используется для подсчета числа повторений выполнения группы операторов, и должна иметь числовой тип данных. Начальноезначение и конечноезначение представляют соответственно начальное и конечное значение счетчикацикпа. Необязательная конструкция Step шаг - определяет величину изменения счетчикацикла после выполнения каждой операции. По умолчанию величина шага - единица. Допускается организация циклов с отрицательным значением шага. После выхода из цикла значение счетчика_цикла не теряется, и имеет значение, присвоенное ему при выполнении последней итерации.

При первой передаче управления на заголовок цикла:

• если значение шага положительно, и конечное значение меньше начального значения, то группа_операторов не

выполняется ни разу, и управление передается оператору следующему за Nex t ;

• аналогичное происходит в случае, когда значение шага отрицательно, и конечноезначение больше

начального_значения\

• если первые два условия не выполняются, то счетчику_цикла присваивается начальное значение и

выполняется группа операторов.

каждого выполнения группы_операторов, значение счетчика_цикла увеличивается (или в случае отрицательного шага) на величину шага. Затем выполняется сравнение значения счетчика_цикпа с конечным_значением, и если значение счетчика_цикла меньше в случае отрицательного шага) конечного_значения, то управление передается оператору, следующему за Next. В противном случае опять выполняется группа операторов.

Для принудительного досрочного выхода из цикла For... Next можно использовать операторы Exit For или GoTo.

Для удобства чтения скрипта допускается в конструкции Nex t указывать счетчикцикла. Длявложенных циклов For . . . Nex t разрешается в случае, если ограничители цикла ( Nex t ) следуют подряд,указывать только одну конструкцию Nex t и затем, через запятую, перечислить счетчики_цикпов в порядке от самого внутреннего к самому внешнему.

Допускается в теле цикла менять счетчик_цикпа.

При использовании в теле цикла блочных операторов (многострочный If, циклы и т.д.), эти операторы должны быть завершены в пределах тела цикла, и не могут выходить за его ограничитель ( Nex t ) .

После уменьшается измененного больше (или

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

114

Page 115: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В LotusScript нет специальной области видимости типа цикл, поэтому переменные, объявленные (явно или неявно) в цикле, имеют ту же область видимости, что и контекст, в котором появился этот цикл.

Пример. Демонстрирует применение циклов For... Next.

Dim i As Integer, j As Integer, sum As Integer

Dim flag As Variant

Dim fact( 2 To 10) As Long

sum = 0

For i = 0 To 100

sum = sum + i Next

Print "Сумма чисел от 1 до 100 = " & Str ( sum ) 'выводит Сумма чисел от 1 до 100 = 5050 Print

"Простые числа от 99 до 4 9" For i = 99 То 4 9 Step -2 flag = True

For j = 3 To (i - 1) Step 2 If

i Mod j = 0 Then flag = False

j = i 'используется для выхода из внутреннего цикла.

'можно было бы использовать GoTo или Exit For

End If

Next j If flag then Print i ;

'выводит 97 89 83 79 73 71 67 61 59 53 Next i

Print "Вычисляет факториалы от 2 до 10"

For i = 2 То 10

fact( i ) = 1

For j = 2 To i

fact( i ) = fact( i ) * j

Next j, i

For i = 2 To 10

* используется совместно с ключевым словом Until, то пока условие остается False - цикл выполняется.

В первом варианте синтаксиса условие проверяется в начале цикла, перед выполнением группы_операторов. Во втором варианте условие проверяется после первого и каждого последующего выполнения группы_операторов. В соответствии с этим, в первом варианте при изначально ложном условии цикл не выполнится ни разу, а во втором варианте в любом случае будет как минимум один проход через тело цикла.

Пример. Модифицированный пример из предыдущего параграфа. С помощью оператора Do ... Loop (во всех его синтаксических формах) организуется цикл, вычисляющий сумму целых чисел от 1 до 100.

Dim i As Integer, sum As Integer i = О sum

= 0 Do

i = i + 1

If i > 100 GoTo Loopl sum =

sum + i Loop

Loopl : Print "1-я Сумма чисел от 1 до 100 = " & Str ( sum ) 'выводит 1-

я Сумма чисел от 1 до 100 = 5050

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

115

Page 116: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print fact( i ) 'выводит 2 6 24 120 720 5040 40320 362880 3628800 Next1.4 .3 .2 Циклы с оператором Do

Данный оператор может принимать одну из следующих синтаксических форм:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

116

Page 117: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

i = О sum = О

Do While i < 100i = i + 1 sum = sum + i LoopPrint "2-я Сумма чисел от 1 до 100 = " & Str( sum )'выводит 2-я Сумма чисел от 1 до 100 = 5050 i = 0 sum = 0Do Until i = 100 i = i + 1 sum = sum + i LoopPrint "3-я Сумма чисел от 1 до 100 = " & Str( sum )'выводит 3-я Сумма чисел от 1 до 100 = 5050 i = 0 sum = 0 Doi = i + 1 sum = sum + i Loop While i < 100Print "4 - я Сумма чисел от 1 до 100 = " & Str( sum )'выводит 4-я Сумма чисел от 1 до 100 = 5050 i = 0 sum = 0 Doi = i + 1 sum = sum + i Loop Until i = 100Print "5-я Сумма чисел от 1 до 100 = " & Str( sum ) 'выводит 5-я Сумма чисел от 1 до 100 = 5050

1.4 .3 .3 Цикл Whi le

Имеет следующий синтаксис:

While условие[ группа операторов ]

Wend

в зависимости от условия - пока оно начале цикла, перед выполнением

Обеспечивает повторное выполнение группыоператоров остается True цикл выполняется. Условие проверяется в группыоператоров.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

117

Page 118: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В LotusScript не существует специального оператора (типа Exit) для принудительного выхода из цикла While ... Wend. Для этих целей может быть использован оператор GoTo.

Цикл While ... Wend может быть полностью заменен конструкцией Do While ... Loop, которая предоставляет разработчику больше возможностей, и поэтому является предпочтительной.

Пример. Модифицированный пример из предыдущего параграфа. С помощью оператора While ... Wend организуется цикл, вычисляющий сумму целых чисел от 1 до 100.

Dim i As Integer, sum As Integer

i = 100

sum = 0

While i > 0

sum = sum + i i = i - 1

Wend

Print "Сумма чисел от 1 до 100 = " & Str( sum ) 'выводит Сумма чисел от 1 до 100 = 5050

1.4 .3 .4 Цикл ForAI I

Имеет следующий синтаксис:

ForAII ссылка_на_элемент_контейнера In контейнер

[ группа операторов ] End

ForAIIОбеспечивает выполнение цикла по всем элементам контейнера. Под контейнером в данном контексте

подразумевается массив, список или коллекция. Коллекция есть некий экземпляр совокупности определенных классов для данного Lotus продукта или OLE-классов.

ОБРАТИТЕ ВНИМАНИЕ, что встроенные коллекции Notes/Domino (например, NotesDocumentCollection) не являются коллекциями в контексте оператора ForAII... End ForAII.

Ссылканаэлементконтейнера есть переменная-указатель на текущий, в момент выполнения, элемент контейнера (массива, списка или коллекции). Внутри тела цикла ForAII ... End ForAII можно использовать ссылку_на_элемент_контейнера для получения значения конкретного элемента контейнера. В имени ссылки_на_элемент_контейнера должен отсутствовать суффикс типа данных.

Контейнер есть имя массива, списка или коллекции.

При первой передаче управления на заголовок цикла значение ссылки_на_элемент_контейнера указывает на первый элемент контейнера. После выполнения группы операторов значение ссылки_на_элемент_контейнера будет указывать на следующий элемент контейнера. Когда группаоператоров выполнится для всех элементов контейнера, управление будет передано оператору следующему за End Fo rA I I .

Замечание : при использовании оператора ForAII для обработки многомерных массивов нельзя использовать оператор ReDim в теле цикла. Подобная попытка приведет к появлению ошибки "Illegal ReDim" ("Недопустимое использование оператора ReDim").

Выполнение цикла ForAII может быть прервано с помощью операторов Exit ForAII или GoTo.

Переменная-указатель ссылка на элемент контейнера неявно объявляется в операторе ForAII, и нет необходимости включать ее явное объявление в скрипт. Даже в случае запрета на неявное объявление переменных (Option Declare), это не приведет к ошибке (в отличие от цикла For ... Next, где счетчик цикла в этом случае необходимо явно объявить). Областью видимости переменной-указателя ссылка_на_элемент_контейнера является данный цикл, при попытке обращения

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

118

Page 119: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

к ней за пределами цикла - генерируется сообщение об ошибке "Illegal reference to ForAII alias variable: XXX" ("недопустимая ссылка на переменную ссылки на элемент контейнера цикла ForAII").

При обработке списка можно передать значение ссылки_на_элемент_контейнера (например, refVar) в функцию ListTag для определения "имени_тега" элемента списка по текущей ссылке refVar.

Например:

Print ListTag(refVar)

Тип данных ссылки на элемент контейнера для контейнера типа массив или список совпадает с типом данных обрабатываемых элементов контейнера. В случае если тип данных контейнера не может быть определен в процессе компиляции, или контейнер есть коллекция, то ссылка_на_элемент_контейнера имеет тип данных Variant. В связи с этим элементы контейнера не должны иметь тип данных, определяемых пользователем, т.к. данные типа Variant не могут содержать значения, определяемого пользователем типа данных.

Пример. Демонстрирует применение цикла ForAII... End ForAII

Dim my_arr( 1 To 3 ) As Long

Dim my_list List As String

Dim ses As New NotesSession

Dim db As NotesDatabase

Dim agent As NotesAgent

Set db = ses.CurrentDatabase

' цикл осуществляет поиск в текущей базе агента с именем Second ForAII

ag In db.Agents

If ag.Name = "Second" Then Set

agent = ag Exit ForAII

End If End

ForAII

Call agent.Run 'запуск найденного агента For i

= 1 to 3 my_arr( i ) = i

Print my_arr( i ) 'выводит 12 3

Next

ForAll j In my_arr j

= j Л 2 End ForAll

For i = 1 to 3

Print my_arr( i ) 'выводит 14 9

Next

my_list( "1" ) = "единица"

my_list( "2" ) = "двойка"

my_list( "3" ) = "тройка"

ForAII x In my_list

Print ListTag( x ); " = "; x End

ForAII ' выводит: ' 1 = единица ' 2 =

двойка ' 3 = тройка

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

119

Page 120: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.4 .4 Операторы принудительного завершения циклов и процедур

1.4 .4 .1 Оператор Ex i t

Имеет следующий синтаксис: Ex i t

тип контекста

• Proper ty - управление передается на тот оператор скрипта, из которого был осуществлен вызов свойства,

аналогично тому как если бы свойство было завершено нормально (без Exit).

Если перед выполнением Exit Function или Exit Property свойству или функции не было присвоено значения, то будет возвращено значение, которым функция или свойство были проинициализированы (0, "", Empty или Nothing).

Пример. Демонстрирует применение оператора Exit. Dim i

As Integer, sum As Integer i = 100

Do

sum = sum + i

i = i - 1

If i = 0 Then Exit Do

Loop

Print "Сумма чисел от 1 до 100 = " & Str( sum ) 'выводит Сумма чисел от 1 до 100 = 5050

1.4 .4 .2 Оператор End

Имеет следующий синтаксис:

End Г кодвозврата]

Завершает выполнение текущей процедуры. Код возврата необязательный параметр, который может быть возвращен в вызывающий скрипт. Не все реализации LotusScript поддерживают данный параметр.

Оператор End часто используется перед первым оператором BASIC-процедуры, для предотвращения передачи управления на оператор Return не в контексте BASIC-процедуры. В противном случае генерируется ошибка на стадии выполнения "Return without GoSub" (попытка применения оператора Return без предварительного выполнения оператора GoSub).

Замечание : не следует путать этот оператор с конструкциями End Sub, End If, End ForAII и т.д., которые завершают конкретные блочные операторы.

Пример. Демонстрирует применение оператора End.

Dim i As Integer

i = Cint( InputBox$( "Введите целое число" ))

If (i >= 1 And i <=3) Then

On i GoSub Label1, Label2, Label3

Else

Print "Введено число меньше единицы или больше тройки"

End If

End 'выход из процедуры

Label1: Print "Введена единица" : Return

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

120

Page 121: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Label2: Print "Введена двойка" : Return

Label3: Print "Введена тройка" : Return

1.5 Процедуры (подпрограммы, функции и свойства) в LotusScript

Процедуры (иногда называемые подпрограммами) есть определенная часть скрипта, которая может неоднократно использоваться без повторения исходного кода. Применение процедур сокращает избыточность программного кода приложения, упрощает процесс отладки и поддержки, а также улучшает читабельность скрипта.

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

• встроенные в LotusScript функции, типа Cos, или Str;

• агенты или макросы в продуктах Lotus;

• определяемые пользователями подпрограммы, функции или свойства;

• @-функции в продуктах Lotus (например, @Sum для продукта Lotus 1-2-3);

• Си-функции, вызываемые из библиотек динамической компоновки (DLL) для Windows- платформ;

• совместно используемые библиотеки (shared library) для UNIX-платформ;

• совместно используемые объекты (shared object) для Macintoch-платформы.

1.5 .1 Функции в LotusScr ip t

Функция в LotusScript представляет собой процедуру, которая возвращает одно определенное значение, и уникально идентифицируется своим именем.

LotusScript предоставляет разработчикам достаточно большой набор встроенных функций, позволяющих выполнять разнообразные операции со всеми поддерживаемыми типами данными (например, преобразование типов данных, проверку вводимых значений и т.д.).

Кроме этого LotusScript дает пользователям возможность разрабатывать собственные функции. При вызове из скрипта такой функции, входящие в ее тело операторы выполняются как один блочный оператор. С точки зрения синтаксиса, операторы, составляющие тело функции, заключаются в конструкции заголовка функции и End Function.

Заголовок функции определяет имя функции, ее область видимости, ожидаемый тип данных переменных аргументов функции (при их наличии), тип данных и время жизни внутренних переменных функций (при их наличии), а также тип данных возвращаемого значения.

Тело функции может состоять из следующих операторов:

• операторы объявления переменных;

• операторы присваивания, включая оператор присваивания возвращаемого значения всей функции;

• операторы вызова встроенных в LotusScript функций;

• операторы вызова определяемых пользователем подпрограмм и функций, включая вызов самой функции

(рекурсивный вызов);

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

121

Page 122: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• операторы организации циклов;

• условные блочные операторы;

• операторы передачи управления по метке;

• операторы принудительного завершения циклов и процедур, включая End и Exit Function для завершения

выполнения текущей функции;

• операторы выполнения стандартных файловых операций и интерфейса с пользователем.

При этом в теле функции запрещается использовать директивы и операторы объявления и определения: процедур (функций, подпрограмм и свойств), определяемых пользователем типов данных, определяемых пользователем классов, а именно Declare, Function, Sub, Property Get и Property Set.

В дополнении к этому списку в теле функции запрещается использование операторов Use, UseLSX, Option.

1.5 .1 .1 Funct ion - оператор определения функции

При определении функции необходимо задать ее заголовок и тело функции. Для этих целей используется оператор Function, имеющий следующий синтаксис:

[ опция_области_видимости ] Function имя_функции [ ( списокпараметров )]

Г As тип_данных_возвращаемого_значения ]

[ группа операторов ] End Functionгде:

опция области видимости может быть либо Pub l i c , Pr i va te , или Sta t i c . При объявлении функции на уровне

модуля, опция Pub l i c дает возможность вызывать данную функцию и вне модуля, в котором она была

определена, до тех пор, пока модуль с ее определением остается загруженным. Опция Pr i va te разрешает

ссылаться на функцию только в пределах модуля с ее определением. При определении функции в

пределах пользовательского класса, опция Pub l i c позволяет обращаться к функции и в не контекста

данного класса, а опция Pr i va te - только в пределах класса. По умолчанию опцияобластивидимости

функции, определяемой на уровне модуля, есть Pr i va te , а на уровне класса - Pub l i c .

Запрещается использовать опцию_области_видимости типа Pub l i c на уровне процедуры. Опция Sta t i c

устанавливает по умолчанию опцию области видимости для внутренних переменных функции типа Sta t i c

(такие переменные сохраняют свои значения между последовательными вызовами функции, до тех пор,

пока модуль с ее определением остается загруженным в памяти). Запрещается использовать опцию

Sta t i c для функций членов класса;

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

Допускается использование в именифункции суффикса типа данных (%, &, !, #, @, and $), который

определяет тип данных возвращаемого функцией значения. Задание суффикса типа данных разрешено

только в случае если конструкция As тип_данных_возвращаемого_значения в заголовке функции опущена;

As тип данных возвращаемого значения - определяет тип данных возвращаемого функцией значения.

Функция может возвращать значения скалярного типа, Variant, или ссылки на объекты. При

использовании данной конструкции в заголовке функции запрещается использование в имени_функции

суффикса типа данных. В случае, когда данная конструкция опущена, и суффикс типа данных в

имени_функции также отсутствует, то для определения типа данных возвращаемое значение ищется

соответствующий имени функции оператор Deftype, и если таковой не найден - возвращаемое значение

будет иметь тип Variant;

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

122

Page 123: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

список параметров - необязательный параметр объявления, который задает список формальных

параметров, ожидаемых для передачи в функцию при ее вызове. С точки зрения синтаксиса это список

элементов, разделенных запятыми, и заключенный в круглые скобки. Каждый элемент этого списка

представляет собой конструкцию вида:

Г ByVal ] имя параметра Г () | List ] Г As тип_данных]

Необязательная опция ByVa l указывает на необходимость передачи в функцию параметра с именем имяпараметра по значению. Это означает, что при вызове функции в нее передается копия значения соответствующей переменной, и изменение значения этой переменной в теле функции не повлечет за собой изменение значения, отвечающей ей переменной в вызывающем модуле.

Задание имени параметра с круглыми скобками ( имя_параметра( ) ) указывает на передачу переменной типа массив.

Ключевое слово L is t определяет соответствующий формальный параметр как список.

При отсутствии после имени_параметра круглых скобок и ключевого слова L is t допускается передача в функцию переменных любого допустимого в LotusScript типа данных.

Не разрешается передача в функцию по значению ( ByVa l ) переменных типа массив, список, ссылка на объект или пользовательский тип данных.

Конструкция As тип_данных определяет тип данных соответствующего формального параметра. При использовании данной конструкции запрещается использование в имени_параметра суффикса типа данных. В случае, когда данная конструкция опущена и суффикс типа данных в имени_параметра также отсутствует, то для определения типа данных параметра ищется соответствующий имени_параметра оператор Deftype, и если таковой не найден - параметр будет иметь тип Variant.

Группа_операторов задает тело функции. В группе операторов запрещается использовать директивы и операторы объявления и определения: процедур (функций, подпрограмм и свойств), определяемых пользователем типов данных, определяемых пользователем классов, а именно Declare, Function, Sub, Property Get и Property Set, а так же операторов Use, UseLSX, Option. Разработчики имеют возможность осуществлять принудительный досрочный выход из тела функции с помощью операторов End, или Exit Function.

Возвращаемое функцией значение определяется с помощью следующего оператора в теле функции:

имя_функции = выражение

Значение выражения и будет определять возвращаемое значение функции.

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

Если при выполнении функции не был выполнен ни один оператор, присваивающий имени функции значения (или такие операторы вообще отсутствовали), то возвращаемое значение будет 0 для числовых типов данных возвращаемого значения, пустая строка для строковых, Empty для Variant и Nothing для ссылок на объекты.

Для получения значения, возвращаемого функцией, в вызывающем модуле можно указывать имя функции со своими фактическими параметрами в любых выражениях, при условии соответствия типов данных.

Пример 1. Функция Sign вычисляет знак (сигнум) числового выражения.

Dim i As Integer, s As String

i = Cint( lnputBox$( "Введите целое число:" )) s =

Sign( i )

Print "Знак числа " & Str( i ) & " - " & s Function

Sign( x As Integer ) As String

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

123

Page 124: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

If x = 0 Then

Sign = 0

Else

If x > 0 Then

Sign = "плюс"

Else

Sign = "минус"

End If

End If End

Function

Пример 2. Функция AMean вычисляет среднее арифметическое значений элементов массива.

Dim i As Integer, j As Integer Dim

y( ) As Double

i = Cint( InputBox$( "Введите число элементов массива" )) Redim у(

i - 1 ) For j = 0 To i - 1

y( j ) = CDbl( InputBox$( "Введите " & Str( j + 1 ) & "-й

элемент массива:" ))

Next j

MsgBox "Среднее арифметическое равно: " & AMean( у ) Function

AMean( x( ) As Double) As Double Dim k As Integer

For k = 0 To UBound ( x )

AMean = AMean + x( k )

Next k

AMean = AMean / ( UBound( x ) + 1 ) End Function

В случае, когда значение, возвращаемое функцией, в вызывающем модуле не требуется, допускается использовать для ее вызова оператор Call. Для встроенных в LotusScript функций запрещается применять для их вызова оператор Call.

Пример. Демонстрирует применение

оператора Call для вызова

функции. Dim my_list List As

String my_list( "1" ) =

"единица" my_list( "2" ) =

"двойка" my_list( "3" ) =

"тройка"

Call My_Print( my_list ) 'выводит единица двойка тройка Function

My_Print( form_list List As String ) ForAII x In form_list

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

124

Page 125: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print x End ForAII End

Function

Согласно стандартам синтаксиса, при вызове функции список ее параметров должен заключаться в круглые скобки, а при отсутствии параметров должны быть указаны пустые скобки. Однако, допускается и сокращенная форма вызова функции без использования скобок, за исключением вызова рекурсивных функций. Ниже приведены правила сокращенного синтаксиса вызова функций:

при отсутствии у функции параметров. В этом случае в вызывающем модуле имя функции без скобок может быть частью

выражения, участвовать в операторе Call, и вообще выступать как самостоятельный оператор;

Пример. Демонстрирует разнообразные формы вызова функции My_Time, которая возвращает и печатает текущее время.

Dim time1 As String

time1 = My_time( ) 'стандартная форма вызова

Print Left( My_time, 2 ) & " текущий час" 'сокращенная форма вызова Call My_time

'сокращенная форма вызова

My_time 'сокращенная форма вызова

Function My_Time As String

My_Time = Time$ 'вызов встроенной функции

Print "Текущее время", My_Time End Function

при наличии у функции одного параметра:

при вызове с оператором Call параметр функции должен быть заключен в скобки; как самостоятельный

оператор в формате имяфункции параметр,

как самостоятельный оператор в формате имя функции (параметр). В данном случае скобки указывают на то, что параметр

передается по значению, а не по ссылке.

Пример. Демонстрирует разнообразные формы вызова функции My_Hour, которая по своему параметру My_Time, соответствующему времени, возвращает и печатает значение составляющей часов.

Dim timel As String

timel = My_Hour ( Time$ ) 'стандартная форма вызова

Call My_Hour( Time$ ) 'форма вызова с оператором Call

My_Hour Time$ 'сокращенная форма вызова

My_Hour( Time$ ) 'сокращенная форма вызова

Function My_Hour( My_Time As String ) As String My_Hour = Left(

My_time, 2 ) Print "Часы =" , My_Hour End Function

при наличии у функции нескольких параметров:

при вызове с оператором Call параметры функции должны быть заключены в скобки; как самостоятельный

оператор в формате имя функции параметр1. . . . .параметры

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

125

Page 126: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Демонстрирует разнообразные формы вызова функции My_Round, которая возвращает и печатает округленное значение параметра My_Number до числа знаков после запятой, определяемых параметром Му_Ргес.

Dim х As Double

х = My_Round( 12.6789 , 2 ) 'стандартная форма вызова

Call My_Round( 12.6789 , 1 ) 'форма вызова с оператором Call

My_Round 12.6789 , 3 'сокращенная форма вызова

Function My_Round( My_Number As Double, My_Prec As Integer ) As Double My_Round =

Cint( My_Number * 10 Л My_Prec )/( 10 л My_Prec ) Print "Число:", My_Number, " с

точностью:", My_Prec, " = ", My_Round End Function

LotusScript поддерживает рекурсивные функции, т.е. такие функции, в теле которых содержится вызов ее самой.

При проектировании рекурсивных функций разработчику необходимо самому позаботиться об окончании при определенных условиях рекурсии. Следует так же помнить, что стек рекурсивных вызовов ограничен, и составляет в настоящее время 32 Кбайта. Как уже упоминалось, для рекурсивных вызовов в теле функции без параметров не допускается сокращенная форма вызова без скобок после именифункции (данный контекст будет восприниматься как присвоение переменной текущего значения функции).

ЗАМЕЧАНИЕ: при использовании внешних Си-функций в 32-разрядных Windows-платформах следует помнить, что внутреннее представление чисел типа Integer есть 4 байта. Поэтому для соответствия с LotusScript, где Integer представлено в виде 2-х байт, необходимо использовать тип Short Integer (2 байта). Данное замечание справедливо только для 32-разрядных Windows-платформ.

Пример. Рекурсивная функция My_Sum вычисляет сумму целых чисел от 1 до своего параметра N.

Print My_Sum( 100 ) 'выводит 5050

Function My_Sum( N As Integer ) As Integer If N = 1 Then

My_Sum = 1

Else

My_Sum = N + My_Sum( N - 1 )

End If

End Function1.5 .1 .2 Способы передачи параметров в функции и подпрограммы

В LotusScript передача значений параметров в функции и подпрограммы может быть осуществлена двумя способами:

• по ссылке (используется по умолчанию). В этом случае в процедуру передается указатель на область

памяти, в которой хранится значение соответствующей переменной. При этом, если в теле функции

(подпрограммы) данное значение будет изменено, то это изменение произойдет и в аналогичной

переменной в вызывающем модуле;

* указать ключевое слово ByVal при объявлении формальных параметров. В этом случае соответствующие

аргументы будут передаваться по значению при любом вызове данной процедуры;

• заключить параметр в круглые скобки в операторе вызова процедуры. Такой механизм позволяет

управлять способом передачи параметров, варьируя его в зависимости от потребностей.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

126

Page 127: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• по значению. В этом случае в процедуру передается копия значения соответствующей переменной

вызывающего модуля. При этом изменение значения данной переменной в теле функции (подпрограммы)

не влечет за собой изменения аналогичной переменной в вызывающем модуле.

Некоторые типы параметров могут быть переданы в процедуры только одним способом. В частности:

• массивы, списки, экземпляры пользовательских типов данных и объектов могут быть переданы в

процедуры только по ссылке;

• передача в процедуры констант и выражений автоматически осуществляется по значению.

Остальные типы параметров могут быть переданы либо по значению, либо по ссылке.

Передача параметров по ссылкеПри передаче аргументов в процедуру выполняется попытка преобразования их к ожидаемому (в соответствии

с объявлением) типу данных. Аргументы типа Variant могут содержать любые скалярные типы данных, а также массивы, списки, или ссылки на объекты.

Пример. Демонстрирует способы передачи параметров в функции. Dim

a As Integer, b As Integer, с As Integer a = 2 b = 3

Print "a = ", a, "b = ", b "выводит a = 2 b = 3

с = Change1 ( a, b ) 'выводит x = 3 у = 2

'передача параметров была по ссылке

Print "а = ", a, "b = ", b ' выводит а = 3 b = 2

'изменение параметров в вызывающем блоке произошло с =

Change2( a, b ) 'выводит х = 2 у = 3

'передача параметров была по значению

Print "а = ", a, "b = ", b 'выводит а = 3 b = 2

'изменение параметров в вызывающем блоке не произошло с =

Change1 ( (а) , (Ь) ) ' выводит х = 2 у = 3

'передача параметров была по значению

Print "а = ", a, "b = ", b 'выводит а = 3 b = 2

'изменение параметров в вызывающем блоке не произошло Function Change1( х As

Integer, у As Integer ) As Integer 'в объявлении функции по умолчанию

параметры передаются по ссылке Change1 = х х = у у = Change1

Print "х = " , х, "у = " , у

End Function

Function Change2( ByVal x As Integer, ByVal у As Integer ) As Integer 'в

объявлении функции параметры передаются по значению Change2 = х х = у

у = Change2

Print "х = ", х, "у = ", у

End Function1.5.1.3 Области видимости переменных при использовании процедур

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

127

Page 128: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В теле процедуры можно оперировать со следующими типами переменных:

• со всеми явно или неявно объявленными переменными в теле данной процедуры (их называют локальными

переменными процедуры). Локальные переменные имеют по умолчанию область видимости только внутри

данной процедуры. При объявлении локальной переменной с опцией области видимости Static, такая

переменная будет сохранять свое значение между вызовами процедуры, но все равно будет доступна для

ссылки только внутри тела процедуры. При объявлении (явном или неявном) одноименной с уровнем модуля

локальной переменной, значение переменной уровня модуля испорчено не будет. При обращении к такой

переменной внутри процедуры, будет использоваться значение, определенной в процедуре, а по выходу из

процедуры - значение уровня модуля;

• со значениями, переданными в функцию/подпрограмму при ее вызове (их называют фактические параметры);

• со значениями переменных области видимости модуля, к которым данная функция/подпрограмма имеет прямой

доступ (обычно это переменные вызывающего модуля). До тех пор пока в теле функции не будут объявлены

(явно или неявно) одноименные с определенными в модуле переменные, они являются доступными в теле

функции/подпрограммы;

• для функций/подпрограмм членов класса ко всем значениям переменных членов класса, к которым данная

функция/подпрограмма имеет прямой доступ (будет рассмотрено позднее).

Пример 1. Демонстрирует применение локальных переменных типа Static. Dim i As

Integer For i = 1 to 10

Call My_Test

'функция в цикле печатает который раз она вызывается Next i

Function My_Test As Variant

Static j As Integer j = j + 1

Print "Сейчас " & Str( j ) & "-й вызов функции My_Test"

End Function

Пример 2. Демонстрирует применение одноименных переменных на уровне модуля и тела функции. Dim my__int As

Integer my_i nt = 3

Print "В модуле перед вызовом функции my_int = " , my_int 'выводит В

модуле перед вызовом функции my_int = 3 Call My_test

'выводит В теле функции my_i nt = 12

Print "В модуле после вызова функции my_int = " , my_int 'выводит В

модуле после вызова функции my_int = 3 Function My_Test As Variant

Dim My_int As Integer

my_int = 12

Print "В теле функции my_int = " , my_int End

Function

Пример 3. Демонстрирует применение в теле функции переменной уровня модуля. Dim my_int As

Integer, j As Integer

'данное объявление должно на уровне модуля, например, 'в

(Declarations) для формы

'операторы ниже уже и на уровне процедуры, например, 'в

QueryOpen для формы my_int = 3

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

128

Page 129: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print "В модуле перед вызовом функции my_int- = " , my_int

'выводит В модуле перед вызовом функции my_int = 3 j = My_test

'выводит В теле функции my_i nt = 3

Print "j = ", j 'выводит j = 27 Function

My_Test As Variant My_Test = my_int Л 3

Print "В теле функции my_int = " , my_int End

Function

1.5.2 Подпрограммы

Подпрограмма в LotusScript представляет собой процедуру, которая выполняет группу операторов (один или более) без явного возвращения в вызывающий модуль некоторого значения, и уникально идентифицируется своим именем.

При вызове из скрипта подпрограммы, входящие в ее тело операторы выполняются как один блочный оператор. С точки зрения синтаксиса, операторы, составляющие тело подпрограммы, заключаются в конструкции заголовка подпрограммы и End Sub. В теле подпрограммы запрещается вставлять оператор, присваивающий имени подпрограммы определенное значение.

Заголовок подпрограммы определяет имя подпрограммы, ее область видимости, ожидаемый тип данных переменных аргументов подпрограммы (при их наличии), тип данных и время жизни внутренних переменных подпрограммы (при их наличии).

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

Предварительное объявление подпрограммы (с помощью оператора Declare) позволяет избежать ошибки в случае, когда ссылка на подпрограмму появляется раньше определения подпрограммы. Использование оператора предварительного объявления подпрограммы необходимо только в случае, если конкретная реализация LotusScript не поддерживает механизм IDE (Integrated Development Environment - интегрированная среда разработки). В противном случае данный механизм автоматически генерирует необходимые предварительные объявления подпрограмм.

В LotusScript имеются также четыре встроенные специализированные подпрограммы (Initialize, Terminate, New и Delete), которые будут рассмотрены позднее в настоящем параграфе.

1.5 .2 .1 Sub - оператор определения подпрограммы

При определении подпрограммы необходимо задать ее заголовок и тело подпрограммы. Для этих целей используется оператор Sub, имеющий следующий синтаксис:

[ опция_области_видимости ] Sub имя_подпрограммы [ ( список_параметров ) ]

[ группа_операторов ] End

Sub ____________________,

где:

опцияобластивидимости может быть либо Pub l i c , Pr iva te , или Sta t i c . При объявлении подпрограммы на

уровне модуля, опция Pub l i c дает возможность вызывать данную подпрограмму и вне модуля, в котором

она была определена, до тех пор, пока модуль с ее определением остается загруженным. Опция Pr i va te

разрешает ссылаться на подпрограмму только в пределах модуля с ее определением. При определении

подпрограммы в пределах пользовательского класса, опция Pub l i c позволяет обращаться к ней и вне

контекста данного класса, а опция Pr i va te - только в пределах класса. По умолчанию

опцияобластивидимости подпрограммы, определяемой на уровне модуля, есть Pr i va te , а на уровне класса

- Pub l i c . Запрещается использовать опциюобластивидимости типа Pub l i c на уровне процедуры. Опция

Sta t i c устанавливает по умолчанию опцию области видимости для внутренних переменных

подпрограммы типа Sta t i c (такие переменные сохраняют свои значения между последовательными

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

129

Page 130: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

вызовами подпрограммы, до тех пор, пока модуль с ее определением остается загруженным в памяти).

Запрещается использовать опцию Sta t i c для подпрограмм членов класса;

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

Имя_подпрограммы, определяемой пользователем, не должно совпадать с зарезервированными именами

специальных подпрограмм (Initialize, Terminate, New и Delete);

списокпараметров - необязательный параметр объявления, который задает список формальных

параметров, ожидаемых для передачи в подпрограмму при ее вызове. С точки зрения синтаксиса это

список элементов, разделенных запятыми, и заключенный в круглые скобки. Каждый элемент этого

списка представляет собой конструкцию вида:

[ ByVa l ] имя_ параметра [ ( ) | L ist ] [ As тип_данных]

Необязательная опция ByVa l указывает на необходимость передачи в подпрограмму параметра с именем имя_параметра по значению. В этом случае при вызове подпрограммы в нее передается копия значения соответствующей переменной, и изменение значения этой переменной в теле подпрограммы не повлечет за собой изменение значения, отвечающей ей переменной в вызывающем модуле.

Задание имени параметра с круглыми скобками ( имя_параметра( ) ) указывает на передачу переменной типа массив.

Ключевое слово L is t определяет соответствующий формальный параметр как список.

При отсутствии после имени_параметра круглых скобок и ключевого слова L is t допускается передача в подпрограмму переменных любого допустимого в LotusScript типа данных.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

130

Page 131: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Не разрешается передача в подпрограмму по значению ( ByVa l ) переменных типа массив, список, ссылка на объект или пользовательский тип данных.

Конструкция As тип данных определяет тип данных соответствующего формального параметра. При использовании данной конструкции запрещается использование в имени параметра суффикса типа данных. В случае, когда данная конструкция опущена и суффикс типа данных в имени параметра также отсутствует, то для определения типа данных параметра ищется соответствующий имени параметра оператор Def type, и если таковой не найден - параметр будет иметь тип Variant.

Группа_операторов задает тело подпрограмм. В группе операторов запрещается использовать директивы и операторы объявления и определения: процедур (функций, подпрограмм и свойств), определяемых пользователем типов данных, определяемых пользователем классов, а именно Declare, Function, Sub, Property Get и Property Set, а также операторов Use, UseLSX, Option. Разработчики имеют возможность осуществлять принудительный досрочный выход из тела подпрограммы с помощью операторов End, или Exit Sub.

Вызов подпрограммы может осуществляться с помощью одной из двух синтаксических форм: Call имя

подпрограммы( параметр1 ..., параметр N)

или

имя подпрограммы

Способы передачи параметров по ссылке и значению, а так же области видимости переменных при использовании совместно с подпрограммами, совпадают с рассмотренными случаями для функций.

Пример. Подпрограмма ASort выполняет сортировку по возрастанию элементов одномерного массива,

передаваемого ей в качестве формального параметра.

Dim my_arr ( 3 ) As Integer, i As Integer

my_arr( о ) = 7

my_arr( 1 ) = 3

my_arr( 2 ) = 1

my_arr( 3 ) = 5

For i = 0 To 3

Print "my_arr ( " & Str ( i ) & " ) = " & Str ( my_arr ( i ))

Next i1выводит в цикле'my_arr( 0 ) = 7

'my_arr( 1 ) = 3

'my_arr( 2 ) = 1

'my_arr( 3 ) = 5

Call Asort(

my_arr ) For i =

0 To 3

Print "my_arr( " & Str( i ) & ")=" & Str( my_arr( i ))Next i

параметр1

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

131

Page 132: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1 выводит в цикле 1my_arr( 0 ) = 1

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

132

Page 133: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1my arr ( 1 ) = 3

'my arr( 2 ) = 5

1my arr ( 3 ) = 7

Sub Asort( arr ( ) As Integer )

Dim j As Integer, к As Integer, tmp As Integer For к

= LBound( arr ) To UBound( arr ) For j = к To UBound(

arr )

If arr( j ) < arr( к ) Then

tmp = arr( j )

arr( j ) = arr( к )

arr ( к ) = tmp

End If

Next j

End Sub1.5 .2 .2 Специализированные подпрограммы ( In i t i a l i ze , Terminate , New и Dele te )

В LotusScript имеется, как уже упоминалось, четыре встроенных специализированных подпрограммы (Initialize, Terminate, New и Delete), используемые для инициализации и очистки от "мусора" приложений. Рассмотрим подробнее их предназначение и синтаксис.

Подпрограмма Initialize (инициализация) дает возможность разработчику выполнить определенные действия в период загрузки модуля. LotusScript автоматически выполняет эту подпрограмму когда приложение загружает модуль, в котором эта подпрограмма была определена. Для каждого конкретного модуля может существовать только одна подпрограмма Initialize. Ее синтаксис следующий:

Sub Initialize

[ группа операторов ] End Sub

Данная подпрограмма имеет неизменяемую опцию области видимости Private. В Initialize не могут быть переданы в качестве параметров никакие значения. На подпрограмму Initialize не распространяются обычные ограничения для операторов и директив определяемых пользователем процедур.

ЗАМЕЧАНИЕ: не все реализации LotusScript разрешают определять пользователям свои собственные обработки события инициализации с помощью подпрограммы Initialize.

Подпрограмма Terminate (очистка от "мусора") дает возможность разработчику выполнить определенные действия в период выгрузки модуля из памяти. LotusScript автоматически выполняет эту подпрограмму, когда приложение завершает модуль, в котором эта подпрограмма была определена. Для каждого конкретного модуля может существовать только одна подпрограмма Terminate. Ее синтаксис следующий:

Sub Terminate

[ группаоператоров ] End Sub

Данная подпрограмма имеет неизменяемую опцию области видимости Private. В Terminate не могут быть переданы в качестве параметров никакие значения.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

133

Page 134: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Подпрограммы New и Delete используются в качестве конструкторов и деструкторов классов и будут рассмотрены позднее в параграфе, посвященном классам.

1.5 .3 Процедуры типа свойства

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

Для создания свойства используются две специальные процедуры Property Get ... End Property и Property Set... End Property. Первая получает значение свойства, а вторая присваивает свойству значение.

Данные процедуры имеют следующий синтаксис: [ опция области видимости ]

Ge t Prope r ty имясвойства

[( список параметров )] [As тип_данных_свойства]

[ группа операторов ] End

Proper ty

и

[ опция области видимости ] Se t Prope r t y имя свойства

[ ( списокпараметров ) ] [As тип_данных_свойства ] [ группа операторов

] End P roper ty

где:

опция области видимости может быть либо Pub l i c , Pr iva te , или Sta t i c . При объявлении свойства на уровне

модуля, опция Pub l i c дает возможность использовать данное свойство и вне модуля, в котором оно было

определено, до тех пор, пока модуль с его определением остается загруженным. Опция Pr i va te

разрешает ссылаться на свойство только в пределах модуля с его определением. При определении

свойства в пределах пользовательского класса, опция Pub l i c позволяет обращаться к свойству и вне

контекста данного класса, а опция Pr i va te - только в пределах класса. По умолчанию опция области

видимости свойства, определяемого на уровне модуля, есть Pr i va te , а на уровне класса - Pub l i c .

Запрещается использовать опцию_области_видимости типа Pub l i c на уровне процедуры. Опция Sta t i c

устанавливает по умолчанию опцию области видимости для внутренних переменных свойства типа Sta t i c

(такие переменные сохраняют свои значения между последовательными вызовами свойства, до тех пор,

пока модуль с его определением

остается загруженным в памяти). Запрещается использовать опцию Sta t i c для свойств членов класса;

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

Допускается использование в имени_свойства суффикса типа данных, который определяет тип данных

значения свойства. Задание суффикса типа данных разрешено только в случае если конструкция As

тип_данных_свойства в заголовке свойства опущена;

As типданныхсвойства - определяет тип данных значения свойства. Свойство может возвращать значения

скалярного типа, Variant, или ссылки на объекты. При использовании данной конструкции в заголовке

свойства запрещается использование в имени свойства суффикса типа данных. В случае, когда данная

конструкция опущена и суффикс типа данных в имени__свойства также отсутствует, то для определения

типа данных возвращаемое значение ищется соответствующий имени свойства оператор Deffype, и если

таковой не найден - возвращаемое значение будет иметь тип Variant. Тип_данных_свойства должен быть

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

134

Page 135: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

одним для всех операторов Property Get... End Property и Property Set... End Property с одним именем

свойства,

список параметров - необязательный параметр объявления, который задает список формальных

параметров, ожидаемых для передачи в свойство при его вызове. С точки зрения синтаксиса это список

элементов, разделенных запятыми, и заключенный в круглые скобки. Каждый элемент этого списка

представляет собой конструкцию вида:

[ ByVal ] имяпараметра [ () | List ] [ As тип_данных]

Необязательная опция ByVa l указывает на необходимость передачи в свойство параметра с именем имя параметра по значению. В этом случае при вызове свойства в него передается копия значения соответствующей переменной, и изменение значения этой переменной в теле свойства не повлечет за собой изменение значения, отвечающей ей переменной в вызывающем модуле.

Задание имени параметра с круглыми скобками ( имя_параметра( ) ) указывает на передачу переменной типа массив.

Ключевое слово L is t определяет соответствующий формальный параметр как список.

При отсутствии после имени параметра круглых скобок и ключевого слова L is t допускается передача в свойство переменных любого допустимого в LotusScript типа данных.

Не разрешается передача в свойство по значению ( ByVa l ) переменных типа массив, список, ссылка на объект или пользовательский тип данных.

Конструкция As тип_данных определяет тип данных соответствующего формального параметра. При использовании данной конструкции запрещается использование в имени параметра суффикса типа данных. В случае, когда данная конструкция опущена и суффикс типа данных в имени параметра также отсутствует, то для определения типа данных параметра ищется соответствующий имени параметра оператор Deffype, и если таковой не найден - параметр будет иметь тип Variant.

Группа операторов задает тело свойства. В группеоператоров запрещается использовать директивы и операторы объявления и определения: процедур (функций, подпрограмм и свойств), определяемых пользователем типов данных, определяемых пользователем классов, а именно Declare, Function, Sub, Property Get и Property Set, а так же операторов Use, UseLSX, Option. Разработчики имеют

возможность осуществлять принудительный досрочный выход из тела свойства с помощью операторов End, или Exit Property.

Для операции со значением свойства с одним и тем же именемсвойства, обычно, используются две процедуры: Property Get... End Property и Property Set... End Property, однако синтаксис LotusScript не требует обязательного применения двух процедур.

Процедура Property Get... End Property очень похожа на процедуру-функцию.

Пример. Процедура Property Get ... End Property с именем MyColor возвращает текстовую строку в зависимости от параметра.

Dim param As Integer

Dim color As String

param = 2

color = MyColor( param ) Print

color 'выводит зеленый

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

135

Page 136: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Процедура Property Set... End Property по сути своей является обратной по отношению к Property Get ... End Property. При входе в такую процедуру неявно объявляется переменная, имеющая такое же имя и тип данных, что и имя свойства. Внутри процедуры необходимо использовать значение этой переменной вместо присваивания процедуре некоторого значения.

Пример. Процедура Property Set... End Property с именем MyColor присваивает значение текстовой строки свойству.

Dim param As Integer

Dim color As String

param = 2

MyColor( param ) = "красный" 'выводит красный

Property Set MyColor ( par As Integer ) As String

Print MyColor End

Property

В случае, когда процедура Property Get ... End Property возвращает массив, список или коллекцию, синтаксис допускает присутствие в имени свойства индексов, при этом должны соблюдаться следующие правила:

• если свойство имеет список аргументов, то первым списком, заключенным в круглые скобки, должен быть список

аргументов, а вторым - список индексов возвращаемого значения.

Например, MyColor( 1, 2 )( 3 ) - осуществляет ссылку на свойство MyColor, которое имеет два параметра

(1, 2 ), и 3 - индекс в коллекции возвращаемого значения;

Property Get MyCol or (

par As Integer ) As String

Select Case par

Case 0 : MyColor = "черный"

Case 1 : MyColor = "синий"

Case 2 : MyColor = "зеленый"

Case 3 : MyColor = "красный"

Case Else : MyColor = "неопределенный

End SelectEnd Property

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

136

Page 137: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• если свойство не имеет списка аргументов, то единственным списком, заключенным в круглые скобки,

должен быть список индексов возвращаемого значения. Например, MyColor( 3 ) - осуществляет ссылку на

свойство MyColor, которое не имеет списка параметров, где 3 - индекс в коллекции возвращаемого

значения.

Процедура Property Set... End Property не должна по синтаксису иметь в имени свойства индексов.

Процедуры-свойства могут быть переданы в функцию только по значению, но не по ссылке. 1 .5 .4 Dec lare- оператор

предварительного объявления процедуры

В LotusScript версий ниже 4.0 в некоторых случаях требовалось предварительно объявлять процедуру перед ее определением. Для LotusScript версий 4.0 и выше это уже не является необходимостью. Однако для совместимости с более ранними приложениями соответствующий оператор в языке остался. Его синтаксис может быть одним из следующих:

Dec lare [ опция области видимости ] Func t ion имя_функции [ ( с п и с о к п а р а м е т р о в ) ] Г As

тип данных возвращаемого значения ]

или

Dec lare [ опция области видимости ] Sub имя подпрограммы [ ( список параметров ) ]

или

Dec lare [ опция области видимости ] P roper ty Get имя_ свойства [ ( список параметров ) ] [

As тип данных свойства ]

или

Dec lare [ опция области видимости ] P roper ty Set имя_ свойства [ ( список параметров ) ] [

As тип данных свойства ]

Все параметры имеют ту же смысловую нагрузку, что и при определении процедуры. В LotusScript версий 4.0 и выше данный оператор компилятором воспринимается как комментарий.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

137

Page 138: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.6 Классы в LotusScript

Классы являются базовым понятием объектно-ориентированного проектирования. В данном параграфе авторы попытались сосредоточить свое внимание на особенностях реализации классов в LotusScript. Для более детального знакомства с технологией объектно-ориентированного проектирования можно порекомендовать книгу: Буч Г. Объектно-ориентированное проектирование с примерами применения: Пер. с англ. - М.: Конкорд, 1992. -519 с.

Классы представляют собой комбинированный тип данных, который включает в себя как отдельные переменные, так и процедуры для их обработки. Классы, благодаря большей функциональности чем просто процедуры, позволяют значительно сократить время разработки путем повторного использования кода. Разработчикам предоставляется возможность создания и распространения сторонним пользователям библиотек классов (при этом, только авторы могут модифицировать данные библиотеки). Для создания библиотеки описания классов компилируются и помещаются в файлы с расширением *. LSO. Включение файла в нужное место происходит директивой Use.

Переменные и процедуры класса могут иметь области видимости как в пределах класса (P r i va te) , так и вне класса (Pub l ic ) . Таким образом, достигается возможность ограничения доступа к членам класса. Процедуры класса могут использоваться:

• для инициализации переменных членов класса, при создании на основе описания класса его экземпляра;

• для доступа к переменным членам класса;

• для освобождения памяти, занимаемой экземпляром класса, после того как приложение уже не нуждается

в данном объекте.

Базовым понятием объектно-ориентированного проектирования является наследование. Наследование позволяет разработчикам определять новые классы "не с нуля", а на основе ранее разработанных классов. Класс, создаваемый на основе другого класса, называют производным классом (derived class), а класс, на основе которого производный класс создается, базовым классом (base class).

Базовый класс определяет общие переменные и процедуры класса, которые в дальнейшем могут использоваться для наследования другими классами. Описание производного класса расширяет и возможно уточняет базовый класс, при этом производный класс имеет прямой доступ ко всем членам базового класса, кроме деструктора базового класса. Кроме того что в производный класс могут быть добавлены новые члены класса, также существует возможность переопределения членов базового класса в производном классе. При этом одноименный элемент базового класса не переопределяется.

Для определения описания класса используется оператор со следующим синтаксисом: [ опция_области_видимости

] Class имякласса [As имя_6азового_класса ]

[ группа операторов ] End Class

* идентификаторы процедур членов класса могут совпадать с любыми зарезервированными ключевыми

словами LotusScript, имена переменных членов класса также могут совпадать с зарезервированными

ключевыми словами, за исключением: Public, Private, Static, Sub, Function, Property, Get, Set, New, Delete,

и Rem. Авторы рекомендуют не применять данное правило на практике, хотя бы из соображений

"читабельности" скрипта.

Для ссылки на члены класса используется следующий синтаксис:

имя_экземпляра_класса. имя_члена_класса

где:

имячленакпасса определяет соответственно либо переменную, либо процедуру, входящие в состав класса, а имя_экземпляра_класса - идентификатор-ссылка на объект, созданного на основании описания класса.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

138

Page 139: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

где:

опция_рбласти видимости может быть либо Pub l i c , или Pr i va te . Опция Pub l i c дает возможность

использовать описание данного класса и вне модуля, в котором он был определен, до тех пор, пока

модуль с его определением остается загруженным. Опция Pr i va te разрешает ссылаться на класс только в

пределах модуля с его определением. По умолчанию используется опция Pr i va te . Опциюобластивидимости

типа Pub l i c разрешается применять только на уровне модуля. Для производного класса его область

видимости должна совпадать с базовым классом;

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

описанием. Запрещается в качестве имякласса использовать идентификатор Object;

• As имябазовогокласса - необязательная конструкция, использующаяся для определения производного

класса. Соответственно имя_базового_кпасса задает имя базового класса;

• группа операторов задает тело класса, и состоит из операторов объявления и определения членов класса.

Члены класса, как уже упоминалось, могут состоять из переменных, пользовательских процедур

(функции, подпрограммы и свойства), а также двух специализированных подпрограмм: конструктора

класса с именем New и деструктора класса с именем Delete. Константы не могут выступать в качестве

членов класса.

Оператор Class ... End Class можно использовать только на уровне модуля. Соответственно запрещается определять описание класса на уровне процедуры или внутри другого класса.

В LotusScript процедуры-функции и процедуры-подпрограммы члены класса называют методами.

При объявлении членов класса должны соблюдаться следующие правила:

• при объявлении переменных членов класса разрешается использовать только опции области видимости

типа Pub l i c или Pr i va te . Соответственно запрещается использовать опции D im и S ta t i c . По умолчанию

используется опция Pr i va te (т.е. доступна только в пределах данного класса). Объявление каждой

переменной члена класса должно начинаться с новой строки (т.о. запрещается давать объявление

переменных в виде списка, элементы которого разделяются запятыми);

• класс может включать экземпляр самого себя, как член класса. Однако, в этом случае в объявлении

переменной, ссылающейся на этот класс, запрещается использовать ключевое слово New, т.к. описание

класса не является объектом (только описание), и поэтому не может создавать другие объекты;

• при объявлении процедур членов класса так же разрешается использовать только опции области

видимости типа Pub l i c или Pr i va te . Соответственно запрещается использовать опцию Sta t i c ;

• процедуры члены класса с именами New и Delete разрешается использовать только в контексте

конструктора и деструктора класса соответственно;Для ссылки на текущий класс в процедурах членах класса может использоваться ключевое слово Me (аналогично

ключевому слову this в языке С+ + ) со следующим синтаксисом:

Me . имя члена класса

Например, Me.Color ссылается на переменную Color текущего класса. В случае, когда имя переменной члена класса совпадает с ключевыми словами LotusScript, то использование Me перед именем переменной необходимо.

Методы производного класса могут быть переопределены ("перезагружены") по отношению к одноименным методам базового класса. Заголовок переопределяемого метода в производном классе, в этом случае, должен в точности совпадать с заголовком одноименного метода в базовом классе. Под заголовком здесь понимается имя метода со списком его формальных параметров, которые должны однозначно совпадать с переопределяемым методом базового класса.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

139

Page 140: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Для ссылки на член базового класса в контексте производного класса используется следующий синтаксис:

имя базового класса.. имя члена класса

Для одновременной работы с несколькими членами класса можно использовать оператор With ... End With (будет рассмотрен позднее в настоящем параграфе).

Для создания экземпляра класса (также называемого объектом) используют ключевое слово New совместно с оператором Dim, или Set. Данными операторами также определяется переменная, которая будет использоваться для организации ссылки на данный экземпляр класса.

После объявления переменной типа ссылки на класс (без ключевого слова New), LotusScript инициализирует значение данной переменной как Nothing. Для сравнения значения переменной с Nothing используется оператор выполнения операции Is. Например, If (doc Is Nothing) Tnen ... End If. Так как переменные типа Variant так же могут содержать значения типа ссылки на экземпляр класса, то в этом случае для такой проверки необходимо использовать функция IsObject (будет рассмотрена позднее в настоящем параграфе).

Для принудительного удаления экземпляра класса можно использовать оператор Delete (так же будет рассмотрен позднее в настоящем параграфе).

Пример 1. Определяется класс MyPoint, который соответствует вектору в 2-х мерном пространстве, и две процедуры MySum - векторная сумма, MyScal - скалярное произведение этих векторов.

Public Class MyPoint

Public x As Double "координата вектора по X

Public у As Double 'координата вектора no Y

Public Function MySum( A As MyPoint, В As MyPoint ) As MyPoint

Set MySum = New MyPoint

MySum.x = A.x + B.x

MySum.у = A.y + В.у

End Function

Public Function MyScal( A As MyPoint, В As MyPoint ) As Double

MyScal = A.x * B.x + А.у * В.у End

Function End Class

Dim Pointl as New MyPoint, Point2 as New MyPoint

Dim Point3 as New MyPoint

Pointl.x = 2

Pointl.у = 3

Point2.x = -1

Point2.y = 4

Set Point3 = Pointl.MySum( Pointl, Point2 ) Print

Point3.x 'выводит 1

Print Point3.y 'выводит 7

Print Pointl.MyScal( Pointl, Point2 ) 'выводит 10

Пример 2. Модифицированный пример 1 с использованием в описании класса ключевого слова Me. Public

Class MyPoint

Public x As Double 'координата вектора по X

Public у As Double 'координата вектора no Y

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

140

Page 141: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Public Function MySum( A As MyPoint ) As MyPoint Set MySum = New MyPoint MySum.x = A.x + Me.x MySum

.у = A^ + Me . у End Function

Public Function MyScal( A As MyPoint ) As Double

MyScal = A.x * Me.x + А.у * Me^ End

Function End Class

Dim Pointl as New MyPoint, Point2 as New MyPoint

Dim Point3 as New MyPoint

Pointl.x = 2

Pointl.у = 3

Point2.x = -1

Point2.y = 4

Set Point3 = Pointl.MySum( Point2 )

Print Point3.x 'выводит 1

Print Point3.y 'выводит 7

Print Pointl.MyScal( Point2 ) 'выводит 10

1.6.1 Конструктор и деструктор класса

При создании описания класса разработчик имеет возможность определить две специализированные подпрограммы, которые будут принудительно выполняться при создании экземпляра класса, и при его удалении из памяти. Данные процедуры называются конструктор и деструктор класса, и имеют соответственно имена New и Delete. У класса может быть только один конструктор и деструктор. Для них определена неизменяемая область видимости типа Public.

Синтаксис конструктора класса несколько отличается от обычного синтаксиса подпрограмм в LotusScript, и имеет вид:

Sub New [ ( список параметров ) ]

[, имябазовогокласса ([ список_параметров_базового_класса ]) ]

[ группа операторов ]

End Subгде:

список параметров и группа операторов имеют значение и синтаксис аналогичный обычному определению

подпрограммы (стр. Ошибка! Закладка не определена. ) ;

конструкции имя_базового_кпасса и список_параметров_базового_кпасса требуются только для производных

классов, в случае, когда конструктор базового класса содержит список аргументов, отличный от списка

аргументов определяемого производного класса. При этом имя базового класса должно в точности

совпадать с именем базового класса из конструкции As имябазовогокласса в описании текущего класса.

Список_параметров_базового_класса должен представлять собой список фактических (а не формальных

описаний) параметров для конструктора базового класса. В этом случае сначала выполняется

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

производным, то операция поднимается на уровень вверх. Самым первым в этой цепочке будет

выполняться конструктор класса самого верхнего уровня, затем управление будет постепенно

спускаться вниз до текущего класса. Если список аргументов конструктора базового класса совпадает

или является подмножеством списка аргументов определяемого конструктора производного класса, то в

конструкции [ , имя_базового_класса ([ список_параметров_базового_класса ]) ] нет необходимости.

Для деструктора класса имеются следующие ограничения по отношению к обычным подпрограммам:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

141

Page 142: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• деструктор не должен иметь списка параметров;

• нельзя самостоятельно вызвать деструктор операторами вызова подпрограмм;

• иерархия выполнения деструкторов для производного класса аналогична порядку выполнения

конструкторов с точностью до наоборот; сперва выполняется деструктор производного класса, затем его

прямой предок, и так до самого верхнего уровня.

Следует так же отметить, что деструктор класса используется не для непосредственного удаления объекта (это делает сам LotusScript), а для выполнения необходимых, с точки зрения разработчика, действий перед удалением объекта. В остальном и конструктор, и деструктор подчиняются общим правилам синтаксиса для процедур-подпрограмм.

Пример 1. Модифицированный пример из предыдущего параграфа с использованием конструктора и деструктора класса. Обратите внимание, что в функции MySum изменился оператор первоначальной инициализации возвращаемого значения (при вызове конструктора добавились параметры), в противном случае (их отсутствие) выдается ошибка на стадии компиляции.

Class MyPoint

Public х As Double 'координата вектора по X

Public у As Double 'координата вектора по Y

Public Function MySum( A As MyPoint ) As MyPoint

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

142

Page 143: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Set MySum = New MyPoint( 0,0 )

MySum.x = A.x + Me.x MySum .у = A^ + Me .

у End Function

Public Function MyScal( A As MyPoint ) As Double

MyScal = A.x * Me.x + А.у * Me.у End

Function

Sub New( xl As Double, yl As Double ) x = x1 у = y1

End Sub Sub Delete

Print "Объект с координатами no X=" & Str ( x ) "

Y=" & Str( у ) & " будет удален"

End Sub

End Class

Dim Pointl as MyPoint Set Pointl = New MyPoint( 2,3 ) Print Point1.x 'выводит 2

Print Point1^ 'выводит 3

Delete Point1 ' выводит Объект с координатами no Х=2 Y=3 будет удаленПример 2. Модифицированный пример 1. Добавился новый класс ColorPoint, являющийся производным от

MyPoint. Конструктор и деструктор класса ColorPoint, вызывает конструктор и деструктор MyPoint соответственно. Class MyPoint

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

143

Page 144: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Public х As Double

Public у As Double

координата вектора no X

координата вектора no Y

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

144

Page 145: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

145

Page 146: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Public Function MySum( A As MyPoint ) As MyPointSet MySum = New MyPoint( 0,0 ) MySum.x =

A.x + Me.x MySum .у = A^ + Me . у

End Function

Public Function MyScal( A As MyPoint ) As Double

MyScal = A.x * Me.x + А.у * Me.у End

Function

Sub New( xl As Double, yl As Double ) x = x1

у = y1

Print "Вызов конструктора для MyPoint"

End Sub Sub Delete

Print "Объект MyPoint с координатами по X=" & Str ( x ) "

Y=" & Str( у ) & " будет удален"End Sub

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

146

Page 147: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

End Class

Class ColorPoint As MyPoint

Public Color As String

Sub New( x2 As Double, y2 As Double, z As String ) ,

MyPoint( x2, y2)

Color = z

Print "Вызов конструктора для ColorPoint" End

Sub Sub Delete

Print "Объект ColorPoint с координатами no X=" & Str( x ) & " Y="

& Str( у ) & " и Color =" & Color & " будет удален"

End Sub End Class

Dim Pointl as ColorPoint

Set Pointl = New ColorPoint( 2,3, "Красный" ) 'выводит Вызов

конструктора для MyPoint 'выводит Вызов конструктора для ColorPoint

Print Pointl.x "выводит 2

Print Pointl.у 'выводит 3

Print Pointl.Color 'выводит Красный Delete Pointl

'выводит Объект ColorPoint с координатами по Х=2 Y=3 и 'Color =

Красный будет удален

'выводит Объект MyPoint с координатами по Х=2 Y=3 будет удален

В приведенном примере мы принудительно, с помощью оператора Delete (не путать с деструктором класса) удалили экземпляр класса с именем Pointl. LotusScript сам бы удалил данный объект, после того как необходимость в нем бы отпала. Оператор Delete удаляет объект даже в случае, если еще имеются переменные, ссылающиеся на удаляемый объект. После выполнения оператора эти ссылки приобретают значение Nothing. Оператор имеет следующий синтаксис:

De le te __________идентификатор ссылки на объект

Применение оператора вызывает соответствующий деструктор класса (если он имеется). Для объектов, являющихся производными классами, после вызова собственного деструктора последовательно вызываются деструкторы классов-предков, начиная с прямого предка текущего класса до самого верхнего уровня.

Для встроенных классов результат применения оператора Delete зависит от конкретного класса. В некоторых случаях происходит удаление ссылки на объект, но не самого объекта. Например, такой результат будет, если оператор Delete применить к ссылке на объект NotesDatabase. Сама база данных удалена не будет (для этого у данного класса существует метод Remove).

Автор данных строк столкнулся на практике с ситуацией, когда применение оператора Delete было необходимо. Передо мной стояла задача физически удалить текущий документ, открытый в рабочем пространстве, и уже сохраненный на диске. Для этого я попытался воспользоваться методом Remove класса NotesDocument, предварительно получив ссылку на этот объект из класса NotesUIDocument. В документации про метод Remove сказано, что если объект NotesDocument был получен через свойство Document объекта NotesUIDocument, то результатом работы метода Remove будет сообщение об ошибке. Там же предлагалось такое решение: получить по свойству Document объекта NotesUIDocument ссылку на NotesDocument, с помощью свойства UniversallD класса NotesDocument взять UNID документа, затем методом Close закрыть объект NotesUIDocument, заново по UNID через метод GetDocumentByUNID классаNotesDatabase получить ссылку на нужный объект NotesDocument, и, наконец, удалить его методом Remove. Однако даже данный способ все равно приводит к той же ошибке на стадии выполнения. Решение было достигнуто только в случае, когда перед получением ссылки на NotesDocument через метод GetDocumentByUNID, выполнялся оператор Delete для объекта NotesDocument, полученного с помощью свойства Document объекта NotesUIDocument. Попытки присваивание старой ссылке другого значения - результата не приносили. Ниже приводится пример скрипта, который

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

147

Page 148: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

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

Пример. Демонстрирует применение оператора Delete в случае удаления документа, открытого в рабочем пространстве (документ не новый).

Dim ws As New NotesUIWorkspace

Dim uidoc As NotesUIDocument

Dim doc As NotesDocument, docl As NotesDocument

Dim db As NotesDatabase

Dim unid As String

Set uidoc = ws .CurrentDocument

Set doc = uidoc.Document

Unid = doc.UniversalID

Set db = doc.ParentDatabase

Call uidoc.close

Delete doc 'без этого оператора скрипт не работает

Set doc = db.GetDocumentByUNID( Unid ) fig

= doc.Remove) True )

LotusScript автоматически управляет процессом очистки памяти, занимаемой объектами, от "мусора". При создании объекта LotusScript генерирует внутреннюю переменную-счетчик, значение которой есть число ссылок на данный объект (сразу после создания объекта она равна 1). При установлении новой ссылки на объект - переменная-счетчик увеличивается на единицу. Когда переменная-ссылка выходит за границы свой области видимости, то переменная-счетчик уменьшает свое значение на 1. Значение 0 у переменной-счетчика служит сигналом LotusScript для удаления ассоциированного с ней объекта из памяти.

1.6.2 Получение доступа и работа с членами класса

Все члены класса (как переменные, так и процедуры) могут иметь область видимости либо Public, либо Private. Первая опция позволяет ссылаться на члены класса и вне его контекста, вторая - соответственно запрещает. По умолчанию для переменных членов класса назначена опция области видимости Private, а для процедур - Public. Данное правило считается хорошим стилем в объектно- ориентированном проектировании. Таким образом, только процедуры класса могут манипулировать с переменными членами класса, вне контекста класса данные переменные не видны, и не могут быть "испорчены" другими процедурами. Такой механизм в объектно-ориентированном проектировании называется инкапсуляцией данных.

Пример. Перепишем пример из предыдущего параграфа так, чтобы соблюдались правила инкапсуляции данных.

Class MyPoint

х As Double 'координата вектора по X

у As Double 'координата вектора по Y

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

148

Page 149: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Function GetX As Double

GetX = Me.x End

Function Function GetY As

Double

GetY = Me.у End

Function Sub SetX( xl As

Double )

Me .x =

x1 End Sub

Sub Sety( yl As Double )

Me . у =

y1 End Sub

Function MySum( A As MyPoint ) As MyPoint Dim x As New M y P o i n t

( 0 , 0 )

Call x.SetX( A.GetX + Me.GetX )

Call x.SetY( A.GetY + Me.GetY ) Set

MySum = x End Function

Function MyScal( A As MyPoint ) As Double

MyScal = A.GetX * Me.GetX + A.GetY * Me.GetY End

Function

Sub New( x1 As Double, y1 As Double ) Me.x =

x1 Me.у = yl End Sub Sub Delete

Print "Объект с координатами по Х=" & Str ( Me.x ) 11

Y=" & Str ( Me. у ) & " будет удален"

End Sub End Class

Dim Point1 as MyPoint, Point2 as MyPoint, Point3 as MyPoint

Set Point1 = New MyPoint( 2, 3 )

Print Point1.GetX 'выводит 2

Print Point1.GetY 'выводит 3

Call Point1.SetX( -1 )

Print Point1.GetX 'выводит -1

Set Point2 = New MyPoint( 2 ,4 )

Set Point3 = Point1.MySum( Point2 )

Print Point3.GetX 'выводит 1

Print Point3.GetY 'выводит 7

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

149

Page 150: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print Point1.MyScal( Point2 ) 'выводит 10

Для групповых операций с членами класса вне его контекста может использоваться оператор With End With. Он имеет следующий синтаксис:

Wi th ссылка на объект

[ группа операторов ] End Wi th

где:

ссылка_на объект представляет собой выражение, значение которого есть ссылка на объект. Например,

это может быть вызов функции, которая возвращает значение Variant, содержащее ссылку на объект;

группа операторов любые допустимые операторы LotusScript. В рамках этих операторов доступ к членам

объекта, на который ссылается ссылка на объект может осуществляться в следующей нотации:

. имя члена объекта

Допускается использование вложенных операторов With ... End With. Максимальная глубина вложения 16. Не допускается вход в группуоператоров по оператору безусловного перехода. Присваивание ссылке_на_объект другого значения в группе операторов не влечет за собой смены объекта, к которому применяются операторы в нотации .имячленаобъекта. Иными словами, для такой нотации до конца оператора With объект остается в памяти в состоянии до переприсваивания ссылки на него. По выходу из оператора With объект, соответствующий старой ссылке, будет утерян. Для операторов в нотации имяобъекта.имячленаобъекта действия в теле оператора будут применяться к соответствующим объектам (см. пример). Авторы не рекомендуют применять на практике эти механизмы, хотя бы из соображений "читабельности" скрипта.

Пример. Демонстрирует применение оператора With ... End With. Class

MyPoint

Public x As Double ' координата вектора no X

Public у As Double 'координата вектора no Y

Public Function MySum( A As MyPoint ) As MyPoint Set MySum = New MyPoint MySum.x = A.x + Me.x

MySum .у = А.у + Me . у End Function

Public Function MyScal( A As MyPoint ) As Double

MyScal = A.x * Me.x + А.у * Me^ End

Function End Class

Dim Pointl as New MyPoint, Point2 as New MyPoint Dim Point3

as New MyPoint With Pointl .x = 2 .y = 3

Print "X=" & Str( .x ) & " Y=" & Str( .y ) 'выводит X=2 Y=3

End With With Point2 .x = -1 .У = 4

Print "X=? & Str( .X ) & " Y=" & Str( .y )

'выводит X=-l Y=4 Set Point3 = .MySum( Pointl )

Print .MyScal( Pointl ) 'выводит 10 End With

Print "X=" & Str(Point2.x ) & " Y=" & Str( Point2.y )

'выводит X=-l Y=4 With Point3

Print .x ' выводит 1

Print .у ' выводит 7

Set Point3 = Point2

'дальнейшие операторы будут выполняться для нотации:

' .имя_члена_класса для о б ъ е к т а ( 1 , 7 )

' имя объекта.имя_ члена_класса для соответствующего объекта Print

"Х=" & Str(Point3.х ) & " Y=" & Str( Point3.y ) 'выводит X=-l Y=4

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

150

Page 151: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print "X=" & Str(.x ) & " Y=" & Str( .y ) 'выводит X=1 Y=7

Print .MyScal( Pointl ) 'выводит 23

Print Point3.MyScal( Pointl ) 'выводит 10 End With

Print "X=" & Str(Point3.x ) & " Y=" & Str( Point3.y ) 'выводит X=-

l Y=4

1.6.3 Механизмы наследования классов

Как уже упоминалось, с помощью механизмов наследования разработчики могут определять новые классы на основе ранее разработанных базовых классов. Такая необходимость обычно возникает, когда требуется добавить в существующий класс недостающие переменные члены класса, или добавить/изменить методы класса. При этом производный класс имеет прямой доступ ко всем членам базового класса (как к Public, так и к Private) кроме деструктора базового класса.

Для переопределения ("перезагрузки") метода производного класса необходимо, чтобы заголовок переопределяемого метода в производном классе в точности совпадал с заголовком одноименного метода в базовом классе. Под заголовком здесь понимается имя метода со списком его формальных параметров, которые должны однозначно совпадать с переопределяемым методом базового класса.

Иногда бывает необходимо при перезагрузке метода в производном классе сначала вызвать одноименный метод базового класса. В этом случае применяется двухточечная нотация: имябазовогокласса.. имячленакласса.

Пример. Демонстрирует механизмы наследования. Класс NewPoint является производным от MyPoint. В производном классе метод MySum перезагружается полностью, а метод MyScal предварительно вызывает одноименный метод базового класса.

Class MyPoint

Public х As Double 'координата вектора по X

Public у As Double 'координата вектора по Y

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

151

Page 152: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Sub MySum( A As Variant,zl As Variant) z1.x = A.x +

Me.x z1.y = А.у + Me.у

End Sub

Function MyScal( A As Variant ) As Double

MyScal = A.x * Me.x + А.у * Me^

End Function

Sub New( x1 As Double, y1 As Double ) Me .x = x1 Me .у =

y1 End Sub End Class

Class NewPoint As MyPoint

Public z As Double 'координата вектора no Z

Sub MySum( A As Variant,z1 As Variant) z1.x = A.x + Me.x

z1.y = А.у + Me.у z1.z = A.z + Me.z

End Sub

Function MyScal( A As Variant ) As Double

MyScal = MyPoint..MyScal( A ) + A.z * Me.z End

Function

Sub New( x1 As Double, y1 As Double, z1 As Double )

MyPoint( x1, y1 ) Me.z = z1 End Sub End Class

Dim Pointl As MyPoint, Point2 As Variant Dim Point3 As

Variant

Dim ZPointl As NewPoint, ZPoint2 As Variant

Dim ZPoint3 As Variant

Set Pointl = New MyPoint( 2, 3 )

Set Point2 = New MyPoint( -1, 4 )

Set Point3 = New MyPoint( 0, 0 )

Call Pointl.MySum( Point2, Point3 )

Print Point3.x 'выводит 1

Print Point3.y 'выводит 7

Print Pointl.MyScal( Point2 ) 'выводит 10

Set ZPointl = New NewPoint( 2, 3, 4 ) Set ZPoint2 =

New NewPoint( -1, 4, 2 )

Set ZPoint3 = New NewPoint( 0, 0, 0 ) Call ZPointl.MySum(

ZPoint2, ZPoint3 )

Print ZPoint3.x 'выводит 1

Print ZPoint3.y 'выводит 7

Print ZPoint3.z 'выводит 6

Print ZPointl.MyScal( ZPoint2 ) 'выводит18

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

152

Page 153: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

153

Page 154: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

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

класса применения механизма наследования ссылку на производный класс, если

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

154

Page 155: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

формальный параметр был объявлен как объект базового класса. Обратное не верно. Запрещается передавать ссылку на базовый класс, если формальный параметр был объявлен как объект производного класса.

Аналогичное правило справедливо и для переменных ссылок на экземпляры классов. Переменной, содержащей ссылку на базовый класс, можно присвоить значение переменной, содержащей ссылку на производный класс. Но запрещается переменной, содержащей ссылку на производный класс, присваивать значение переменной, содержащей ссылку на базовый класс.

1.6.4 Работа с переменными ссылками на объекты

Переменные ссылки на объект используются для: создания на основе описания класса его экземпляра (объекта), работы с компонентами объекта и удаления объекта. Поведение таких переменных аналогично поведению переменных других типов. Отличие заключается в том, что значение таких переменных есть не сам объект, а 4-х байтовый указатель на место, в котором объект хранится в памяти компьютера.

LotusScript позволяет просто объявить переменную типа ссылки на объект без создания непосредственно объекта. Для данной операции используют следующий синтаксис:

Dim ссылка на объект As имя класса

После выполнения такого оператора произойдет инициализация переменной ссылканаобъект значением Nothing.

Для создания экземпляра класса на основе его описания, как уже упоминалось, необходимо использовать ключевое слово New совместно с оператором Dim, или Set. Оба оператора кроме создания объекта выполняют еще и операцию присваивания переменной ссылки на этот объект. Для оператора Dim в этом случае используется следующий синтаксис:

Dim ссылка_на_объект As New имя_класса

[( список_аргументов_конструктора)]

Данный синтаксис нельзя использовать для объявления и создания массива или списка переменных типа ссылок на объекты. В этом случае (и не только) применяют оператор Set. Оператор Set имеет три синтаксические формы:

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

Второй тип синтаксиса копирует значение существующего указателя на объект из переменной ссылка_на_объект2 в переменную ссылке_на_объект1. При этом копирования самого объекта не происходит. Переменная ссылка на_объект1 может иметь тип ссылки на одноименный или производный объект, на который ссылается ссылка_на_объект2, а также тип Variant, или другой тип, ссылающегося на объект (например, элементами массива или списка, а также определяемые пользователем типы данных). Ссылка на_объект2 может содержать значение Nothing, быть ссылкой на одноименный, производный или базовый класс по отношению к ссылке на_объект1.

Третья синтаксическая форма используется для "связывания" переменной с указанным объектом, например, встроенным объектом продукта конкретной реализации LotusScript. Такая связь существует либо до тех пор пока

Set ссылка_ на объект = New имя класса

[( список_аргументов_конструктора)]

Set ссылка_ на_ объект1 = ссылка_на_объект2

Set ссылка_ на объект = Bind [ имя_класса_продукта ] ( имя_объекта )

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

155

Page 156: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

переменная ссылка_на_объект не вышла за пределы своей области видимости, либо пока ей не присвоили другого значения, либо до тех пор пока объект с именем имя_объекта еще существует.

Имяклассапродукта необязательный параметр, который определяет имя встроенного класса для объекта с именем имяобъекта. Если имя класса продукта опущено, то считается, что объект с именем имя_объекта есть экземпляр того же самого класса, на который ссылается переменная ссылканаобъект. В случае, когда переменная ссылка на объект имеет тип Variant - указание имени_класса_продукта необходимо.

Имяобъекта должно быть строковым выражением, значение которого представляет имя, и возможно путь к классу имя класса продукта в виде "имя_окна_приложения\имя_объекта" Конкретная синтаксическая форма этого параметра зависит от реализации LotusScript.

ЗАМЕЧАНИЕ: форма оператора Set с ключевым словом Bind не должна использоваться для "связывания" переменных с объектами Lotus Notes\Domino, т.к. последний делает это неявно.

Пример. Демонстрирует работу с переменными ссылками на объекты.

Class MyPoint

Public х As Double 'координата вектора по X

Public у As Double 'координата вектора по Y

Sub New( xl As Double, yl As Double ) Me.x = xl Me . у = yl End Sub

End Class

Dim Pointl As New MyPoint (1, 3 ) , Point2 As Variant Dim Point3 As

MyPoint,Point4 As Variant

Dim Point5( l To 3 ) As MyPoint 'объявляется массив ссылок

Dim i As Integer Set Point2 = Pointl

'копируется значение ссылки Pointl в переменную Point2 For i

= l To 3

Set Points ( i ) = New MyPoint( i A2 , i A 3 ) 'заполняется значениями массив ссылокNext i

Set Point3 = New MyPoint( 4, 5 ) 'вторая синтаксическая форма

оператора Set

В LotusScript существуют два оператора выполнения операций и одна функция, которые оперируют с переменными ссылками на объекты. Оператор Is сравнивает две переменные ссылки на объекты, и имеет следующий синтаксис:

ссылка на объект 1 Is ссылка на объект2

где:

ссылка_на_объект1 и ссылка на_объект2 представляют собой выражения, значение которых есть ссылки на объекты. Оператор возвращает значение True, если обе переменные ссылки указывают на один и тот же объект, или если обе ссылки имеют значение Nothing. В противном случае возвращаемое значение есть False. Оба операнда могут быть переменными типа Variant, переменными типа ссылки на конкретные объекты, константами Nothing, или переменными других типов, ссылающихся на объекты (например, элементами массива или списка, а также определяемые пользователем типы данных).

Если хотя бы один из операндов оператора Is имеет тип Variant и значение отличное от ссылки на объект, то результатом работы Is будет сообщение об ошибке "Type mismatch" (смешение типов данных).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

156

Page 157: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Оператор IsA определяет на какой конкретный класс ссылается переменная ссылка на объект, и имеет следующий синтаксис:

ссылка на объект IsA имя объекта

где:

ссылка на объект представляют собой выражение, значение которого есть ссылка на объект, а имя объекта строковое выражение, значение которого соответствует имени класса видимого в текущей области видимости. Оператор возвращает значение True, если переменная ссылка на объект ссылается на объект с именем имя объекта. В противном случае возвращаемое значение есть False. Тип данных переменной ссылки на объект такой же, как и у оператора Is.

По аналогии с оператором Is для IsA в случае, когда ссылка на объект имеет тип Variant и значение отличное от ссылки на объект, то выдается сообщение об ошибке "Variant does not contain an object" (переменная типа Variant не содержит ссылку на объект). Для избежания ошибок такого типа рекомендуется применять функцию IsObject.

Функция IsObject проверяет, является ли значение выражения ссылкой на некоторый объект, и имеет следующий синтаксис:

l sObjec t ( выражение)

где:

выражение - любое допустимое выражение LotusScript. Функция возвращает значение True, если значение выражения есть или ссылка на некоторый объект, или Nothing. В противном случае возвращаемое значение есть False.

ЗАМЕЧАНИЕ: функция не поддерживается на операционных платформах OS/2, Unix и Macintosh.

Пример. Демонстрирует применение операторов Is, IsA и функции IsObject. Class

MyPoint

Public x As Double 'координата вектора по X

Public у As Double 'координата вектора по Y

Sub New( xl As Double, yl As Double ) Me.x

= xl Me .у = yl End Sub

1.7 Определяемые пользователем типы данных

Подобно классам, пользовательские типы данных представляют собой комбинированный тип данных, который может состоять из переменных различных типов. Однако в отличие от классов, типы данных, определяемые пользователем, не содержат процедур для обработки этих данных. Не применимы к пользовательским типам данных и механизмы наследования. LotusScript разрешает оперировать только с компонентами пользовательского типа, а не с типом целиком. И наконец последнее отличие состоит в том, что переменные, ссылающиеся на класс, содержат в себе

End ClassDim Pointl As New MyPoint ( 1, 3 ),Point2 As

Dim Point3 As MyPoint,Point4 As Variant

Print Pointl Is Point3 'выводит False

Set Point2 = Pointl

Print Pointl Is Point2 'выводит True

Print Pointl Is Nothing ' выводит False

Print Point3 Is Nothing ' выводит True

Print Pointl IsA "Point" ' выводит False

Print Point3 IsA "MyPoint" ' выводит True

Print IsObject( Point2 ) ' выводит True

Print IsObject( Point3 ) ' выводит True

Print IsObject( Point4 ) ' выводит False

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

157

Page 158: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

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

В BASIC-подобных языках механизм определяемых пользователем типов данных часто используется при работе с СУБД, операциях файлового ввода/вывода и печати. Указанный механизм позволяет группировать вместе разнотипные (но обычно связанные между собой) данные в одной переменной. Для объявления нового, определяемого пользователем типа данных используется следующий синтаксис:

[ опция области видимости ] Туре имятипаданных

объявлениепеременных

End Type

где:

• опция области видимости может быть либо Pub l i c , или Pr i va te . Опция Pub l i c дает возможность

использовать тип данных и вне модуля, в котором он был определен, до тех пор пока модуль с его

определением остается загруженным в память компьютера. Опция Pr i va te разрешает использовать тип

данных только в пределах модуля с его определением. По умолчанию используется опция Pr i va te .

Опцию области видимости типа Pub l i c разрешается применять только на уровне модуля;

• тип данных задает идентификатор, по которому возможно будет создать реальную переменную с

составляющими согласно данного описания. Запрещается в качестве типа данных использовать

идентификатор Object;

• объявление переменных содержат операторы явного объявления входящих в данный тип данных

переменных. Типы данных этих переменных могут быть любого скалярного типа, Variant, массивов

фиксированной длины, и других объявляемых пользователем типов данных (за исключением текущего

пользовательского типа данных). Переменные, объявленные как Variant, могут в дальнейшем содержать

значения любого скалярного типа, массивов динамических или фиксированной длины, и ссылки на

объекты. Объявлениепеременных не должно содержать определение констант. Реальное объявление

составляющих переменных типа данных должно идти без указания опции области видимости (LotusScript

автоматически присваивает им опцию типа Public). Объявление каждой переменной члена класса типа

данных начинаться с новой строки (т.о. запрещается давать объявление переменных в виде списка,

элементы которого разделяются запятыми). Имена переменных членов пользовательского типа данных

могут совпадать с зарезервированными ключевыми словами, за исключением: Rem. Авторы рекомендуют

не применять данное правило на практике, хотя бы из соображений "читабельности"скрипта.

Если в пользовательский тип данных входит как компонент другой определяемый пользователем тип данных, то последний должен быть объявлен раньше, чем текущий тип данных. В противном случае на шаге компиляции генерируется сообщение об ошибке: "Reference appears before declaration" (ссылка появилась перед объявлением).

Для экземпляра пользовательского типа данных, содержащего переменные Variant, имеющие значения не скалярных типов данных (массивы, списки и объекты), должны соблюдаться следующие правила:

• запрещается присваивать содержимое типа, в составляющих которого имеются динамические массивы

или списки, другому экземпляру типа;

разрешается присваивать содержимое типа, в составляющих которого имеются объекты, другому

экземпляру типа. LotusScript автоматически увеличит на единицу счетчик числа ссылок на объект.

При объявлении переменной с типом соответствующим пользовательскому типу данных происходит инициализация переменных членов экземпляра типа. Начальные значения, входящих в тип переменных, аналогичны одиночным переменным того же типа (числовые - 0, Variant - Empty, и т.д.). Если в пользовательский тип данных входит другой определяемый пользователем тип, то процесс инициализации повторяется и для него.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

158

Page 159: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Для операций со значениями членов пользовательского типа данных применяют следующий синтаксис:

имя_экземпляра_типа. имя_члена_типа

В данном контексте допускается любое число пробелов и табуляций и справа, и слева от символа точки. Если значение члена типа есть массив, то разрешается указывать индексы в именичленатипа

Для оптимизации пространства, занимаемого экземпляром пользовательского типа данных, рекомендуется при создании описания типа данных составляющие размещать в порядке убывания их размера в байтах. Т.е. самые большие в самом верху описания, а наименьшие внизу. При равенстве размеров порядок безразличен.

Пример. Демонстрирует применение пользовательских типов данных. Type

Department

Name As String * 32

Town As String * 32 End Type

Type People

Fio As String * 32 Job As

String * 16 Salary As

Currency Dept As Department

End Type

Dim Deptl As Department, Pepll As People Dim FileNum As Integer

FileNum% = FreeFile

Open "C:\People.txt" For Random As FileNum% Len=Len( Pepll )

Deptl.Name = "Отдел продаж"

Deptl.Town = "Москва"

Pepll.Fio = "Иванов И.И."

Pepll.Job = "Продавец"

Pepll.Salary = l234.56

Pepll.Dept = Deptl

Put #FileNum%, l, Pepll

Deptl.Name = "Администрация"

Deptl.Town = "Лондон"

Pepll.Fio = "Джон Смит"

Pepll.Job = "Президент"

Pepll.Salary = 9999.99

Pepll.Dept = Deptl Put

#FileNum%, 2, Pepll

Seek fileNum%, l 'перемещаем указатель на начало файла

Do While Not Eof( fileNum% ) 'цикл пока в файле есть записи

Get #fileNum%, , Pepll 'считываем запись, указатель файла

* запрещается записывать содержимое типа, в составляющих которого имеются динамические массивы,

списки или объекты, в файл с использованием оператора Put;

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

159

Page 160: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

'позиционируется на следующую запись

Print Pepll.Fio, Pepll.Job, Pepll.Salary, _ Pepll.Dept.Name,

Pepll.Dept.Town

'печатаем необходимые показатели записи

Loop

Close FileNum%1.8 Встроенные операторы и функции LotusScript

Функции и операторы LotusScript новые или модифицированные в Domino версии 6.0-8.0, "отмечены в заголовках значком" ©,© и О

1.8 .1 Числовые и тригонометрические функции 1 .8 .1 .1 Числовые функцииФункция Abs

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

160

Page 161: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Вычисление абсолютных значений.

Print Abs (l2) '

Print Abs (-l2) '

Print Abs (l3 - 25) '

Print Typename(Abs (-l2)) ' Dim someV As

Variant someV = "l23"

Print Abs(someV) ' someV = Null

Print Abs(someV) ' someV = " qwerty"

Print Abs(someV) '

выводит l2

выводит l2

выводит l2

выводит INTEGER

выводит l23

выводит Null

Ошибка "Type mismatch"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

161

Page 162: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

162

Page 163: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция ЕхрСинтаксис: Ехр ( numExpr)Тип возвращаемого значения: Double.Параметры: n u m Ex p r -ч и сл о в о е выражение.

Вычисляет значение e в степени, равной значению числового выражения numExpr. Если значение выражения numExpr превышает 709.78, то возникает ошибка переполнения (ошибка с кодом 6 - "Overflow") на стадии компиляции скрипта. Тип возвращаемого значения - Double. Ехр - функция, обратная функции Log.

Пример.

Print Ехр(l) ' Выводит 2.7l828l82845905

Print Ехр(2) ' Выводит 7.38905609893065

Print Ехр(800) ' Ошибка "Overflow"

Функция F ix

Возвращает значение целой части числового выражения numExpr.

Тип возвращаемого значения определяется типом выражения numExpr.

Для неотрицательного значения выражения numExpr, функция Fix возвращает ближайшее целое число, меньшее или равное значению выражения. Для отрицательного значения выражения numExpr функция Fix возвращает ближайшее целое значение, большее или равное значению аргумента. Другими словами, берется целая часть модуля числа и дополняется знаком.

Результаты выполнения функций Fix и I nt различаются между собой. Значение, возвращаемое функцией I nt, всегда меньше или равно аргументу.

Синтаксис: F ix ( numExpr)Тип возвращаемого значения:

numExpr Возвращаемое значениеNull

Variant, содержащее строку, определяющую число Double

Variant, содержащее строку, не определяющую число Возникает ошибка

Variant, содержащее значение дата-время Часть, определяющая датуПараметры: numExpr- числовое выражение.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

163

Page 164: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Frac t ion

Возвращает дробную часть числового выражения numExpr.

Тип данных значения, возвращаемого функцией Fraction, соответствует типу данных числового выражения numExpr.

Пример. Вывод дробной части числа PI

Print Fraction(PI) ' выводит: .141592653589793 Dim someV As Variant someV = 123.456

Print Fraction(someV) ' выводит: .456000000000003

someV = "123,456"

Print Fraction(someV), Typename(Fraction(someV))

' выводит: . 456000000000003 DOUBLE

Print Fraction(Now) ' выводит: 1:44:31 someV = " qwerty"

Print Fraction(someV) ' Ошибка "Type mismatch"Функция Hex (преобразовать в 16 -ричный вид)

Синтаксис: Нех[$ ] ( питЕхрг)Тип возвращаемого значения: Hex - возвращает Variant of DataType 8 (String)

Hex$ - String.Параметры: numExpr-числовое выражение.

Возвращает щестнадцатеричное представления числового выражения питЕхрг в виде строки. Если значением numExpr является число с дробной частью, то это число округляется до ближайшего целого значения перед преобразованием в 16-ричную форму. Значение, возвращаемое функцией Hex, имеет тип Variant, содержащий строку (Variant DataType 8). Значение, возвращаемое функцией Нех$ имеет тип String. Возвращаемое значение может содержать только символы 0-9 и A-F и его максимальная длина - 8 символов.

Пример. Использование функций Fix и Int.Dim xF As Integer , yF As Integer

Dim xT As Integer , yT As Integer

xF% = Fix(-98.8)

yF% = Fix(98.2)

xT% = Int(-98.8)

yT% = Int(98.2)

Print xF%; yF% 1 выводит: -98 98

Print xT%; yT% ' выводит: -99 98

Синтаксис: Frac t ion ( n u m E x p r ) Тип возвращаемого значения:numExpr Возвращаемое значение

Значение типа Integer 0 (нет дробной части)

Null Null

Variant, содержащее строку, определяющую число Double

Variant, содержащее строку, не определяющую число Возникает ошибка

Variant, содержащее значение дата-время Часть, определяющая время

Параметры: n u m Ex p r -ч и сл о в о е выражение.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

164

Page 165: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Если значение выражения numExpr не является значением типа Integer или Long, то LotusScript пытается преобразовать это значение к типу Long. При невозможности выполнить преобразование типа LotusScript выдает ошибку с кодом 6 - "Overflow".

Пример 1. Преобразование типа аргумента из типа Double в тип Long. Print

Нех$(15) ' выводит "F"

Print Нех$(13.0) ' выводит "D"

Пример 2. Округление значения аргумента типа Double, приведение типа аргумента к типу Long (значение, равное 14.841, округляется до 15.0, преобразуется в 15).

Print Нех$(15.3) ' выводит "F"

Print Нех$(15.3 * .97) ' выводит "F"

Пример 3. Переполнение

Dim someV as Variant someV = 1e+50

Print Hex$(someV) ' ошибка "Overflow"

Функция In t (ближайшее целое)

Синтаксис: In t ( numExpr)Тип возвращаемого значения: тип данных выражения numExpr определяет тип данных значения, возвращаемого функцией. Если аргумент не является числовым, тип

Возвращает ближайшее целое значение числового выражения numExpr, меньшее или равное его исходному значению.

Значение, возвращаемое функцией Int, всегда меньше или равно значению выражения numExpr. Для отрицательного аргумента результаты функции Fix и Int отличаются (Fix просто отбрасывает дробную часть в значении выражения numExpr).

Пример. См. пример использования функции Fix.Функция Log (натуральный логарифм) Синтаксис: Log (numExpr) Тип возвращаемого значения:

Double. Параметры: numExpr -числовое выражение.

Возвращает значение натурального логарифма числа, являющегося значением выражения numExpr.

Параметр numExpr - положительное, числовое выражение. Функция Log возвращает значение типа Double.

numExpr Возвращаемое значение

Null Null

Variant, содержащее строку, интерпретируемую, как число Double

Variant, содержащее строку, не интерпретируемую, как число Ошибка Type mismatch"

Параметры: numExpr- числовое выражение.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

165

Page 166: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Оператор Randomize (инициализация генератора случайных чисел) Синтаксис: Randomize [ numExpr] Параметры: numExpr -числовое выражение.

Выполняет начальную установку (инициализацию) генератора случайных чисел перед его вызовом (функция Rnd).

Параметр numExpr - числовое выражение. Если оно пропущено, используется значение, возвращаемое функцией Timer.

Данная функция обязательно должна быть вызвана перед первыми вызовами функции Rnd.

Генератор случайных чисел LotusScript на самом деле является генератором псевдослучайных последовательностей. Если генератор инициализируется каждый раз одним и тем же числом, то результатом последовательного вызова функции Rnd является одна и та же последовательность чисел. Для того, чтобы последовательности были разные необходимо либо самостоятельно позаботиться о "случайности" инициализирующего числа, либо вызывать функцию Randomize без аргумента и, тем самым, использовать значение системного таймера.

Функция Rnd (генерация случайного числа) Синтаксис: Rnd [ ( numExpr) ] Тип возвращаемого значения: Single. Параметры: numExpr- числовое

выражение.

Генерирует значение случайной величины, равномерно распределенной в интервале от 0 до1. Параметр numExpr - числовое выражение. Возвращаемое функцией значение является числом типа Single.

Следующая таблица демонстрирует действие функции Rnd, в зависимости от знака выражения numExpr.

Для начальной установки данных для оператора генерации случайных чисел Rnd используется оператор Randomize. Для вызова оператора Rnd без аргументов можно использовать одну из двух форм записи: Rnd или Rnd().

Пример 1. Генерация случайных чисел с использованием и без использования оператора Randomize перед вызовом оператора Rnd.

Randomize -1

Пример. Логарифм по основанию, отличному от натурального 'Функция вычисления логарифма числа по

основанию 10 Function Log1O (inVal As Single) As Single Log10 = Log (inVal!) / Log (10)End FunctionPrint Log10 (10) ' Выводит: 1

Print Log10 (100) ' Выводит: 2

Print Log10 (1 / 100) ' Выводит: -2

Print Log10 (1) 1 Выводит: 0

Знак numExpr Действие Rnd

Положительный Возвращает следующее случайное число из генерируемой последовательности.

Нуль (0) Возвращает последнее сгенерированное случайное число.

Отрицательный Генератор случайных чисел повторно инициализируется значением numExpr. Rnd возвращает первое число из соответствующей последовательности случайных чисел.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

166

Page 167: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print Rnd(); Rnd(); Rnd(); Rnd(); Rnd()

1 Выводит: ,8870306 ,6543303 ,3679346 ,3214847 l,687768E-02 Randomize -1

Print Rnd(0) ' Выводит: ,8886549

Print Rnd(); Rnd(); Rnd(); Rnd(); Rnd()

' Выводит: ,8870306 ,6543303 ,3679346 ,3214847 l,687768E-02 Print Rnd(-1) '

Выводит: ,888654 9 Print Rnd(-2); Rnd(0)

Пример 2. Альтенатива обычному генератору случайных чисел. Левая половина уникального идентификатора документа Notes (UNID) является случайным числом. Опыт показывает, что одинаково равномерно распределены все части первой половины UNID - и все 16 символов, и первые 8, и вторые 8, и вторые 4 и т.д. Далее приводятся графики с распределениями случайных чисел, полученных с помощью функции Rnd() и из UNID. Как видно из графиков, составляющие уникального идентификатора документа являются достойной альтернативой стандартному генератору случайных чисел.

В примере измерено 10000 исходов, полученных следующими способами: 'Случайное

число от 0 до 255 как результат функции Rnd() Value = Round (Rnd*255,0)

'Случайное число от 0 до 255 из 1-го байта (первые 2 символа) UNID Value =

Abs (Val (" &H" +Left$(doc.UniversallD, 2)))

Графики - диаграммы MS Excel 97. Огибающие - линии тренда (скользящее среднее).

Распределение случайных чисел, полученных вызовом Rnd()

Распределение случайных чисел - первого байта (первые два символа) уникального идентификатора документа

Распределение случайной величины "1-ый байт UNID"

Распределение случайной величины "функция Rnd"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

167

Page 168: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Round (округлить число)Синтаксис: Round (numExpr, places) Тип возвращаемого значения: Double. Параметры: numExpr-числовое выражение.

places - числовое выражение.

Округляет число до указанного количества десятичных цифр после запятой. Первый параметр питЕхрг - округляемое число - числовое выражение. Второй параметр places - числовое выражение, определяющее количество значащих цифр в числе после округления. Если значение этого выражения не является целым числом, то оно преобразуется в целое число. Функция Round возвращает значение типа Double.

Если первый незначащий разряд исходного числа равен 5, и все следующие за ним разряды числа равны 0, то последний значащий разряд округляется до ближайшего четного значения. Если places - отрицательное число, то исходное число округляется до числа, представляемыми цифрами слева от десятичной точки.

Функция Sgn (Знак числа)Синтаксис: Sgn ( numExpr)Тип возвращаемого значения: Integer. Параметры: numExpr- числовое выражение.

Определяет знак числа, заданного числовым выражением numExpr. Если numExpr меньше 0, возвращает -1, равно 0 - возвращает 0, больше 0 - возвращает 1.

Пример. Использование функции Sgn для определения знака числа. Dim х As

Integer, у As Integer x% = Sgn(-45)

Print x% * Выводит -1

y% = Sgn(12)

Print y% ' Выводит 1

Print Sgn(x% + у%) 1 Выводит 0

Пример 1. Округление до одной цифры после десятичной точки

Print Round(4.23, 1) ' Выводит 4.2

Print Round(4.35, 1) ' Выводит 4.4

Print Round(4.45, 1) ' Выводит 4.4

Пример 2. Округление до целого значения.

Print Round(153.33 , -2) ' Выводит 200

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

168

Page 169: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Sqr (квадратный корень) Синтаксис: Sqr (numExpr) Тип возвращаемого значения: Double. Параметры: numExpr -числовое выражение.

Возвращает значение квадратного корня, извлеченного из значения неотрицательного числового выражения питЕхрг. Возвращаемое значение имеет тип Double. Если numExpr отрицательно, происходит выдается ошибка с кодом 5 - "Illegal function call".

Пример. Извлечение квадратного корня из числа 169.

Dim root As Double root# = Sqr (256)

Print root# ' Выводит 16

Функция Va l (преобразовать строку в число)Синтаксис: Va l ( stringExpr)Тип возвращаемого значения: Double.

Параметры: stringExpr - строка, которая может быть преобразована в число. Возвращает

числовое значение строки.

Параметр stringExpr - строковое выражение, которое LotusScript может преобразовать в числовое значение. Это выражение может содержать следующие символы:

• цифры (0 1 23456789);

• шестнадцатеричные цифры (abcdefABCDEF);

• знак числа (+ -);

• десятичную точку (.);

• экспоненциальные символы (Е, е, D, d);

• префикс числа, не являющегося десятичным числом (&В, &O, &Н);

• символы - суффиксы типа (% & ! # @) Возвращаемое значение имеет тип

Double.

Функция Val игнорирует пробелы, символы табуляции, возврата каретки и перевода строки. Преобразование производится, начиная с первого символа и заканчивается на первом символе, не входящем в приведенный список.

Для строки, не допускающей интерпретации как число, функция возвращает 0.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

169

Page 170: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

При вычислении тригонометрических функций значения угла задаются и вычисляются в радианах. Функции не производят преобразование значений градусной меры угла в радианы. Но подобное преобразование всегда может быть выполнено с помощью встроенной константы - P I : <угол в градусах> = <угол в радианах> * 180 / PI

Примеры использования тригонометрических функций. Dim

rad As Double, degrees As Double

rad# = ACos(O) ' получает значение PI/2

degrees# = rad# * (180 /PI) ' получает значение 90

Print rad#; degrees# ' Выводит 1.5707963267949 90

Dim quad1#, quad2#, quad3#, quad4#

quad1# = ATn2(1, 1)

quad2# = ATn2(-l, 1)

quad3# = ATn2(-1, -1)

quad4# = ATn2(1, -1)

Print quad1# * (180 / PI) ' Выводит 45

Print quad2# * (180 / PI) ' Выводит 135

Пример использования функции Val.

Dim hexVal As Double, streetNum As Double

'Присвоение шестнадцатеричного числа FF (десятичное 255). hexVal# = Val("&HFF")

streetNum# = Val(" 106 Main St.")

Print hexVal#; streetNum# ' Выводит: 255 106 Print Val("ql2w") ' Выводит: 0

1.8 .1 .2 Тригонометрические функции

Следующая таблица представляет набор тригонометрических функций LotusScript.

Функция Синтаксис Примечание

Арккосинус ACos (numExpr) Возвращает значение угла, выраженное в радианах.

Арксинус AS in ( numExpr) Возвращает значение угла, выраженное в радианах

Арктангенс ATn (numExpr) Возвращает значение угла, выраженное в радианах

Арктангенс2 ATn2 (numExprX, numExprY) Возвращает значение угла, выраженное в радианах, образованное осью абсцисс и прямой, проходящей через заданную координатами точку и точку начала координат в декартовой плоскости

Косинус Cos (angle) Значение косинуса угла, имеющее тип Double

Синус Sin ( a n g l e ) Значение синуса угла, имеющее тип Double

Тангенс Tan ( a n g l e ) Значение тангенса угла, имеющее тип Double

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

170

Page 171: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.8 .2 Функции преобразования типов данных

Функция CCur Синтаксис: CCur (expr )Тип возвращаемого значения: Currency.Параметры: exp r - числовое выражение, либо строка, которая может быть преобразована в

число.

Возвращает значение, преобразованное к денежному типу данных (Currency).

Параметр expr - числовое выражение или строковое выражение, которое может быть преобразованов число.

Возвращаемый результат: числовое значение выражения ехрг с 4-мя десятичными знаками после десятичной точки, представляющее денежное значение.

Если expr является строковым выражением, то функция CCur предварительно преобразует строку в число. Если значение строкового выражения expr не преобразуется в число, либо значение слишком велико для типа данных Currency, то функция возвращает ошибку (код 13 - "Type mismatch" и код 6 - "Overflow" соответственно). Если значение выражения expr соответствует EMPTY, то результатом функция CCur вернет значение 0.

Пример. Преобразование к типу Currency значения произведения переменных Num типа Double и IntNum типа Integer. Преобразование к типу Currency значения переменной StrNum, имеющей тип String.

Dim Num As Double, StrNum As String

Dim IntNum As Integer, CurResult As Currency

Dim LargeNum

Num = 7.654345

IntNum = 88

CurResult = Ccur(Num * IntNum)

Print CurResult ' Выводит 673,5824

StrNum = "9,99"

CurResult = Ccur(StrNum)* Num - IntNum

Print CurResult ' Выводит -11,5331

StrNum = "9.99" On Error Resume Next

CurResult = Ccur(StrNum) * IntNum ' Ошибка "Type mismatch"

If Err<>0 Then Print Error$:Err=0 Else Print CurResult ' Выводит "Type mismatch"

LargeNum = 1234567890123456789

CurResult = Ccur(LargeNum) + Num ' Ошибка "Overflow"

If Err<>0 Then Print Error$:Err=0 Else Print CurResult ' Выводит "Overflow"

CurResult=Ccur(EMPTY) Print CurResult 'Выводит 0

Выводит -1351 Выводит -45

Print quad3# * (180 / PI)

Print quad4# * (180 / PI)

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

171

Page 172: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция CDat

Синтаксис: CDat( expr)Тип возвращаемого значения: Vatiant of DataType 7 (DateTime).Параметры: expr- числовое выражение, либо строка, которая может быть преобразована в число.

Для числового или строкового выражения ехрr функция возвращает его значение, преобразованное в формат даты-времени.

Параметр ехрг может быть любым из следующих выражений:

• числовое выражение;

• строковое выражение, допускающее преобразование к числовому;

• строковое выражение, допускающее преобразование к дате-времени.

Возвращаемое значение является значением даты/времени в формате LotusScript. Тип возвращаемого значения - Variant, содержащий дату/время (Variant DataType 7). Если целая часть значения выражения выходит за пределы диапазона от -657434 до 2958465, функция CDat выдает ошибку.

CDat(O) и CDat(Empty) возвращают полночь 30-го декабря 1899 года. При выводе этот результат представляется как "0:00:00" (в предыдущих версиях выводилось как 30.12.1899).

LotusScript хранит дату как 8-байтные значения с плавающей точкой. Целая часть представляет порядковый номер дня начиная от 1-го января 100 года н.э.. Допустимый диапазон значений для целой части: от -657434 до 2958465. Таким образом, максимально возможной датой в LotusScript является 31 декабря 9999 года н.э. Дробная часть значения отвечает за представление времени. Отсутствие дробной части - полночь.

В зависимости от значения выражения ехрг используются следующие правила преобразования в значение дата-время:

если ехрг - числовое выражение, то LotusScript преобразует целую часть в дату, а дробную - в формат

времени, возвращая значение дата/время;

если ехрr - строковое выражение, то LotusScript пытается выполнить преобразование из предположения,

что строка задает либо "человеческое" представление даты/времени (преобразование производится

сразу), либо допускает преобразование в число (тогда к дате/времени преобразуется число, полученное

после преобразования строки);

если ехрr - строковое выражение, но преобразование значения выражения к числу или дате/времени

невозможно - выдается ошибка (код 13 - "Type mismatch").

Так же возможно использование функции CVDate вместо CDat.Пример. Преобразование числа 39522.5039 и строки " March 15, 2008" в значение дата-время в формате

LotusScript.

Dim VarD As Variant

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

172

Page 173: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

' Преобразование числа в дату/время

VarD = Cdat(39522.5039)

' Форматирование даты и времени

Print Format$(VarD, "Medium Date"), Format$(VarD, "Medium Time")

' Выводит 15-Mar-08 12:05 PM' (Отличается от национальных настроек - результат отвечает устройству функции 1

форматирования)Преобразование даты обратно в число

Print Cdbl(VarD) ' Выводит 39522.5039

' Преобразование текстового представления в дату

Print Cdat("March 15, 2008") ' Выводит 25.04.99

Print Cdat(-1), Cdat(0), Cdat(l)

' Выводит 29.12.1899 0:00:00 31.12.1899

Print Cdat("23:59:59" ) , Cdat("00:00:00") , Cdat("00:00: 01" )

' Выводит 23:59:59 0:00:00 0:00:01

Print Cdat(-657434) ' Выводит 01.01.100

On Error Resume Next

Print Cdat(-657435) ' Ошибка "Type mismatch"

If Err<>0 Then Print Error$ ' Выводит "Type mismatch"

Функция CDbl Синтаксис: CDbl ( expr)Тип возвращаемого значения: Double.Параметры: ехрг - числовое выражение или строковое выражение, которое может быть

преобразовано в число.

Возвращает значение выражения ехрг, приведенное к типу Double.

Если выражение ехрг является строковым выражением, то LotusScript преобразует его в число, включая и дробную часть. Если преобразование строки в число невозможно или значение ехрг превышает допустимый для данных типа Double диапазон значений, происходит ошибка ("Type mismatch" или "Overflow" соответственно). При преобразовании строки функция CDbl отличается от функции Val. Val исследует строку слева направо до тех пор, пока не встретит недопустимый символ, и возвращает число, полученное из "правильной" части строки. CDblтребует "правильности" строки целиком.

CDbl(EMPTY) возвращает 0.

Пример. Преобразование суммы двух значений типа Single и String в значение типа Double.

' Преобр. суммы 2-х значений типа Single и String в значение типа Double Dim х As Single, у As

String Dim Sum As Double x = 7.35E22 у = "11,11 E22"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

173

Page 174: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Sum = Cdbl(x + Cdbl (y) ) Print Sum '

Print Cdbl (EMPTY) '

Print Val("9w6") '

On Error Resume Next Print

Cdbl("9w6") If Err<>0 Then

Print Error$

Выводит 1.84 599997919383E+23

Выводит 0 Выводит 9

' Ошибка "Type mismatch" '

Выводит "Type mismatch"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

174

Page 175: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

175

Page 176: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Clnt Синтаксис: C ln t ( expr) Тип возвращаемого значения: Integer.

Параметры: ехрr - числовое выражение или строковое выражение, которое может быть преобразовано в число.

Возвращает числовое значение выражения ехрг, приведенное к типу Integer округлением до ближайшего целого значения.

Если выражение ехрr является строковым выражением, то функция Clnt возвращает число, соответствующее значению строки, преобразованному в число, округленное до ближайшего целого значения. Если преобразование строкового значения выражения ехрr в число невозможно, то происходит ошибка ("Type mismatch"). Если значение выражения ехр выходит за пределы допустимых значений диапазона для типа Integer, происходит ошибка ("Overflow").

Функция Clnt(EMPTY) возвращает 0.

Пример 1. Преобразование значение х типа Currency и String в значение типа Integer. Dim х As

Currency, у As String Dim IntVar As Integer x = 12.34 у = "43,21"

IntVar = Cint(x + Cint(y))

Print IntVar 'Выводит 55

IntVar = Cint("98,7654")

Print IntVar 'Выводит 99

On Error Resume Next

IntVar = Cint(32767+1) 'Ошибка "Overflow"

If Err<>0 Then Print Error$:Err=0 Else Print IntVar 'Выводит "Overflow" On Error

Resume Next

IntVar = Cint("la2") 'Ошибка "Type mismatch"

If Err<>0 Then Print Error$:Err=0 Else Print IntVar 'Выводит "Type mismatch"

Пример 2. Отличие от функции FixСм. пример к функции Fix на стр. 114

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

176

Page 177: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция CLng Синтаксис: CLng ( ехрг)Тип возвращаемого значения: Long.Параметры: expr - числовое выражение или строковое выражение, которое может быть преобразовано в

число.

Возвращает значение выражения ехрп преобразованное к типу Long округлением до ближайшего целого значения.

Если выражение ехрr является строковым выражением, то функция CLng возвращает число, представленное строкой, округленное до ближайшего целого. Если преобразование строки в число невозможно или значение выражения выходит за пределы типа Long, происходит ошибка ("Type mismatch" или "Overflow" соответственно).

Функция CLng(Empty) возвращает 0.

Пример. Преобразование значение типа Double в значение типа Long

Dim х As Double

x#= 123456789.400556 Print CLng(x#) 'Выводит 123456789

Функция CSng Синтаксис: CSng ( ехрг)Тип возвращаемого значения: Single.Параметры: ехр r - числовое выражение или строковое выражение, которое может быть преобразовано в

число.

Возвращает значение выражения ехрп приведенное к типу Single.

Если выражение ехрr является строковым выражением, то функция представляемое этой строкой, включая и дробную

часть. Если преобразование или значение выражения ехрr выходит за пределы значений данных типа ("Type mismatch" или "Overflow" соответственно).

Функция CSng(EMPTY) возвращает 0.

Пример. Преобразование значение типа Double в значение типа Single.

Dim х As Double, у As String Dim SngVar As Single x = 12.34 у = "43,21"

SngVar = Cint(x + Cint(y)) Print SngVar ' Выводит 55

SngVar = Cint("98,7654") Print SngVar ' Выводит 99

On Error Resume Next

SngVar = Csng(39090E+34) 'Ошибка "Overflow"

If Err<>0 Then Print Error$:Err=0 Else Print SngVar 'Выводит "Overflow" On Error Resume

Next

SngVar = Cint("la2") 'Ошибка "Type mismatch"

If Err<>0 Then Print Error$:Err=0 Else Print SngVar 'Выводит "Type mismatch"

CSng возвращает число, строки в число невозможно Single, происходит ошибка

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

177

Page 178: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция CStrСинтаксис: CSt r ( expr )Тип возвращаемого значения: String.Параметры: ехр r - числовое выражение или строковое выражение, которое может быть преобразовано в

число.

Возвращает значение выражения ехрг, преобразованное к типу String.

Функция CStr(EMPTY) возвращает пустую строку ("").

Пример. Числовые значения х% = 99 и у% = 1234.5678 суммируются, и результат преобразуются к типу String. "Сложение" строк - конкатенация строк.

Dim х As Integer, у As Double x = 99

у = 1234.5678

Print Cstr(x + у) ' Выводит

Print Cstr (x) + Cstr(у) ' Выводит

Функция CVar Синтаксис : CVar ( ехрт) Тип возвращаемого значения: Variant. Параметры: ехр r - числовое

выражение или строковое выражение, которое может быть преобразовано в число.

Возвращает значение выражения ехрг, приведенное к типу Variant.

Пример. Функция Abs оперирует с числовыми аргументами или аргументами типа Variant. Dim gNum As String

gNum = "-8,01"

Print "1: " & Abs(Cvar(gNum)) ' Выводит 8,01 (абсолютное значение -8,01) Print "2: "

& Abs(gNum) ' Выводит 8,01 (абсолютное значение -8,01)

'Ошибки не будет LotusScript корректно преобразует строку "-8,01" в число

©Функция CByte Синтаксис : CBy te ( ехр^ Тип возвращаемого значения : Byte. Параметры: ехр r - числовое

выражение или строковое выражение, которое может быть преобразовано в число.

З а м е ч а н и е . Д а н н а я ф у н к ц и я п о я в и л а с ь в L o t u s N o t e s D o m i n o 6 .

Возвращает значение выражения ехрг, приведенное к типу Byte.

Если выражение ехрr является строковым выражением, то функция CByte возвращает целую часть числа, представляемого этой строкой. Если преобразование строки в число невозможно или значение выражения ехрr выходит за пределы значений данных типа Byte, происходит ошибка ("Type mismatch" или "Overflow" соответственно).

1333,5678

991234,567

8

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

178

Page 179: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Ф у н к ц и я C B y t e ( E M P T Y ) в о з в р а щ а е т 0 .

П р и м е р . П р е о б р а з о в а н и я з н а ч е н и й в т и п B y t e Dim

VarDbl As Double, VarByte As Byte,VarDbl = 125.5678VarByte = Cbyte(VarDbl) Print VarByte

VarStr="13 5,4323 "

VarByte=Cbyte(VarStr)-Cbyte(VarDbl) Print

VarByte On Error Resume Next

VarByte=Cbyte(VarStr)+Cbyte(VarDbl) If

Err<>0 Then Print Error$:Err=0 Else

VarStr="135.4323" VarByte=Cbyte(VarStr)

If Err<>0 Then Print Error$:Err=0 Else

VarStr As String

'Выводит 126

' Выводит 9

' Ошибка "Overflow" Print

VarByte ' Выводит "Overflow"

' Ошибка " Type mismatch"

Print VarByte ' Выводит "Type mismatch"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

179

Page 180: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

180

Page 181: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©Функция CBoolСинтаксис: CBool ( expr)Тип возвращаемого значения: Bool.Параметры: ехрт- числовое выражение или строковое выражение, которое может быть преобразовано в

число.

З а м е ч а н и е . Д а н н а я ф у н к ц и я п о я в и л а с ь в L o t u s N o t e s D o m i n o 6 . В о з в р а щ а е т з н а ч е н и е в ы р а ж е н и я е х р ^ п р и в е д е н н о е к т и п у B o o l e a n .

Е с л и в ы р а ж е н и е е х р r я в л я е т с я ч и с л о м , т о C B o o l в о з в р а щ а е т T r u e ( И с т и н а ) и л и F a l s e ( Л о ж ь ) , з а в и с и м о с т и о т з н а ч е н и я ч и с л о в о г о

в ы р а ж е н и я : л ю б о е н е н у л е в о е з н а ч е н и е п р е д с т а в л я е т с о б о й и с т и н ( T r u e ) , 0 - л о ж ь ( F a l s e ) . Е с л и п р е о б р а з о в а н и е н е в о з м о ж н о и л и з н а ч е н и е

в ы р а ж е н и е е х р г в ы х о д и т з п р е д е л ы з н а ч е н и й д а н н ы х т и п а B o o l e a n , п р о и с х о д и т о ш и б к а ( " T y p e m i s m a t c h " и л и " O v e r f l o w с о о т в е т с т в е н н о ) .

П р и м е р п р е о б р а з о в а н и я з н а ч е н и я п е р е м е н н о й в т и п B o o l e a n . Dim Varlnt As Integer Dim VarStr As StringDim VarBool1 As Boolean, VarBool2 As Boolean Varlnt = 99

Print Cbool(Varlnt) ' Выводит TRUE

Varlnt1 = 0

Print Cbool(Varlnt1) ' Выводит FALSE

VarBool1 = Cbool (Varlnt) VarStr = "True"

Print Cbool(VarStr) ' Выводит TRUE

VarBool2 = Cbool(VarStr) On Error Resume Next VarStr= "No Value"

Print Cbool(VarStr) ' Ошибка "Type mismatch", строка может быть 'только "True" или"False"

If Err<>0 Then Print Error$ ' Выводит "Type mismatch"

Функция DataType Синтаксис: DataType ( ехрг)Тип возвращаемого значения: см. таблицу ниже. Параметры: ехрг-

какое-либо выражение.

В м е с т о ф у н к ц и и D a t a T y p e в о з м о ж н о и с п о л ь з о в а т ь ф у н к и ц ю V a r T y p e .

Возвращает числовой код типа значения выражения ехрг. Следующая таблица определяет возможные типы возвращаемых значений.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

181

Page 182: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Возвращаемое значение

Тип значения Константа Примечание

0 Empty V_EMPTY Только для Variant

1 Null V_NULL Только для Variant

2 Integer V_NTEGER

3 Long V_LONG

4 Single V_SINGLE

5 Double V_DOUBLE

6 Currency V_CURRENCY

7 Date/Time V_DATE Только для Variant

8 String V_STRING

9 OLE-объект или значение ссылки, равное Nothing

V_DISPATCH Только для Variant

10 OLE - ошибка V_ERROR Только для Variant

11 Boolean V_BOOLEAN Только для Variant

12 Variant (список или массив) V_VARIANT

13 IUNKNOWN (значение OLE) V_l UNKNOWN Только для Variant

17 Byte V_BYTE

34 Объект, определенного пользователем, класса

V_LSOBJ

35 Созданный объект V_PRODOBJ

2048 Список

8192 Фиксированный массив

8704 Динамический массив

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

182

Page 183: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Файл LSCONST.LSS содержит определения констант, представленные в таблице. Чтобы использовать символьные константы, а не числовые значения, необходимо, используя директиву %lnclude, подключить файл LSCONST.LSS.

Если аргумент для функции DataType является списком или массивом, возвращается значение, равное сумме двух значений: первое значение представляет тип массива или списка, второе - тип данных элементов массива или списка. Например, для фиксированного массива типа Integer это значение равно 8194 (8192+2), а для списка типа Variant это значение равно 2060 (2048+12).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

183

Page 184: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

184

Page 185: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример работы функции DataType

Dim Arr(5) As Variant ' Объявляем фиксированный массив Variant

Dim WeightEl As Single Dim NameEl As String WeightEl = 3 NameEl = "Март"

Arr (1) = WeightEl Arr(2) = NameEl Print Datatype(Arr(1)) Print

Datatype(Arr(2)) Print Datatype(Arr(3)) '

' инициализированы значением EMPTY) On Error Resume Next Dim but As Button

'

Print Datatype(but) Dim areas(3) As Button Print Datatype(areas)

Set cal = CreateObject("Word.Application") Print Datatype(cal) ' Выводит

9

Dim stats(3) As Integer ' Массив типа Integer

Print Datatype(stats%) ' Выводит 8194 (8192 + 2)

Dim misc List As Variant ' Список типа Variant Print Datatype(misc) •

Выводит 2060 (2048 + 12)

' Выводит 4 ' Выводит 8

' Выводит 0 (элементы Variant массива

' Объект класса продукта Выводит

35

' Массив объектов Button Выводит

8227 (8192 + 35)

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

185

Page 186: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция TypeName Синтаксис: TypeName ( expr) Тип возвращаемого значения: см. таблицу. Параметры: expr- какое-либо выражение.

Возвращает строку, определяющую тип выражения ехрг. Возвращаемое значение определяется согласно следующей таблице.

Значение ехрг Возвращаемое значение Примечание

EMPTY "EMPTY" Только Variant

NULL "NULL" Только Variant

Boolean "BOOLEAN"

Byte "BYTE"

Integer "INTEGER"

Long "LONG"

Single "SINGLE"

Double "Double"

Currency "CURRENCY"

Date "DATE" Только Variant

String "STRING"

Nothing "OBJECT"

OLE object "OBJECT' Только Variant

OLE error "ERROR" Только Variant

V_UNKNOWN (значение OLE-

объекта)

"V_UNKNOWN" Только Variant

Объект определенного пользователем класса или объект встроенного класса

Имя класса в символах верхнего регистра (для объекта из класса EMPOYEE возвращается значение "EMPLOYEE")

Массив Имя типа массива + круглые скобки, содержащие пробел, в символах верхнего регистра (для массива типа Integer возвращается строка: "INTEGER()").

Список Имя типа списка + слово "List" в символах верхнего регистра (для списка типа String возвращается строка: "STRING LIST").

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

186

Page 187: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Определения типа данных.

Dim var

Print "1: " & Typename(var) var=Cint(1)

Print "2: " & Typename(var) ' Выводит "INTEGER"

var=Cstr("Hi!")

Print "3: " & Typename(var) ' Выводит "STRING"

' Массивы

Dim vartmp As Variant Redim var(4) As Long Print "4: " & Typename(var)

vartmp=var

Print "5: " & Typename(vartmp) ' Выводит "LONG( )"

Redim var(4)

Print "6: " & Typename(var) ' Выводит "VARIANT( )"

' Списки Dim varListStr List As String

Print "7: " & Typename(varlistStr) ' Выводит "STRING LIST"

vartmp=varLi stStr

Print "8: " & Typename(vartmp) ' Выводит "STRING LIST"

Dim varList List

Print "9: " & Typename(varList) ' Выводит "VARIANT LIST"

' ОбъектыLotusScriptклассов

Class Employee

' ... определение класса Employee

End Class

Dim temp As Employee

Print "10: " & Typename(temp) ' Выводит "EMPLOYEE"

Set Emp = New Employee

Print "11: " & Typename(Emp) ' Выводит "EMPLOYEE"

Dim Emps (3) As Employee

Print "12: " & Typename (Emps () ) ' Выводит " EMPLOYEE ( )"

1 Объекты OLE классов

Set obj = CreateObject("Word.Application")

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

187

Page 188: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print "13: " & Typename(obj) 1 Выводит "OBJECT"

Выводит "EMPTY"

Выводит "LONG( )"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

188

Page 189: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.8 .3 Операторы и функции обработки строковых данных

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

189

Page 190: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

190

Page 191: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Оператор BinСинтаксис: B in [$ ] (numExpr)Тип возвращаемого значения: String.Параметры: numExpr- какое-либо выражение.

Возвращает двоичное представление числа в строковом виде.

Если значение выражения numExpr имеет дробную часть, то оно округляется до ближайшего целого значения. Значение, возвращаемое оператором Bin, имеет тип Variant DataType 8 (строка), оператор Bin$ возвращает значение типа String. Возвращаемое значение - число в двоичной системе исчисления. Максимальная длина результата - 32 символа.

Если тип данных выражения numExpr не Integer и не Long, LotusScript производит попытку привести значение выражения к типу Long. Если подобное преобразование невозможно, выдается ошибка ("Overflow").

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

191

Page 192: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

192

Page 193: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример работы функции Bin$ Print "1: "

& Bin$ (8) Print "2: " & Bin$

(8.0) Print "3: " & Bin$(8.01)

'

Print "4: " & Bin$(8.1 * .95) '

выражения - 7.695 - округляется, ' а

затем преобразуется)

' Выводит "1000" ' Выводит "1000"

Выводит "1000"

' Выводит "1000" (результат вычисления

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

193

Page 194: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

194

Page 195: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Oct

Синтаксис: Oct[$] (numExpr )Тип возвращаемого значения: String.Параметры: numExpr- какое-либо выражение.

Возвращает восьмеричное представление числа в строковом виде.

Если numExpr является числом с дробной частью, LotusScript округляет его до ближайшего целого перед преобразованием в восьмеричный вид.

Oct возвращает значение типа Variant DataType 8 (строка), a Oct$ возвращает значение типа String. Возвращаемое значение содержит только цифры от 0 до 7 включительно и имеет длину 11 символов.

Если тип значения numExpr не Integer или не Long, LotusScript производит попытку преобразовать выражение к типу Long. При невозможности преобразования типа выводится ошибка ("Overflow").

Пример работы функции Oct$

Print "1: " & Oct$(8) ' Выводит "10"

' Преобразование аргумента из типа Double в тип Long Print "2: " &

Oct$(8.0) ' Выводит "10"

' Округляет аргумент типа Double, а затем преобразует в Long Print "3:

" & Oct$(8.01) ' Выводит "10"

' Результат вычисления - 7.857 - округляется до 8.0 и затем преобразуется в 1 Long Print "4: "

& Oct$ (8.1 * .97) ' Выводит "10"

Оператор LSetСинтаксис: Lset string Var = stringExpr Параметры: string Var - строка.stringExpr - строка.

Присваивает содержимое строки stringExpr строковой переменной stringVar и выравнивает эту строку по левой границе. Параметр stringVar - имя строковой переменной типа String фиксированной или переменной длины, или типа Variant.

Если длина stringVar превышает длину stringExpr, то происходит выравнивание по левой границе stringExpr в stringVar и дополнение пробелами справа. Если длина stringVar меньше длины stringExpr, то копируется только возможное количество символов из stringExpr в stringVar. Если stringVar содержит числовое значение, то оно преобразуется в строковое, и далее используется длина уже строкового представления. Если переменная stringVar имеет тип Variant, то она не может иметь значение NULL (в этом случае "емкость" приемника была бы неопределена). Попытка заместить значение NULL вызывает ошибку с кодом 94 - "Invalid use of null".

Оператор LSet не может быть использован для операций с переменными типов, определенных пользователем.

Иллюстрация работы оператора LSet.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

195

Page 196: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример.

Dim х As Variant

х = "qwerty" ' Длина x = 6

Lset x = "abcdefghijklm" ' Присвоение шести левых символов

Print х ' Выводит "abcdef"

Lset x = "A"

' Присвоение символа "с" и дополнение остатка строки пробелами ' т. к.

длина х = б

Print х & "InterTrust" ' Выводит "A InterTrust"

х = "А" ' Обычное присвоение. Новая длина х - 1

Print х & "InterTrust" ' Выводит "AInterTrust"

х = Null

On Error Resume Next

Lset x = "qwerty" ' Ошибка "Invalid use of null"

If Err<>0 Then Print Error$ Else Print x 'Выводит "Invalid use of null"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

196

Page 197: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Оператор RSetСинтаксис: RSet stringVar = stringExpr Параметры: stringVar - строка.

stringExpr - строка.

Присваивает содержимое строки stringExpr строковой переменной stringVar и выравнивает эту строку по правой границе.

Использование данного оператора как бы фиксирует емкость переменной-приемника и заполняет её, начиная с правой стороны. Если длина строки stringVar превышает длину строки stringExpr, LotusScript выравнивает вправо строку stringExpr внутри переменной stringVar и добавляет пробелами недостающие символы слева в stringVar. Если длина stringVar меньше длины строки stringExpr, LotusScript копирует только нужное количество символов из строки stringExpr, взятых от ее левой границы, и присваивает значение этой подстроки переменной stringVar. Если stringVar содержит числовое значение, LotusScript сначала преобразует его к строковому виду, а уже потом устанавливает длину результата.

Иллюстрация работы оператора Rset:

Пример 1.

Dim RightStr As String * 20 ' Строка фиксированной длины 20

Rset RightStr = "qwerty" ' "qwerty" заведомо короче RightStr Print "A" &

RightStr ' Выводит "A qwerty"

' Строка qwerty" выровнена по правому краю строки RightStr и первые ' 14

символов строки RightStr являются пробелами

Пример 2.

Dim х As Variant х =

"qwerty"

Rset x = " abcdefghi jklmn"Print x 1 Выводит "abcdef"

Длина строкового предст. значения

переменной

Переменная - приемникСтрока

Дополняющие пробелы целиком

Переменная - приемникСтрока

Длина строкового предст. значения ^временной

Уместившаяся подстрокаНепоместившая ся подстрока

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

197

Page 198: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

' Строка "qwerty" присвоена переменной x типа Variant и тем самым ' установила

её длину равной 6. Таким образом, только шесть символов

' строки "abcdefghijklmn", а именно самые левые - "abcdef", записаны в переменную х.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

198

Page 199: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Lef tСинтаксис: Lef t [$ ] ( ехрг , п )Тип возвращаемого значения: String.Параметры: expr- числовое выражение или строковое выражение для функции Left;

выражение типа Variant или String для функции Left$. Если значение выражения ехрr является числом, то перед выделением символов это число преобразуется в строку п - Integer. Число возвращаемых символов.

Возвращает подстроку, состоящую из первых п символов преобразованного в строку параметра ехрг.

Функция Left возвращает значение типа Variant DataType 8 (String), а функция Left$ возвращает значение типа String. Если n = 0, то функция возвращает пустую строку (""). Если n больше, чем длина исходной строки из ехрг, функции возвращают всю строку.

Функция Left(Null,1) возвращает значение Null. Функция Left$(Null,1) выдает ошибку с кодом 94 - "Invalid use of null".

Пример.

Dim x

Print Left$("InterTrust", 5) ' Выводит "Inter"

x=Left$("qwerty", 0)

If x="" Then Print {x=""} ' Выводит x=""

Print Left (Null, 2) ' Выводит Null

x = Null

On Error Resume Next

x=Left$(x, 2) ' Ошибка "Invalid use of null"

If Err<>0 Then Print Error$ Else Print x 'Выводит "Invalid use of null"

Функция Lef tB

Функция LeftB выполняет ту же операцию, что и Left. Отличием является то, что LeftB измеряет длину подстроки не в символах, а в байтах. Во внутреннем представлении LotusScript строки кодированы Unicode, где символы кодируются двумя байтами. По этой причине использование функции LeftB может приводить к непредсказуемым результатам.

Вместо LeftB следует использовать либо Left, либо LeftBP.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

199

Page 200: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Lef tBP Синтаксис: Lef tBP[$ ] ( expr , n ) Тип возвращаемого значения: String.Параметры: ехр^ числовое выражение или строковое выражение для функции LeftBP;

выражение типа Variant или String для функции LeftBP$. Если значение выражения ехрг является числом, то перед выделением символов это значение преобразуется в строку.

Для указанной строки возвращает подстроку слева из указанного числа байт.

Подсчет байт ведется в кодировке текущей платформы.

Функция LeftBP возвращает значение типа Variant DataType 8 (String), а функция LeftBP$ возвращает значение типа String. Если n = 0, функция возвращает пустую строку (""). Если n больше, чем длина исходной строки из ехрп функции возвращают всю строку.

Функция LeftBP(Null) возвращает значение Null. Функция LeftBP$(Null) выдает ошибку с кодом 94 - "Invalid use of null".

Функция производит посимвольное выравнивание результата. Это означает, что, если кодировка строки

многобайтная и в результат справа попадает не целый код символа, а, например, один байт, то такой символ не включается в результат функции.

Пример.

Dim х

x=Leftbp$("qwerty",0) If x="" Then Print {x=""} Print Leftbp$("InterTrust", 5)

Print Leftbp$("ИнтерТраст", 20) Функция LeftC

Функция Lef tC Синтаксис: Lef tC ( ехрг , n )Тип возвращаемого значения: String.Параметры: ехрт - строковое выражение, содержащее колонки символов.

Используется только для систем письма в колонку (тайская, малайская, арабская, урду, персидская (фарси), лаосская)!

Из указанной строки извлекает указанное количество колонок слева.

Если n = 0, функция возвращает пустую строку (""). Если n больше, чем число колонок в исходной строке ехрп функции возвращают всю строку.

Выводит х="" Выводит

"Inter" Выводит

"ИнтерТраст"

v

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

200

Page 201: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция StrLeftСинтаксис: StrLeft[$] ( stringExprl, stringExpr2, [compMethod [, Occurences ]]) Тип возвращаемого значения: String.Параметры: stringExprl - строка, в которой производится поиск и выборка

(строка-источник).stringExpr2 - строка, вхождение которой отыскивается в строке-источнике (строка-

образец).compMethod - числовое выражение, задающее правило сравнения строк.

Occurences - числовое выражение, задающее необходимое число вхождений строки-образца в строке-источнике, которое должно быть достигнуто для получения результата. Значение по умолчанию -1 .

Функция просматривает указанную строку-источник слева направо в поиске подстроки-образца и возвращает подстроку из символов, находящихся слева от найденного образца.

Если аргумент compMethod не указан, то действуют установки оператора Option Compare, если таковой присутствует в текущем модуле. Подробнее о способах сравнения строк см. в описании оператора Option Compare на стр. Ошибка ! Закладка не определена. . Использование значения вне этого списка приводит к ошибке с кодом 173 - "Argument out of range".

Иллюстрация работы функции StrLeft:

Пример. Вызовы функции StrLeft с различными значениями параметров. Const

SourceStr$ = "Раскудрявый клен зеленый, лист резной" Dim strk As String

Print "0: " & Strleft(SourceStr$, "зеле") '

Выводит "Раскудрявый клен "

strk=Strleft(SourceStr$, "зеЛе")

compMethod Способ сравнения0 С учетом регистра. С учетом "Pitch"1 Без учета регистра. С учетом "Pitch"4 С учетом регистра. Без учета "Pitch"5 Без учета регистра. Без учета "Pitch"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

201

Page 202: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

202

Page 203: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

If strk="" Then Print {l: strk="" } учетом регистра)

strk=Strleft(SourceStr$, "зеЛе", 0)

If strk="" Then Print {2: strk=""}

strk=Strleft(SourceStr$, "зеЛе", 4)

If strk="" Then Print {3: strk=""}

' Выводит

Print "4: "

Выводит strk="" (по умолчанию сравнение идет с

Выводит strk=

Выводит strk=" (явно

задано сравнение с учетом регистра) & Strleft(SourceStr$, "зеЛе", 1)

' Выводит "Раскудрявый клен "

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

203

Page 204: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

204

Page 205: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print "5: " & Strleft(SourceStr$, "зеЛе", 5)' Выводит "Раскудрявый клен (задано сравнение без учета регистра)

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

205

Page 206: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

(строка-источник).stringExpr2 - строка, вхождение которой отыскивается в строке-источнике (строка-

образец).

вхождений строки-образца в строке-источнике, которое должно быть достигнуто для получения результата. Значение по умолчанию - 1.

Функция просматривает указанную строку-источник справа налево в поиске подстроки-образца и возвращает подстроку из символов, находящихся слева от найденного образца.

Если аргумент compMethod не указан, то действуют установки оператора Option Compare, если таковой присутствует в текущем модуле. Подробнее о способах сравнения строк см. в описании оператора Option Compare на стр. Ошибка! Закладка не определена. . Использование значения вне этого списка приводит к ошибке с кодом 173 - "Argument out of range".

Иллюстрация работы функции StrLeftBack:

Пример. Вызовы функции StrLeftBack с различными значениями параметров.

Const SourceStr$ = "Раскудрявый клен зеленый, лист резной," Dim strk As

String

Print "0: " & Strleftback(SourceStr$, "зеле") '

Выводит "Раскудрявый клен "

strk=Strleftback(SourceStr$ , "зеЛе")If strk="" Then Print {l: strk=""} ' Выводит strk="" (no умолчанию сравнение идет с учетом

регистра)

strk=Strleftback(SourceStr$, "зеЛе", 0)

If strk="" Then Print {2: strk=""} ' Выводит strk=""

strk=Strleftback(SourceStr$, "зеЛе", 4)

If strk="" Then Print {3: strk="") ' Выводит strk=""

' Выводит "" (явно задано сравнение с учетом регистра)

Print "4: " & Strleftback(SourceStr$,"зеЛе", 1) 'Выводит "Раскудрявый клен "Print "5: " & Strleftback(SourceStr$,"зеЛе", 5)' Выводит "Раскудрявый клен " (задано сравнение без

учета регистра)

Print "6: " & Strleftback(SourceStr$,"ле", 1, 2) ' Выводит "Раскудрявый к" ' (все, что до 2-ой "ле")

strk=Strleftback(SourceStr$, "е", 1, 5)

If strk="" Then Print (7: strk=""} ' Выводит strk=""

Print "6: " & Strleft(SourceStr$, "e" , 1, 3) ' Выводит "Раскудрявый клен зел" (все, что до 3-ей буквы "е")strk=Strleft(SourceStr$, "е", 1, 5)

If strk="" Then Print {7 strk=""} ' Выводит strk=""

' Выводит "" (5-го вхождения не найдено - букв "е" всего 4)

strk=Strleft(SourceStr$, "")

If strk="" Then Print {8: strk=""} ' Выводит strk="" (нет строки-образца)

Функция StrLeftBack

Синтаксис: StrLeftBack[$] ( stringExpr 1, stringExpr2, [compMethod [, Occurences ]]) Тип возвращаемого значения: String.

Параметры: stringExprl - строка, в которой производится поиск и выборка

compMethod - числовое выражение, задающее правило сравнения строк. Флаг может иметь следующие значения:compMethod Способ сравнения0 С учетом регистра. С учетом "Pitch"1 Без учета регистра. С учетом "Pitch"4 С учетом регистра. Без учета "Pitch"5 Без учета регистра. Без учета "Pitch"

Occurences - числовое выражение, задающее необходимое число

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

206

Page 207: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

' Выводит "" (5-го вхождения не найдено - букв "е" всего 4)

strk=Strleftback(SourceStr$, "")

If strk="" Then Print {8: strk=""} ' Выводит strk="" (нет строки-образца)

Функция Ri ght

R i g h t [ $ ] ( e x p r , n ) Синтаксис: R ight [$] ( ехрг , n )Тип возвращаемого значения: String.Параметры: ехрт - числовое или строковое выражение для функции Right; любое

выражение типа Variant или String для функции Right$. Числовое выражение предварительно переводится в строковое.

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

Функция Right возвращает значение типа Variant DataType 8 (String), функция Right$ - типа String. Если n равно 0, то возвращается пустая строка (""); если n больше, чем количество символов в исходной строке, то возвращается вся исходная строка.

Функция Right(Null, 1) возвращает значение Null. Функция Right$(Null, 1) выдает ошибку с кодом 94 - "Invalid use of null".

Пример.

Dim x

Print Right$("InterTrust", 5) ' Выводит "Trust"

x=Right$("qwerty", 0)

If x=" " Then Print {x=""} ' Выводит x=" "

Print Right(Null, 2) ' Выводит Null

x = Null

On Error Resume Next

x=Right$(x, 2) ' Ошибка "Invalid use of null"

If Err<>0 Then Print Error$ Else Print x 'Выводит "Invalid use of null"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

207

Page 208: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

208

Page 209: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

выражение типа Variant или String для функции RightBP$. Если значение выражения ехрг является числом, то перед выделением символов оно преобразуется в строку,

Для преобразованного в строку параметра ехрт возвращает подстроку из указанного числа байт n, начиная с левого конца строки.

Подсчет байт ведется в кодировке текущей платформы.

Функция RightBP возвращает значение типа Variant DataType 8 (String), а функция RightBP$ возвращает значение типа String. Если n = 0, то функция возвращает пустую строку (""). Если n больше, чем длина исходной строки из ехрт, то функции возвращают всю строку.

Функция RightBP(Null, 1) возвращает значение Null. Функция RightBP$(Null, 1) выдает ошибку с кодом 94-"Invalid use of null".

Функция производит посимвольное выравнивание результата. Это означает, что, если кодировка строки многобайтная, и в результат справа попадает не целый код символа, а, например, один байт, то такой символ не включается в результат функции.

Пример.

Dim х

x=Rightbp$("qwerty" ,0) If x=" " Then Print (x="" } Print Rightbp$("InterTrust" Print Rightbp$

("ИнтерТраст"

Функция RightC Синтаксис: R ightC ( ехрг , n ) Тип возвращаемого значения: String.Параметры: ехрт - строковое выражение, содержащее колонки символов.

Используется только для систем письма в колонку (тайская, малайская, арабская, урду, персидская (фарси), лаосская)!

Из указанной строки извлекает указанное количество колонок справа.

141

Функция RightB

Функция RightB выполняют ту же операцию что и Right. Отличием является то, что RightB измеряет длину подстроки не в символах, а в байтах. Во внутреннем представлении LotusScript строки кодированы Unicode, где символы кодируются двумя байтами. По этой причине использование функции RightB может приводить к непредсказуемым результатам.

Вместо RightB следует использовать либо Right, либо RightBP.

Функция RightBP

Синтаксис: R ightBP[$] ( ехрт , n ) Тип возвращаемого значения: String.Параметры: ехрт - числовое выражение или строковое выражение для функции RightBP;

' Выводит х="" 5)

' Выводит "Trust"

20) ' Выводит "ИнтерТраст"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

Page 210: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Если n = 0, функция возвращает пустую строку (""). Если п больше, чем число колонок в исходной строке ехрг, то функции возвращают всю строку.

Функция St rR ight

Синтаксис: St rR ight[$] ( stringExprl, stringExpr2, [compMethod [, Occurences ]]) Тип возвращаемого значения: String.Параметры: stringExprl - строка, в которой производится поиск и выборка

(строка-источник).stringExpr2 - строка, вхождение которой отыскивается в строке-источнике (строка-образец).compMethod - числовое выражение, задающее правило сравнения строк. Флаг может иметь

следующие значения:

вхождений строки-образца в строке-источнике, которое должно быть достигнуто для получения результата. Значение по умолчанию - 1.

Функция просматривает указанную строку-источник слева направо в поиске подстроки-образца и возвращает подстроку из символов, находящихся справа от найденного образца.

Если параметр compMethod не указан, то действуют установки оператора Option Compare, если таковой присутствует в текущем модуле. Подробнее о способах сравнения строк см. в описании оператора Option Compare . Использование значения вне этого списка приводит к ошибке с кодом 173 - "Argument out of range".

Иллюстрация работы функции StrRight:

Пример. Вызовы функции StrRight с различными аргументами.

Const SourceStr$ = "Раскудрявый клен зеленый, лист резной" Dim strk

As String

Print "0: " & Strright(SourceStr$, "клен") '

Выводит " зеленый, лист резной"

strk=Strright(SourceStr$, "клЕн")

If strk="" Then Print {l: strk=""} учетом регистра)

compMethod Способ сравнения0 С учетом регистра. С учетом "Pitch"

1 Без учета регистра. С учетом "Pitch"

4 С учетом регистра. Без учета "Pitch"

5 Без учета регистра. Без учета "Pitch"

Occurences - числовое выражение, задающее необходимое число

Выводит strk="" (no умолчанию сравнение идет с

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

210

Page 211: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

211

Page 212: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

strk=Strright(SourceStr$, "клЕн", 0) If strk="" Then

Print {2: strk=""} strk=Strright(SourceStr$, "клЕн", 4)

If strk="" Then Print {3: strk="" } ' Выводит "" (явно

задано сравнение с учетом регистра) Print "4: " &

Strright(SourceStr$, "клЕн", 1) ' Выводит

Выводит strk=""

Выводит strk="

зеленый, лист резной"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

212

Page 213: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print "5: " & Strright(SourceStr$, "клЕн", 5) ' Выводит " зеленый, лист резной " (задано сравнение без учета регистра)

Print "6: " & Strright(SourceStr$, "н" , 1, 3) ' Выводит " ой" (все, что после 3-ейбуквы "н" считая слева направо)

strk= Strright(SourceStr$, "н" , 1, 4)

If strk="" Then Print (7: strk=""} ' Выводит strk=""

' Выводит "" (4-го вхождения не найдено - букв "н" всего 3) strk=Strright(SourceStr$, "")

If strk="" Then Print {8: strk=""} ' Выводит strk="" (нет строки-образца)

Функция StrRightBack Синтаксис: StrRightBack[$] ( stringExprl, stringExpr2, [compMethod [, Occurences ]]) Тип возвращаемого значения: String.Параметры: stringExprl - строка, в которой производится поиск и выборка

(строка-источник).stringExpr2 - строка, вхождение которой отыскивается в строке-источнике (строка-

образец).compMethod - числовое выражение, задающее правило сравнения строк.

Occurences - числовое выражение, задающее необходимое число вхождений строки-образца в строке-источнике, которое должно быть достигнуто для получения результата. Значение по умолчанию - 1.

Функция просматривает указанную строку-источник справа налево в поиске подстроки-образца и возвращает подстроку из символов, находящихся справа от найденного образца.

Если аргумент compMethod не указан, то действуют установки оператора Option Compare, если таковой присутствует в текущем модуле. Подробнее о способах сравнения строк см. в описании оператора Option Compare. Использование значения вне этого списка приводит к ошибке с кодом 173 - "Argument out of range".

Иллюстрация работы функции StrRightBack:—

С

Пример. Вызовы функции StrRightBack с различными значениями параметров. Const

SourceStr$ = "Раскудрявый клен зеленый, лист резной," Dim strk As String

Print "0: " & Strrightback(SourceStr$, "клен") '

Выводит " зеленый, лист резной,"

strk=Strrightback(SourceStr$, "клЕн")If strk="" Then Print {l: strk=""} ' Выводит strk="" (по умолчанию сравнение идет с учетом

регистра)

strk=Strrightback(SourceStr$, "клЕн", 0)

If strk="" Then Print (2: strk="") ' Выводит strk=""

strk=Strrightback(SourceStr$, "клЕн", 4)

If strk="" Then Print {3: strk=""( ' Выводит strk=""

' Выводит "" (явно задано сравнение с учетом регистра)

compMethod Способ сравнения0 С учетом регистра. С учетом "Pitch"1 Без учета регистра. С учетом "Pitch"4 С учетом регистра. Без учета "Pitch"5 Без учета регистра. Без учета "Pitch"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

213

Page 214: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print "4: " & Strrightback(SourceStr$,"клЕн", 1) 'Выводит " зеленый, лист резной,"Print "5: " & Strrightback(SourceStr$,"клЕн", 5) ' Выводит " зеленый, лист резной," (задано

сравнение без учета регистра)

Print "6: " & Strrightback(SourceStr$,"ле", 1, 2) ' Выводит "н зеленый, лист резной, ' (все, что до 2-ой "ле" справа налево)

strk=Strrightback(SourceStr$, "н", 1, 4)

If strk="" Then Print {7: strk="") ' Выводит strk=""

' Выводит "" (4-го вхождения не найдено - букв "е" всего 3)

strk=Strrightback(SourceStr$, " ")

If strk="" Then Print {8: strk=""} ' Выводит strk="" (нет строки-образца)

©Функция S t rToken

Синтаксис: St rToken (expression, delimiter, wordNumber[, compMethod]) Тип возвращаемого значения: String. Параметры: expression - исходная строка.

delimiter - разделитель между словами в строке.wordNumber- число типа Long. Порядковый номер слова которое должно быть возвращено.compMethod - числовое выражение, задающее правило сравнения строк.

Замечание. Данная функция появилась в Lotus Notes Domino 6.

Возвращает указанное слово из заданной текстовой строки.

Если compMethod не используется, то по умолчанию сравнение строк проходит в режиме, установленном при помощи Option Compare для данного модуля. Если для модуля режим сравнения строк не установлен, то в таком случае сравнение просходит с учетом регистра и точного совпадения.

В Результате работы функции StrToken возвращается строка, содержащее определенное слово из заданной строки.

Часть строки определяется как «слово» в том случае, когда такая подстрока ограничена с начала или с конца заданным разделителем delimiter. После того как строка разбта на слова, функция возвращает нужное словоиз строки, заданное порядковым номером в строке wordNumber.

В случае когда заданный порядковый номер возвращаемого слова больше реального количества слов в строке, функция возвращает пустую строку. Если порядковый номер возвращаемого слова равен О, то в таком случае функция вернет первое слово из строки, то есть wordNumber=0 эквивалентно wordNumber=1. Если порядковый номер возвращаемого слова <0, то функция вернет заданной слово, считая слова от конца строки, а не с начала.

Функция StrToken может вызвать Run Time ошибку "Type Mismatch" в том случае, когда исходная строка или разделитель заданы не скалярно, или значение порядкового номера слова не типа Long.

Пример. Работа функциии StrToken Dim

sLnd$

sLnd$="Lotus Notes Domino 8.x"

Print Strtoken(sLnd$," ", 0) 'Выводит Lotus

Print Strtoken(sLnd$," ", 2) 'Выводит Notes

Print Strtoken(sLnd$," ", -2) 'Выводит Domino

compMethod Способ сравнения

0 С учетом регистра. С учетом "Pitch"

1 Без учета регистра. С учетом "Pitch"

4 С учетом регистра. Без учета "Pitch"

5 Без учета регистра. Без учета "Pitch"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

214

Page 215: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print ">" & Strtoken (sLnd$, " ",8) & "<" ' Выводит ><

Функция LenСинстаксис: Len ({ stringExpr | variantExpr | numericExpr | typeName})Тип возвращаемого значения: Integer.Параметры: stringExpr - строковое выражение. Для строкового выражения функция Len

возвращает число символов. variantExpr - выражение типа Variant. Для выражения типа Variant функция Len возвращает число символов, содержащихся в значении variantExpr, преобразованном к типу String. numericExpr - имя переменной, элемент массива, элемент списка, элемент типа или класса, определенного пользователем, должен иметь числовой тип данных. В этом случае функция Len возвращает число байт, необходимых для хранения значения выражения numericExpr. typeName - простая переменная, массив, список, экземпляр типа или объект класса, определенного пользователем. В этом случае функция Len возвращает число байт, содержащихся во всех элементах typeName, кроме элементов типа Variant или типа String переменной длины. Если тип или класс имеет элементы типа Variant или строки переменной длины, то результат функции Len для такой переменной может отличаться от простой суммы размеров элементов.

Возвращает количество символов в строке или число байт, необходимых для хранения числового значения.

Len(Null) выдает ошибку. Len(v), где v есть Empty, возвращает 0.Если длину строки предпочтительнее вычислить в байтах, а не в символах, используется функция LenВ. Функция

LenBP используется для вычисления длины строки в байтах в кодировке текущей платформы.

Пример 1. Длина строки в символах и числового значения в байтах Dim

StrK As String StrK = "Lotus Notes/Domino" Print Len(StrK) '

Выводит 18

' Число байт, необходимых для хранения значения типа DoubleDim DblVar As Double

Print Len(DblVar) ' Выводит 8

Пример 2. Тип, определенный пользователем содержит элемент типа String переменной длины. Type

Orderlnfo

ordID As String * 6

custName As String End

Type

Dim ord As Orderlnfo

ord.ordID$ = "OR9876"

ord.custName$ = "Alex

V. Khodyrev"

Print Len(ord.ordID$) + Len(ord.custName) ' Суммарный размер элементов - 22. Print Len(ord)

' Размер переменной такого типа - 16

Функция LenBСинтаксис: LenB ({ stringExpr | variantExpr | numericExpr | typeName})Параметры: stringExpr - строковое выражение. Для строкового выражения функция

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

215

Page 216: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

LenB возвращает число символов. variantExpr - выражение типа Variant. Для выражения типа Variant функция LenB возвращает число символов, содержащихся в значении variantExpr, преобразованном к типу String. numericExpr - имя переменной, элемент массива, элемент списка, элемент типа или класса, определенного пользователем, должен иметь числовой тип данных. В этом случае функция LenB возвращает число байт, необходимых для хранения значения выражения numericExpr.

typeName - простая переменная, массив, список, экземпляр типа или объект класса, определенного пользователем. В этом случае функция LenB возвращает число байт, содержащихся во всех элементах typeName, кроме элементов типа Variant или типа String переменной длины. Если тип или класс имеет элементы типа Variant или строки переменной длины, то результат функции LenB для такой переменной может отличаться от простой суммы размеров элементов.

Аналогична функции Len, но всегда возвращает длину строки в байтах.

Пример. Длина строки из 6 символов в байтах.

Dim StrK As String StrK = " qwerty"

Print Lenb(StrK) ' Выводит 12

' Число байт, необходимых для хранения значения типа Single Dim DblVar As Double Print

Lenb(DblVar) ' Выводит 8

Следует иметь в виду, что число байт в строке вычисляется по кодировке, используемой LotuScript для внутренней кодировки строк. Этой кодировкой является Unicode.

Функция LenBPСинтаксис: LenBP ({ stringExpr \ variantExpr | numericExpr | typeName } )Параметры: stringExpr - строковое выражение. Для строкового выражения функция

LenBP возвращает число символов. variantExpr - выражение типа Variant. Для выражения типа Variant функция LenBP возвращает число символов, содержащихся в значении variantExpr, преобразованном к типу String. numericExpr - имя переменной, элемент массива, элемент списка, элемент типа или класса, определенного пользователем, должен иметь числовой тип данных. В этом случае функция LenBP возвращает число байт, необходимых для хранения значения выражения numericExpr.

typeName - простая переменная, массив, список, экземпляр типа или объект класса, определенного пользователем. В этом случае функция LenBP возвращает число байт, содержащихся во всех элементах typeName, кроме элементов типа Variant или типа String переменной длины. Если тип или класс имеет элементы типа Variant или строки переменной длины, то результат функции LenBP для такой переменной может отличаться от простой суммы размеров элементов.

Аналогична функции Len, но возвращает длину строки в байтах. При этом подсчет байт ведется по кодировке текущей платформы.

Функция LenCСинтаксис: LenC (st r ingExpr)Тип возвращаемого значения: Integer.

Параметры: stringExpr - строковое выражение, содержащее колонки символов.

Только для систем письма в колонку (например, тайской)!

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

216

Page 217: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Возвращает длину строки, измеренную в колонках.

LenC(Null) выдает ошибку. LenC(v), где v есть Empty, возвращает 0.

Оператор MidСинтаксис: Mid[$] ( stringVar, start [, length ]) = stringExpr Тип возвращаемого значения: String.Параметры: stringVar - переменная типа String или Variant, содержащая строковое

значение, не может быть строковым литералом. start - позиция первого символа в stringVar, с которого начинается замена. length - число символов, извлекаемых из stringExpr для вставки. stringExpr - строковое выражение.

Замещает часть строки или всю строку символами другой строки.

Символы из stringExpr замещают символы в stringVar.

Оператор Mid может изменить размер stringVar в байтах, если, например, stringExpr - строка символов в многобайтовой кодировке (LMBCS), а заменяемые символы строки в stringVar - в однобайтовой. Но длина строки в stringVar, измеренная в символах, всегда остается неизменной.

Оператор Mid использует из строки stringExpr столько символов, сколько указано параметром length. Если необходимо использовать всю строку stringExpr целиком, то можно указать значение length заведомо превышающее длину stringExpr. Того же результата можно добится просто, не указывая аргумента length. Если оказывается, что start + length превышает длину stringVar, то используются не все символы stringExpr, а только необходимые для заполнения в stringVar позиций с start до (start + length -1).

Если номер позиции start превосходит длину строки stringVar, то выдается ошибка с кодом 5 - "Illegal function call".

Пример.

Dim StrK1 As String, StrK2 As String StrK1

= " qwerty" StrK2 = "123456" Mid$(StrK1,1,

3) = StrK2

Print StrK1 ' Выводит 123rty

StrK1 = " qwerty" Mid$(StrK1,

2, 10) = StrK2

Print StrK1 ' Выводит ql2345

StrK1 = "qwerty"

On Error Resume Next

Mid$ (StrKl, 2) = StrK2

Print StrK2 ' Выводит "ql2345"

StrK1 = "qwerty"

Mid$(StrK1, 7) = StrK2 ' Ошибка "Illegal function call"

If Err<>0 Then Print Error$ Else Print StrK2 ' Выводит "Illegal function call"

Функция MidСинтаксис: Mid[$] ( expr, start [, length ])

Тип возвращаемого значения: Mid возвращает значение типа Variant DataType 8 (String),Mid$ - типа String.

Параметры: ехрг - числовое или строковое выражение. LotusScript преобразует

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

217

Page 218: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

числовое выражение в строковое перед извлечением подстроки. start - позиция первого символа извлекаемой подстроки, отсчитываемая от

первого левого символа исходной строки. length - число извлекаемых из исходной строки символов.

Возвращает подстроку указанной длины (в символах) из строки с определенной позиции (номер символа). Если аргумент length не указан, то возвращается подстрока строки ехрг с позиции start до конца строки.

Пример.

Print Mid$("InterTrust", 1,5) ' Выводит Inter

Print Mid$("InterTrust", 6) ' Выводит TrustОператор и функция MidB

Оператор и функция MidB выполняют те же операции что и функция Mid. Отличием является то, что MidB измеряет стартовую позицию и длину подстроки не в символах, а в байтах. Во внутреннем представлении LotusScript строки кодированы Unicode. В Unicode символы кодируются двумя байтами. Таким образом, использование оператора и функции MidB может приводить к непредсказуемым результатам.

Вместо MidB следует использовать либо Mid, либо MidBP.

Функция MidBPСинтаксис: MidBP[$ ] ( ехрr, start [, length ])Тип возвращаемого значения: MidBP возвращает значение типа Variant DataType 8 (String),

MidBP$ - типа String.Параметры: ехрr - числовое или строковое выражение. LotusScript преобразует

числовое выражение в строковое перед извлечением подстроки. start- порядковый номер первого байта извлекаемой подстроки,

отсчитываемый от начала исходной строки. length - число извлекаемых из исходной строки байт.

Возвращает подстроку указанной длины в байтах из строки, начиная с указанного байта. Подсчет байт ведется в кодировке текущей платформы.

Если параметр length не указан, то возвращается подстрока строки ехрг с позиции start до конца строки. Если позиция start превышает длину строки ехрг, то результатом будет пустая строка.

Функция производит посимвольное выравнивание результата. Это означает, что, если кодировка строки многобайтная и в результат попадает не целый код символа, а, например, один байт, то такой символ не включается в результат функции.

Пример.

Print Midbp$("QWERTY", 1,3) ' Выводит QWE

Print Midbp$("QWERTY", 4) ' Выводит RTY

Print ">" + Midbp$ (" QWERTY" , 7) + "<" ' Выводит X

Функция MidC Синтаксис: MidC ( ехрг, off[, n ] ) Тип возвращаемого значения: String.

Параметры: ехрr - строковое выражение, содержащее колонки символов.off - позиция первой колонки извлекаемой подстроки, отсчитываемая в исходной

строке слева направо.

Только для систем письма в колонку (например, тайской)!

Из указанной строки извлекает указанное количество колонок, начиная с колонки указанной по счету слева направо.

Если указанное смещение off превышает длину строки ехрг, то результатом функции будет пустая строка. Если n превышает длину остатка строки ехгр с позиции off, либо аргумент n не указан, возвращается весь остаток строки ехрт с позиции off целиком.

Функция InSt r ... .......... .. . . I I

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

218

Page 219: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Синтаксис: InSt r ( [ begin , ] string1 , string2 [, compMethod]) Тип возвращаемого значения: Integer.Параметры: begin - опция, положительное целое числовое выражение.

s t r ing1 - строка, в которой функция InStr ищет строку string2. string2 - строка, которую функция InStr ищет в строке stringi. compMethod - числовое выражение, задающее правило сравнения строк.

Возвращает номер позиции первого символа строки, заключенной внутри другой строки.

begin - опция, положительное целое числовое выражение. Эта опция определяет позицию внутри строки string 1, начиная с которой функция InStr ищет начало строки string2. Если опция begin пропущена, ее значение по умолчанию равно 1 (первый символ - начало строки). Если указан аргумент compMethod, то должна быть указана и опция begin.

Если аргумент compMethod не указан, то действуют установки оператора Option Compare, если таковой присутствует в текущем модуле. Подробнее о способах сравнения строк см. в описании оператора Option Compare на стр. Ошибка! Закладка не определена-

Следующая таблица демонстрирует, каким образом функция InStr реагирует на возможные ситуации.

Пример. Демонстрирует работу функции InStr Dim Stroka As

String Stroka = "Hi happy world!!"

Print Instr(1, Stroka, "") 'Выводит 1

Флаг может иметь следующие значения:CompMethod Способ сравнения

0 С учетом регистра. С учетом "Pitch"

1 Без учета регистра. С учетом "Pitch"

4 С учетом регистра. Без учета "Pitch"

5 Без учета регистра. Без учета "Pitch"

Условие Возвращаемое значение

stringi1- пустая строка ("") 0

string2 не найдена после начала stringi 0

начало string2 выходит за пределы stringi 0

string2 - пустая строка ("") Значение begin. Если пропущен begin, InStr возвращает значение 1.

string1 - Null Null

string2 - Null Null

begin или compMethod - Null Ошибка с кодом 94 - "Invalid use of null"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

219

Page 220: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print Instr(1, Stroka, "world") 'Выводит 10

Print Instr(20, Stroka, "!") 'Выводит 0

В случае, если позицию подстроки необходимо получить в байтах, следует воспользоваться функцией InStrB.

Функция InStrBСинтаксис: InStrB ([ begin , ] string1, string2) Тип возвращаемого значения: Integer.Параметры: begin - опция, положительное целое числовое выражение.

string1- строка, в которой функция InStrB ищет строку string2. string2 - строка, которую функция InStrB ищет в строке stringi.

Аналогична функции InStr, но в отличие от оной возвращает не позицию символа, а номер байта. При этом используется внутренняя кодировка строки в LotusScript (LotusScript для внутреннего кодирования строк использует Unicode).

Функция InStrB не учитывает кодировку текущей платформы. Для этой цели следует использовать функцию InStrBP.

Пример. Значение 7 - позиция, которую занимает первый байт "per" от начала Stroka. Dim

Stroka As String Stroka = "Semper virens"

Print Instrb(1, Stroka, "") 'Выводит 1

Print Instrb(1, Stroka, "per") 'Выводит 7

Print Instrb (20, Stroka, "vi") 'Выводит 0Функция InStrBPСинтаксис: InStrBP ([ begin , ] string1 , string2) Тип возвращаемого значения: Integer.Параметры: begin - опция, положительное целое числовое выражение.

string1 - строка, в которой функция IsStrBP ищет строку string2. string2 - строка, которую функция InStrBP ищет в строке stringi.

Аналогична функциям InStr и InStrB, но в отличие от оных возвращает не позицию символа и не номер байта во внутренней кодировке LotusScript, а номер байта в кодировке текущей платформы.

Пример.

Dim Stroka As String Stroka = "Semper virens"

Print Instrbp(1, Stroka, "") 'Выводит 1

Print Instrbp(1, Stroka, "per") 'Выводит 4 Print

Instrbp (20, Stroka, "vi") 'Выводит 0Функция InSt rC

Синтаксис: InSt rC ( off, string1 string2) Тип возвращаемого значения: Integer.

Параметры: off - положительное целое числовое выражение. Задает номер колонки, скоторой начинается поиск. string1- строковое выражение, содержащее колонки

символов; строка, вкоторой производится поиск. string2 - строковое выражение, содержащее колонки

символов; строка, вхождение которой отыскивается.

Только для систем письма в колонку (например, тайской)!

Для указанной строки возвращает позицию колонки, с которой начинается первое вхождение указанной подстроки.

Функция Space Синтаксис: Space[$ ] (numExpr) Тип возвращаемого значения: String.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

220

Page 221: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Параметры: питЕхр r - числовое выражение, задающее необходимое число пробелов. Возвращает, строку,

содержащую указанное количество пробелов.

Параметр питЕхрr - числовое выражение, задающее необходимое число пробелов. Если оно содержит дробную часть, LotusScript округляет значение выражения до ближайшего целого. Функция Space возвращает значение типа Variant DataType 8 (String), а функция Space$ возвращает значение типа String.

Пример. Определяет строку из 8-х пробелов значением переменной Spaces.

Dim Spaces As String Spaces = Space$ (8)

Print ">" & Spaces & "<" ' Выводит "> <"

Print Len(Spaces) ' Выводит 8

Функция Spc Синтаксис: Spc ( numExpr)Параметры: numExpr - числовое выражение, значение которого лежит в интервале от О до 32000

включительно.

Вставляет указанное количество пробелов в данные, выводимые операторами Print или Print #, начиная с текущей позиции.

Если для файла определена ширина (длина) выводимой строки (см. оператор Width на стр. Ошибка! Закладка не определена . ) , действие numExpr определяются следующими условиями:

• если значение numExpr меньше ширины, LotusScript выводит numExpr пробелов.

• если значение numExpr больше ширины, LotusScript выводит допустимое количество пробелов, перенося

"остаток" на следующие строки.

Если для файла длина выводимой строки не определена, функция Spc выводит все пробелы в одну строку.Пример. Оператор Print # выводит в файл числа. При этом после каждого числа добавляется пробел. Также

пробел вставляется перед числом, если оно неотрицательно. Мы намеренно добавляем в конец вывода еще один пробел - Spc(1). Вторая и четвертая строки начинаются с двух пробелов: первый пробел добавлен Spc(1), а второй является лидирующим пробелом перед выводимым числом (3 или 8). Во второй строке число 4 следует за тремя пробелами: первый пробел является концевым для "3", второй вставлен Spc(1), а третий является лидирующим для "4".

Open "SPC.TST" For Output As #1

Width #1, 10

For i = 0 To 9

Print #1, i; Spc(l);

Next i

Close #1

' Содержимое полученного файла. Конец каждой строки намеренно '

обозначен символом (в файле такого нет)

'0 1 2 |

' 3 4 |

• 5 6 7 |

8 9 I

Функция S t r

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

221

Page 222: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Синтаксис: St r [$] ( numЕхрг )Тип возвращаемого значения: Str возвращает значение типа Variant DataType 8 (String),

Str$ - типа String. Параметры: numExpr- числовое выражение.

Возвращает строковое представление числа.

Когда LotusScript представляет в виде значения типа String неотрицательное число, впереди добавляется пробел.

Пример. Выводит строковые значения 0, 100 и -100, соответственно. Для положительного значения добавляется

лидирующий пробел.

Dim i As IntegerFor i=-100 To 100 Step 100

Print ">" & Str$(i)

Next i1 Последовательно выводит ">-100", "> 0", "> 100"

Функция S t rCompare

Синтаксис: St rCompare ( stringi, string2 [, compMethod ])Тип возвращаемого значения: Boolean.Параметры: s t r ing i и string2 - строковые выражения.

compMethod - опция, числовое выражение, задающее правило сравнения рок. Флаг может иметь следующие значения:

Вместо StrCompare возможно использовать фукнцию StrComp.

Сравнивает две строки и возвращает результат.

Если аргумент compMethod не указан, то действуют установки оператора Option Compare, если таковой присутствует в текущем модуле. Так, например, действие оператора Option Compare Case, NoPitch равносильно значению опции compMethod = 4. Если в текущем модуле нет оператора Option Compare, то по умолчанию действуют настройки "Case" и "Pitch". Подробнее о способах сравнения строк см. в описании оператора Option Compare на стр. Ошибка! Закладка не определена . .

Следующая таблица определяет результат действия StrCompare, в зависимости от сравниваемых строк._Аргументы Результат сравнения

Оба Null Null

stringi меньше string2 -1

stringi равна string2 0

stringi больше string2 1

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

222

Page 223: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция StringСинтаксис: String[$] ( stringLen , { charCode | stringExpr})Тип возвращаемого значения: String возвращает значение типа Variant DataType 8 (String),

String$ - типа String.Параметры: stringLen - числовое выражение, значение которого определяет число

символов в возвращаемой строке. Если значение выражения дробное, LotusScript округляет значение выражения stringLen до ближайшего целого значения. charCode - числовое выражение типа Long, значение которого определяет код символа на используемой платформе. Диапазон допустимых кодов определяется используемой платформой. stringExpr - строковое выражение. Первый символ этой строки "размножается" в возвращаемой строке.

Возвращает строку, состоящую из символов, определенных указанным кодом в кодировке текущей платформы или первым символом в строке-аргументе.

Пример.

Dim Backs As String, MoreBacks As String

Backs = String$(4, "$")

MoreBacks = String$(8, "$ characters")

Print Backs, MoreBacks 'Выводит $$$$ $$$$$$$$

Функция LTrimСинтаксис: Ltrim[$] ( stringExpr)Тип возвращаемого значения: LTrim возвращает значение типа Variant DataType 8 (String),

LTrimS - типа String. Параметры: stringExpr - строковое выражение.

Удаляет пробелы (если они есть) в начале строки stringExpr и возвращает результат. Функция LTrim возвращает значение типа Variant DataType 8 (String), а функция LTrim$ - типа String.

Пример.

Dim TLeft As String

TLeft = Ltrim$(" InterTrust ")

Print TLeft & "<" ' Выводит " InterTrust <" (пробел в конце остался)

Print Len(TLeft) ' Выводит 16

Пример. Результат получен в ОС Windows ХР SP2Print Strcompare( "qwerty", " '

qwe",0)'Выводит 1 (qwerty > qwe) (Case Pitch)

Print Strcompare( "qwerty", ' " qwertyu

",0) ' Выводит -

1 (qwerty < qwertyu)(Case Pitch)

Print Strcompare( "QWERTY", "qwerty" ,0) 'Выводит 1 (QWERTY > qwerty)(Case Pitch)

Print Strcompare( "QWERTY", "QWERTY" ,1) 'Выводит 0 (идентичны)(NoCase Pitch)

Print Strcompare( "QWERTY", "qwerty" ,2) 'Выводит - 1 (QWERTY < qwerty)(побитно)

Print Strcompare( "QWERTY", "qwerty" ,4) 'Выводит 1 (QWERTY > qwerty)(Case NoPitch)

Print Strcompare( "QWERTY", "qwerty" ,5) 'Выводит 0 (идентичны)(NoCase NoPitch)

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

223

Page 224: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция RTrimСинтаксис: RTrim[$] ( stringExpr)Тип возвращаемого значения: RTrim возвращает значение типа Variant DataType 8 (String),

RTrim$ - типа String. Параметры: stringExpr - строковое выражение.

Удаляет концевые пробелы из строки и возвращает результирующую строку. Параметр stringExpr - выражение типа String.

Пример.

Dim TRight As String

TRight = Rtrim$(" InterTrust ")

Print ">" & TRight & "<" ' Выводит "> InterTrust<" (пробел в начале остался)

Print Len(TRight) • Выводит 17

Функция Tr imСинтаксис: Tr im[$] ( stringExpr)Тип возвращаемого значения: Trim возвращает Variant DataType 8 (String),

Trim$ - типа String. Параметры: stringExpr - строковое выражение.

Удаляет незначащие лидирующие и концевые строки, и возвращает результирующую строку. Возвращаемое значение имеет тип Variant DataType 8 (String), а функция Trim$ - типа String.

Функция оставляет пробелы внутри строки. Для их удаления используйте функцию FullTrim.

Пример.

Dim trimAll As String, testString As String testString$ = " a be " trimAll$ = Trim$(testString$)

Print testString$ 'Выводит " a be "

Print trimAll$ 'Выводит "a be" (пробел в середине остался)

Функция Ful lTr imСинтаксис: Ful lTr im (ехрг )Параметры: ехрr- может быть строкой, массивом или выражением типа Variant, содержащим

массив или строку.

Имеет двойное назначение:• из строки удаляет лидирующие, концевые и повторяющиеся внутренние пробелы;

• из массива удаляет "пустые" элементы.

Результат функции имеет тип Variant и содержит строку, если аргумент был строкой, и массив, если аргумент был массивом.

Из аргумента-строки удаляются лидирующие, концевые и повторяющиеся внутренние пробелы. Кроме того, из строки удаляются и повторяющиеся внутренние символы табуляции, и переводы строки.

Пример. Удаление пустого пространства в строке Dim Stroka As StringStroka={ Bum -Bam -Baks } ' в центре строки несколько

' пробелом и табуляция

Msgbox "Не форматиованная строка: " & Chr(lO) & ">" & Stroka & "<"Msgbox "Форматированная строка: " & Chr(lO) & ">" & Fulltrim(Stroka) & "<" ' Выводит >Bum-Bam -

Back<Функция LCase

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

224

Page 225: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Синтаксис: LCase[$] ( ехрг)Тип возвращаемого значения: LCase возвращает значение типа Variant (String),

LCase$ возвращает значение типа String. Параметры: expr - числовое или строковое выражение.

Возвращает строку, преобразованную к символам нижнего регистра.

Параметр expr - числовое или строковое выражение в функции LCase, или выражение типа Variant, или String в функции LCase$. Функция LCase возвращает значение типа Variant (String), а функция LCase$ возвращает значение типа String.

Функция LCase(Null) возвращает Null. Функция LCase$(Null) возвращает ошибку.

Пример.Print Lease("QWERTY") ' Выводит "qwerty"

Функция UCaseСинтаксис: UCase[$] ( ехрг)Тип возвращаемого значения: UCase возвращает значение типа Variant(String),

UCase$ возвращает значение типа String. Параметры: expr- для функции UCase, числовое или строковое выражение, для функции UCase$ - выражение, типа Variant или строковое выражение.

Преобразует любые символы алфавита в символы верхнего регистра и возвращает результирующую строку.

Функция UCase(Null) возвращает значение Null, функция UCase$(Null) возвращает ошибку.

Пример. Заданная строка символов преобразуется к строке символов верхнего регистра.Print Ucase$("qwerty") ' Выводит "QWERTY"

Функция StrConvСинтаксис: StrConv ( ехрп conversionType ) Тип возвращаемого значения: Variant.Параметры: expr- строковое или числовое выражение. Числовое выражение

преобразуется к строковому виду. conversionType - целое число, определяющее тип преобразования, может

Приведенные в таблице константы описаны в файле Isconst.lss. Преобразовывает строку к другому регистру или

кодировке. Результат работы функции имеет тип Variant.

Если ехрг есть пустая строка, то результат будет пустой строкой; если ехрг - Null, то и результат Null.

Имя константы Значение Тип преобразования

SC Uppercase 1 К верхнему регистру

SC LowerCase 2 К нижнему регистру

SC ProperCase 3 К заглавным буквам

SC Wide 4 Из однобайтной кодировки в двубайтную

SC Narrow 8 Из двубайтной кодировки в однобайтную

SC Katakana 16 Из Hiragana в Katakana

SC_Hiragana 32 Из Katakana в Hiragana

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

225

Page 226: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Asc Синтаксис: Asc ( s t r i n g E x p r )Тип возращаемого значения: Long.Параметры: stringExpr - строковое выражение.

Возвращает код (в кодировки текущей платформы) первого символа строки stringExpr. Тип возвращаемого числа - Long. Если значением выражения stringExpr является Null или пустая строка (""), то функция возвращает ошибку.

Пример.

Dim largeN As Long, small n As Long largeN = AscC'N") smalln = Asc("n")

Print largeN; smalln 'Выводит 78 110

Функция ChrСинтаксис: Chr [$ ] ( n u m E x p r )Тип возвращаемого значения: Chr возвращает результат типа Variant of DataType 8 (String).

Chr$ возвращает результат типа String Параметры: numExpr - числовое выражение типа Long.

Возвращает символ, соответствующей на используемой платформе заданному коду символа. Параметр питЕхрr - числовое выражение типа Long. Действительным будет только значение, лежащее внутри диапазона значений кодов, представляющих символы на используемой платформе. Функция Chr возвращает результат типа Variant of DataType 8 (String). Функция Chr$ возвращает результат типа String.

Если значение numExpr является дробным числом, то оно округляется до целого значения.

Пример.

Dim Alfavit As String Dim ASCIICode As Long

'Генерация и конкатенация символов из кодов ASCII For ASCIICode =

Asc("a") To Asc("fl")

Alfavi t= Alfavit & Chr$(ASCIICode)

Next

Print Alfavit 'Выводит абвгдежзийклмнопрстуфхцчшщъыьэюя

Функция UChr Синтаксис: UChr[$] ( l o n g E x p r )

Пример работы функции StrConv Dim Stroka As String Stroka = "qWeRtY"Print "1: " & Strconv(Stroka, 1) 'Выводит QWERTYPrint "2

:" & St rconv (S t

roka,2) 'Выводит qwerty

Print "3 :

" & St rconv (S t roka

,3) 'Выводит Qwerty

Print "4 :

" & Strconv(Stroka, 4) 'Выводит qWeRtY

Print "5 :

" Sc strconv(Stroka, 8) 'Выводит qWeRtY

Print "6: " & strconv(Stroka, 16) 'Выводит qWeRtY

Print "7: " & strconv(Stroka, 32) 'Выводит qWeRtY

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

226

Page 227: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Тип возвращаемого значения: UChr возвращает значение типа Variant(String), функцияUChr$ возвращает значение типа String. Параметры: longExpr -

выражение, числовое значение которого лежит в диапазоне от 0 до 65535 включительно.

Возвращает символ, заданный числовым кодом Unicode.

Пример.

Dim Alfavit As String Dim BykvaUniCode As Long

For BykvaUniCode = Uni("A") To Uni("H")

Alfavit = Alfavit + Uchr$(BykvaUniCode)

Next

Print Alfavit 'Выводит АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЬЭЮЯ

Функция Uni Синтаксис: Uni ( s t r i n g E x p r )

Тип возвращаемого значения: Long.Параметры: stringExpr - строковое выражение.

Возвращает числовой код Unicode для первого символа строки.

Если значением выражения stringExpr является значение Null или пустая строка (""), то функция возвращает ошибку.

Пример. Выводит коды Unicode, соответствующие символам А и а. Dim a As Long, i As Long a = Uni("A") i

= Uni("Я")

Print a; i ' Выводит 1049 1071Функция UStringСинтаксис: UString[$] ( stringLen , { charCode | stringExpr})Тип возвращаемого значения: UString возвращает значение типа Variant(String),UString$ возвращает значение типа String.Параметры: stringLen - числовое выражение, значение которого определяет количество

повторяющихся символов в возвращаемой строке. LotusScript округляет значение выражения stringLen до ближайшего целого значения.

charCode - числовое выражение, значение которого определяет числовой код повторяющегося символа. Если это необходимо, значение charCode округляется до ближайшего целого значения. Значения кодов Unicode лежат в диапазоне от 0 до 65535 включительно. Если значение выражения charCode меньше 0 или больше 65535, функция возвращает ошибку. stringExpr - строковое выражение. Первый символ этой строки используется, как повторяющийся символ.

Возвращает строку из одинаковых символов. Повторяющийся символ можно определить или числовым кодом или первым символом строки - аргумента.

Пример.

Dim Bykvs As String, MoreBykvs As String Bykvs =

Ustring$(3, Uni("%")) MoreBykvs = Ustring$(5, "#")

Print Bykvs, MoreBykvs 'Выводит %%% #####

© Функция Replace

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

227

Page 228: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Синтаксис: Rep\ace{sourceArray, findArray, replacementArray [, start [, count [, compMethod]]]) Параметры: sourceArray- исходная строка, либо массив строк, который должен быть

изменен.findArray- строка, либо массив строк, состоящий из слов или фраз,

которые нужно заменить в исходном массиве. replacementArray - строка, либо массив строк, состоящий из слов или фраз на которые нужно заменить слова или фразы в исходном массиве.start- необязательный параметр. Число целого типа. Указывает на

позицию символа в каждой строке, с которого начинается поиск изменяемого элемента. count - необязательный параметр. Число целого типа. Указывает сколько

раз должна произойти замена элемента в строке. compMethod - необязательный параметр. Число целого типа. Указывает на метод сравнения строк или фраз.

Замечание. Данная функция появилась в Lotus Notes Domino 6Заменяет слова или фразы в строке(или массиве строк) на определенные новые слова или фразы из указанной

строки.

Если compMethod не используется, то по умолчанию сравнение строк проходит в режиме, установленном при помощи Option Compare для данного модуля. Если для модуля режим сравнения строк не установлен, то в таком случае сравнение просходит с учетом регистра и точного совпадения.

Результатом работы данной функции являются строки или массив строк, которые содержат исходную строку или массив строк,в которой заменены слова или фразы, входящие в строку или массив строк из findArray, на соответствующие слова или элементы массива строк из replacementArray.

Replace ищет строку из findArray в sourceArray. Если совпадение будет найдено, то подстрока заменяется соответствующей подстрокой из replacementArray. Каждая строка из findArray сравнивается с каждой строкой из sourceArray до внесения изменений. Изменения вносятся с учетом регистра. В случае когда совпадений нет, функция возвращает исходную строку или массив. Если в findArray строк больше чем в replacementArray, то дополнительные строки в findArray заменяются на последнюю строку в replacementArray. Случай когда строк в findArray меньше, чем в replacemetArray, игнорируется.

Пример 1. Работа функции Replace со строками Dim

sl$, s2$, s3$, sret$ з1="0дин Пять Три"

з2="Пять" s3="flBa"

sret$=Replace(si,s2,s3) Print sret$ 'Выведет Один Два

Три

Пример 2. Работа функции Replace с массивом строк

Dim SourceArr(2) As String, FindArr(2) As String, ReplaceArr(2) As String Dim Result

SourceArr(O) = "aaaa" SourceArr(l) = "bbbb" SourceArr(2) = "cccc" FindArr (0) =

"dddd" FindArr(l) = "cccc" FindArr(2) = "eeee" ReplaceArr(O) = "qqqq" ReplaceArr (1)

= "vvw" ReplaceArr(2) = "mmmm"

Result = Replace(SourceArr, FindArr, ReplaceArr)

CompMethod Способ сравнения0 С учетом регистра. С учетом "Pitch"1 Без учета регистра. С учетом "Pitch"4 С учетом регистра. Без учета "Pitch"5 Без учета регистра. Без учета "Pitch"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

228

Page 229: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Forall x In Result

Print x

End Forall' Выведет: ' aaaa 'bbbb ' vwv

©Функция SplitСинтаксис: Split (expression [, delimiter[, count[, compMethod]]]) Тип возвращаемого значения: массив строк.Параметры: expression - скалярное выражение типа String (строка), которое можно

разделить на подстроки. delimiter - необязательный параметр. Разделитель, который будет

использоваться для разделения подстрок в строке, чтобы разделить между собой элементы будущего массива. Если разделитель не указан, то по умолчанию используется пробел. count- значение целого типа, указывает на количество возвращаемых

подстрок в массиве. По умолчанию значение равно -1, что означает что будут возвращены все подстроки. compMethod - необязательный параметр. Число целого типа. Указывает на метод сравнения строк.

З а м е ч а н и е . Д а н н а я ф у н к ц и я п о я в и л а с ь в L o t u s N o t e s D o m i n o 6

Возвращает массив строк, состоящий из подстрок заданной строки.

Если compMethod не используется, то по умолчанию сравнение строк проходит режиме, установленном при помощи Option Compare для данного модуля. Если для модуля режим сравнения строк не установлен, то в таком случае сравнение просходит с учетом регистра и точного совпадения.

В результате работы функции возвращается массив строк, каждый элемент которого содержит подстроку из исходной строки.

Split разбирает исходную строку на подстроки и возвращает массив полученных подстрок. Для выделения подстроки используется разделитель. Если разделитель не указан, то по умолчанию используется пробел. Пробелы, перевод каретки в выделенной подстроке не обрезаются. В случае когда количество реально выделенных элементов больше, чем указанное в функции количество возвращаемых элементов, последний элемент результирующего массива будет содержать оставшуюся часть строки после заполнения указанного количества элементов. В том случае когда указанное количество возвращаемых элементов больше реально выделенных элементов в строке, фукнция Split вернет массив строк реально выделенных элементов строки,а не указанное в функции.

Split может вернуть Run Time ошибку "Type Mismatch" в случае, когда выражение или разделитель не скалярная строка. Так же может возникнуть Run Time ошибка "Argument Out of Range error» в случае, когда количество элементов в результирующем массиве -1.

CompMethod Способ сравнения0 С учетом регистра. С учетом "Pitch"1 Без учета регистра. С учетом "Pitch"2 Побитовое сравнение4 С учетом регистра. Без учета "Pitch"5 Без учета регистра. Без учета "Pitch"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

229

Page 230: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример 1. Работа функции Split. Dim

sLnd$, aLnd aLnd=Evaluate({""})

sLnd$="Lotus Notes Domino 8.x"

aLnd=Sp1i t (s Lnd$) Forall x In

aLnd

Print x

End Forall

'Notes

'Domino

'8.x

Пример 2. Работа функции Split, когда явно задан разделитель Dim

sLnd$, aLnd aLnd=Evaluate({""}) sLnd$="Lotus Notes Domino

8.x" aLnd=Split(sLnd$ ," . ") Forall x In aLnd

Print x

End Forall

'Выведет:

'x

Пример 3. Работа функции Split, когда реально выделенных элементов больше чем указанное количество возвращаемых значений.

Dim sLnd$, aLnd

aLnd=Evaluate({""})

sLnd$="Lotus Notes Domino 8.x"

aLnd=Split(sLnd$," " ,3)

Forall x In aLnd

Print x

End Forall

'Выведет:'Lotus'Notes

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

230

Page 231: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Оператор T ime (установить системное время)

Синтаксис: T ime[$ ] = timeExprПараметры: timeExpr - выражение, значением которого является дата-время типа String или Variant.

Устанавливает значение системного времени.

Функция Now Синтаксис: NowТип возвращаемого значения: Variant DataType7 (Date/Time). Параметры: отсутствуют.

Возвращает текущее системное значение даты-времени. Возвращаемое значение имеет тип Variant DataType7 (Date/Time).

Значение дата-время представляет собой восьмибайтовое число с плавающей точкой. Целая часть представляет собой порядковый номер текущего дня, считая с 1 января 100 г. н.э. Дробная часть представляет время текущего дня,

считая с полуночи предыдущего дня.

Пример. Вывод на экран текущей даты и времени в формате Long Date.

Long Date") 'Выводит 23 March 2008 r.

General Date " ) 'Выводит 23.03.2008 13:29:13

Medium Date" ) 'Выводит 23-Mar-08

Short Date") 'Выводит 23.03.2008

Long Time") 'Выводит 13:29:13

Medium Time" ) 'Выводит 01:29 РМ

Short Time") 'Выводит 13:29

Функция Date

Print Format(Now()

Print Format(Now()

Print Format(Now()

Print Format(Now()

Print Format(Now()

Print Format(Now()

Print Format(Now()

'Domino 8.x

1.8 .4 Операторы и функции обработки данных типа "дата -время"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

231

Page 232: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

232

Page 233: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Синтаксис: Date[$]Тип возвращаемого значения:

Параметры: отсутствуют.Date - Variant DataType 7 (Date/Time) Date$ - типа String.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

233

Page 234: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

234

Page 235: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Возвращает текущую дату. Возвращаемое функцией Date значение является целой частью значения, возвращаемого функцией Now и имеет тип Variant DataType 7 (Date/Time), а функцией Date$ - типа String.

Функция Date эквивалентна функции Today.

Пример: Выводится строка "05/25/99" если установлена текущая системная дата 25 мая 1999. Print Date$

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

235

Page 236: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Today Синтаксис: TodayТип возвращаемого значения: Variant DataType 7 (Date/Time). Параметры: отсутствуют.

Возвращает значение системной даты. Тип Variant DataType 7 (Date/Time). Это значение является целой частью выражения, возвращаемого функцией Now.

Пример. Значение, возвращаемое функцией Today, присваивается переменной whenNow типа String.

Dim whenNow As String whenNow$ = Today()

Print whenNow$ 'Выводит 6/7/95

Функция T imeСинтаксис: T ime[$ ]

Тип возвращаемого значения: Time возвращает значение типа Variant DataType(Date/Time),Time$ - типа String.

Парамеры: отсутствуют.

Функция Time возвращает значение текущего времени. частью значения, возвращаемого функцией Now. Функция DataType7 (Date/Time), a Time$ - типа String.

Пример.

Dim NowTime As String

NowTime$ = Time$()

Print NowTime$ 'Выводит системное время

Функция DateNumber Синтаксис: DateNumber ( год, месяц, день )Тип возвращаемого значения: Variant DataType 7 (Date/Time).Параметры: год - числовое выражение, определяющее год.

месяц - числовое выражение, определяющее месяц года, принимающеезначения от 1 до 12 включительно. день - числовое выражение, определяющее день

месяца, принимающее значения в диапазоне от 1 до 31.

Возвращает дату, соответствующую указанным году, месяцу и дню. Возвращаемое значение имеет тип Variant DataType7 (Date/Time).

Вместо DateNumber возможно использовать DateSerial.

год - числовое выражение, определяющее год.

месяц - числовое выражение, определяющее месяц года, принимающее значения от 1 до 12 включительно. Если месяц представлен отрицательным значением, функция DateNumber пересчитывает его, вычитая текущее значение из 12 и относит полученное значение месяца к прошедшему году. Например, если год равен 1999, а месяц равен -2, будет получена дата Октябрь, 1998.

день - числовое выражение, определяющее день месяца, принимающее значения в диапазоне от 1 до 31. Если значение выражения является отрицательным числом, то функция DateNumber вычисляет

Возвращаемое значение является дробной Time возвращает значение типа Variant

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

236

Page 237: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

значение дня, как разность между максимальным значением дня для предыдущего месяца и этим значением. Например, DateNumber(1995, 5, -3) соответствует дате Апрель, 27, 1995.

Пример. Вычисление значения даты с использованием отрицательных аргументов. Print

Datenumber(2008, 03, 23) 'Выводит 23.03.2008

Print Datenumber (2008, 7-4, 15 + 9) 'Выводит 24.03.2008

Print Datenumber (2010, -20, -6) 'Выводит 25.03.2008

Функция T imeNumber Синтаксис: T imeNumber ( час, минута, секунда )Тип возвращаемого значения: Variant DataType 7 (Date/Time).Параметры: час - числовое выражение, представляющее значение "час", принимающее

значения от 0 до 23 включительно. минута - числовое выражение, представляющее значение "минута",

принимающее значения от 0 до 59 включительно. секунда - числовое выражение, представляющее значение "секунда", принимающее значения от 0 до 59 включительно.

В м е с т о T i m e N u m b e r в о з м о ж н о и с п о л ь з о в а т ь ф у н к ц и ю T i m e S e r i a l

Возвращает значение времени, соответствующее заданным часу, минуте и секунде. Возвращаемое значение имеет тип Variant DataType7 (Date/Time).

Пример. Выводит значения времени: час, минута, секунда

Print Timenumber (13 , 50, 15) 'Выводит 13:50:15

Print Timenumber (15 , -10, 59-44) 'Выводит 14:50:15

Print Timenumber (16 , -9, -45) 'Выводит 15:50:15

Функция DateValue Синтаксис: DateValue ( stringExp )Тип возвращаемого значения: Variant DataType 7 (Date/Time).Параметры: stringExp - строковое выражение, представляющее значение даты-времени, имеющее тип String или

тип Variant.

Возвращает значение даты в виде строкового выражения.

Параметр stringExp - строковое выражение, представляющее значение даты-времени, имеющее тип String или тип Variant. Возвращаемое значение имеет тип Variant DataType7 (Date/Time).

Если в выражении пропущено значение года, оно будет определено из системной текущей даты. Если выражение содержит числа с соответствующими разделителями, то в зависимости от их порядка следования будут определены номера месяца, дня и года. Значение года, определенного 2 цифрами эквивалентно полному, 4 - х цифровому, определению, например: 17 и 1917 являются одинаковыми определениями года.

Функция T imeValueСинтаксис: T imeValue ( stringExpr)Тип возвращаемого значения: Variant DataType 7 (Date/Time).Параметры: stringExpr- значения даты-времени типа Variant DataType7 (Date/Time).

Возвращает значение времени из выражения stringExpr - значения даты-времени типа Variant DataType7 (Date/Time). Возвращаемое значение имеет тип Variant (Data/Time) и содержит дробную часть значения дата-время.

Можно использовать как 12-и, так и 24-х часовой формат, поэтому значения 14:35 и 2:35РМ равноправны. Если в значении аргумента stringExpr пропущено значение "секунда", то оно будет установлено в ноль.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

237

Page 238: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Переменной fractionalDay присваивается значение 0.25 Dim

PartDay As Single PartDay = Timevalue("12:00") Print

PartDay 'Выводит .5

Функция YearСинтаксис: Year ( dateExpr)

Для аргумента дата-время возвращает значение года.

Параметр dateExpr - "дата-время" типа String или Variant DataType7 (Date/Time). Возвращаемое значение имеет тип Variant DataType 2 (Integer).

Функция Year(Null) возвращает значение Null.

Пример.Print Year(Datenumber(2008, 3, 23)) ' Выводит 2008

Функция Month Синтаксис: Month

( dateExpr)Тип возвращаемого значения: Variant of DataType 2 (Integer). Параметры: dateExpr - выражение "дата-время" типа String или Variant.

Возвращает месяц в виде числа от 1 до 12 для аргумента типа дата-время.

Параметр dateExpr - выражение "дата-время" типа String или Variant. Тип данных возвращаемого значения - Variant of DataType 2 (Integer).

Функция Month(Null) возвращает значение Null.

Пример.Print Month(Datenumber(2008, 3, 23)) ' Выводит 3

Функция Day Синтаксис: Day ( dateExpr)Тип возвращаемого значения: Variant of DataType 2 (Integer).

Параметры: dateExpr- допустимая строка дата-время типа String или типа Variant. Возвращает день месяца (целое

число от 1 до 31) для аргумента дата-время.

Параметр dateExpr - допустимая строка дата-время типа String или типа Variant. Возвращаемое значение имеет тип Variant (Integer).

Значение года, определенное двумя цифрами (см. пример выше) определяется как число из 4 цифр.

Функция Day(Null) возвращает значение Null.

Пример.Print Day(Datenumber(2008, 3, 23)) ' Выводит 23

Функция Hour Синтаксис: Hour ( dateExpr)Тип возвращаемого значения: Variant of DataType 2 (Integer).Параметры: dateExpr- допустимая строка, содержащая значение даты-времени типа String или Variant.

Возвращает время дня - только час в интервале 0 - 23 - для аргумента дата-время.

Параметр dateExpr - допустимая строка, содержащая значение даты-времени типа String или Variant. Возвращаемое значение имеет тип Variant of DataType 2 (Integer).

Если выражение dateExpr типа Variant содержит значение Null, то функция Hour возвращает значение Null.

Функция Minute Синтаксис: Minute ( dateExpr)

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

238

Page 239: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Тип возвращаемого значения: Variant of DataType 2 (Integer).Параметры: dateExpr - выражение, содержащее значение даты/времени, типа String или Variant.

Возвращает значение минут (целое число от 0 до 59) для аргумента дата-время.

Параметр dateExpr - выражение, содержащее значение даты/времени, типа String или Variant. Тип возвращаемого значения - Variant of DataType 2 (Integer).

Функция Minute(Null) возвращает значение Null.

Функция Second Синтаксис: Second ( dateExpr)Тип возвращаемого значения: Variant of DataType 2 (Integer). Параметры: dateExpr - строка дата-время типа String

или Variant.

Возвращает секунды (целое значение от 0 до 59) для аргумента дата-время.

Параметр dateExpr - строка дата-время типа String или Variant. Возвращаемое значение имеет тип Variant of DataType 2 (Integer).

Функция Second(Null) возвращает значение Null.Пример работы функций Hour, Minute, Second. Формируется сообщения о текущем времени: часе, минутах и

секундах текущего дня.

Dim NowTime As String, Hr As String

Dim Min As String, Sec As String, Mess As String

NowTime = Format(Time, "hh:mm:ss")

Hr = Str(23 - Hour(Time))

Min = Str (59 - Minute (Time) )

Sec = Str(60 - Second(Time))

Mess = {Текущее время: ) & NowTime & ". " & Chr(13) & Chr(10) & {До начала

следующего дня осталось: ) & Hr & { ч. } & Min & { мин. ) & Sec & " сек. "

Messagebox(Mess)

Функция T imer Синтаксис: T imerТип возвращаемого значения: Single. Параметры: отсутствуют.

Возвращает время в секундах от полуночи до текущего момента. Возвращаемое значение имеет тип Single.

Пример. Определяется длительность выполнения цикла из 320000 итераций. Dim

StartTime As Single, WorkTime As Single StartTime = Timer() For i = 1 To

320000 Next

WorkTime = Timer() - StartTimePrint i-1 & " итераций за " ; WorkTime; " секунд" ' Выводит 320000 итераций за .6992188

секунд"

Функция Weekday Синтаксис: Weekday ( dateExpr)

Тип возвращаемого значения: Variant of DataType 2 (Integer).Параметры: dateExpr - значение даты-времени типа String или Variant DataType7 (Date/Time).

Возвращает номер дня недели (в интервале от 1 до 7) для аргумента типа дата-время. Параметр dateExpr - значение даты-времени типа String или Variant DataType7 (Date/Time). Тип возвращаемого значения - Variant of DataType 2 (Integer) или Integer (от 1 до 7). Первым днем недели считается воскресенье, вторым - понедельник, и т.д.

Функция Weekday(Null) возвращает значение Null.

Пример.Print Weekday (Datenumber (2008, 3, 28)) 'Выводит: 6

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

239

Page 240: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.8.5 Форматирование данных (функция Format)

Format[$] ( ехрг [ , fmt])

Синтаксис: Format [$] ( expr[, fmt])Тип возвращаемого значения: Format возвращает строку типа Variant,

Format$ возвращает строку типа String. Параметры: ехрг - любое выражение.

fmt- опция, являющаяся строкой форматирования.

Форматирует число, значение дата-время или строку, для которых возможна эта операция. Параметр ехрг- любое выражение, которое оценивается:

• как числовое, если fmt имеет числовой формат;

• как дата-время, если fmt имеет формат даты-времени;

• как строка, если fmt имеет формат строки.

fmt - опция, являющаяся строкой форматирования, которая может быть:

• строкой, содержащей имя предварительно определенного формата;

• строкой символов формата.

Если строка fmt не является строкой формата, то функция Format$ выполняется, как функция Str[$],

Функция Format возвращает строку типа Variant, а функция Formats возвращает строку типа String. Если значением выражения ехрг является строка и значением опции fmt - число в строковом формате, то предпринимается попытка преобразовать строку в число. При успешном выполнении этой операции результат форматируется.

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

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

Имя числового формата ОТОБРАЖАЕМОЕ ЗНАЧЕНИЕ ДЛЯ EXPR

General Number Как хранится, без разделения тысяч

Currency Отображение, в денежном формате, использующее системные назначения ОС. В OS/2, функция не будет добавлять знак $ к числу

Fixed Наименьшее значение изображается с одним знаком слева от десятичного разделителя, и округление до двух знаков справа от десятичного разделителя

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

240

Page 241: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Коды числового форматирования

Standard С разделителем тысяч и двумя знаками после десятичного разделителя

Percent Значение ехрг в интервале от 0 до 100, с добавлением (%) после числа и окрулением до двух знаков после десятичного разделителя

Scientific Научное представление (в экспоненциальной форме) с добавлением в конце символа Е и показателя степени со знаком

Yes/No No, если число равно 0, в противном случае - Yes

True/False False, если число равно 0, в противном случае - True

On/Off. Off, если число равно 0, в противном случае - On

Следующая таблица представляет символы, используемые для числового форматирования.Код Значение

"" (Empty) Вывод не форматированного числа

0 (ноль) Специальный цифровой режим. Выводит нуль для любой незначащей цифры в формате, показывая все значащие цифры слева и справа от разделителя целой и дробной части. Если количество цифр в числе превышает определенное в формате, число округляется до ближайшего подходящего значения.

# (знак фунта) Условное цифровое отображение. Соответствует использованию 0 с исключением значащих цифр справа и слева от десятичного разделителя.

. (точка) Десятичный разделитель. Позиция десятичного разделителя в формате. Если форматный код включает в себя 0 непосредственно слева от десятичного разделителя, а число между ними -1 и с 1 начинается отделяемая часть, то будет использовано положение десятичного разделителя определенное используемой операционной платформой.

%(процент) Процентная величина. Определяет число, значение которого не превышает 100, имеющее в последней позиции знак %.

,(запятая) Разделитель тысяч. Разделяет число на группы по три значащих цифры, начиная с первой после десятичного разделителя.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

241

Page 242: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Строка форматирования может содержать в себе от одной до четырех секций, разделенных знаком точка с запятой ( ; ). При наличии в формате более одной секции, секции, следующие за первой определяют форматирование других значений числового выражения. Следующая таблица определяет использование секций в одно - и многосекционной строке форматирования.

Форматирование данных дата-время

Буквенные символы. Показываются в числе, если они использованы в строке форматирования.

\ Буквенная приставка. Обеспечивает отображение следующего за ней символа, например \# отображает #. Для отображения самого знака \ используется \\.

"ABC" Литеральная строка, заключенная в кавычки. Для спецификации значения кавычек используется Chr(34). Символы, заключенные в кавычки определяют символы, отображаемые форматной строкой.

Разделяет секции формата - положительную, отрицательную, нулевую 0 и Null- секцию. Если пропущена отрицательная или 0 секция, но присутствуют разделители этих секций, форматирование происходит также, как и при их наличии.

Секции Описание

Одна Формат, используемый для всех чисел

ДвеПервая секция форматирует положительные числа и 0. Вторая секция форматирует отрицательные

числа

ТриПервая секция форматирует положительные числа. Вторая секция форматирует отрицательные

числа. Третья секция форматирует 0.

ЧетыреПервая секция форматирует положительные числа. Вторая секция форматирует отрицательные

числа. Третья секция форматирует 0. Четвертая секция форматирует Null.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

242

Page 243: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Коды форматирования данных дата-время

Следующая таблица описывает символы, которые могут использоваться в форматах, созданных для представления значений дата-время.

Т.к. значение дата-время имеет внутреннее представление в виде числа с плавающей точкой, то это значение может форматироваться, как число, или как дата-время. Возможное использование любого из

указанных форматов, или с эормата, созданного пользователем, представлено в следующей секции.

Название формата дата - время

Представление переменной дата -время

General Date Стандартный формат. Преобразуется в формат числа с плавающей точкой дата-время. Если число имеет дробную часть, то представляется только дата. Если число не имеет целой части, представляется только время.

Long Date Long Date определяется используемой ОС в рамках международного стандарта.

Medium Date dd-mmm-yy (yy/mmm/dd в Японии).

Short Date Short Date определяется используемой ОС в рамках международного стандарта.

Long Time Long Time определяется используемой ОС в рамках международного стандарта. Long Time всегда показывает текущее значение времени (час, минута, секунда).

Medium Time Часы (0 - 12) и минуты, использующие разделитель для дата-время и описание АМ/РМ (АМРМ в Японии)

Short Time Часы (0 - 23) и минуты, используется только разделитель дата-время.

Код Значение:

Разделитель времени. Разделяет часы, минуты, секунды в формате значения времени.

/ Разделитель даты. Разделяет день, месяц и год в формате значения даты.

с Представляет дату в виде ddddd, и время в виде ttttt (см. ниже).

У Номер дня в году (1 - 366).

d День в месяце (1 - 31).

dd День в месяце (01 - 31).

Ddd Сокращенное название дня недели (Sun - Sat).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

243

Page 244: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

dddd Промежуток времени между днями недели (Sunday - Saturday).

Ddddd Положение цифр в дате (день, месяц, год) в международном формате строка Short Date. В противном случае по умолчанию используется формат mm/dd/yy.

Dddddd Положение цифр в дате (день, месяц, год) в международном формате строка Short Date. В противном случае по умолчанию используется формат mmmm dd, yyyy.

w Номер дня недели (1 - 7). Воскресенье -1.

WW Номер недели в году (1 - 53).

m Номер месяца в году (1 - 12). Если в этом формате присутствует символ h, минуты представляются в диапазоне 0 - 59.

mm Номер месяца в году в виде (01 -12). Если в этом формате присутствует символ h, минуты представляются в диапазоне 00 - 59.

Mmm Сокращенное 3-х символьное название месяца (Jan - Dec).

mmmm Промежуток времени между месяцами года (January - December).

q Номер квартала в году (1 - 4).

УУ Две последние цифры года (00 - 99).

Yyyy Полное значение года (0100 - 9999).

h Значение часа дня в виде (0 - 23).

hh Значение часа дня в виде (00 - 23).

n Значение минуты в часе в виде (0 - 59).

nn Значение минуты в часе в виде (00 - 59).

s Значение секунды в минуте в виде (0 - 59).

ss Значение секунды в минуте в виде ((00 - 59).

Ttttt Значение времени, включающее значения часа, минут, секунд, использующее разделитель, предусмотренный текущей ОС. Если используется дополняющее значение 0 (01), предусмотренное в системе, то время имеет формат 10:00 AM или РМ. По умолчанию формат времени имеет вид h:mm:ss.

AM/PM Используется часовой интервал от 1 до 12, с указанием AM или am/pm РМ в зависимости от половины дня (до и после полудня).

A/P a/p Используется часовой интервал от 1 до 12, с указанием А или Р в зависимости от половины дня (до и после полудня).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

244

Page 245: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Используются значения часа дня в интервале от 1 до 12. В файле WIN.INI время содержится в виде строки 1159 для дополуденных значений часа, и в виде 2359 для послеполуденных. Для АМРМ не имеет значения используемый

регистр клавиатуры. По умолчанию используется представление АМ/РМ.

Следующая таблица демонстрирует использование форматирования даты/времени для даты 26 марта 2008 г. и времени 1:39:15:

Коды форматирования строковых данных

Форматировать строку можно с помощью функций Format или Formats, использующих коды форматирования. Строка форматирования может состоять из одной или двух секций, разделенных знаком (;). Односекционный формат воздействует на все строки, в двухсекционном, первая секция воздействует на непустую строку, а вторая на строку со значением Null или ("").

Следующая таблица определяет символы, использующиеся при создании формата для строки.

Формат Представление

m/d/yy 3.26.08

d-mmm-yy 26-Mar-08

d-mmmm 26-March

mmmm-yy March-08

У 86

hh:mm АМ/РМ 01:39 AM

h:mm:ss a/p 1:39:15 a

h:mm 1:39

h:mm:ss 1:39:15

m/d/yy h:mm 3.26.08 1:39

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

245

Page 246: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Код Значение

@ Представление данного символа. Если строка формата включает в себя этот символ, то он выводится в соответствующую позицию, иначе выводится пробел. При наличии (@) формат должен содержать знак (I).

& Опция представления символа. Если строка формата включает в себя этот символ, то он выводится в соответствующую позицию. В противном случае ничего не выводится. При наличии (&) формат должен содержать знак (!).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

246

Page 247: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример.

Dim RealManey As Currency, DreamManey As Currency, Dif As Currency RealManey =

Ccur(Inputbox("Какова Ваша зарплата в месяц?")) DreamManey = Ccur(Inputbox("Сколько Вы хотите

зарабатывать в месяц?")) Dif = RealManey - DreamManey

Messagebox "Разница между реальной и желаемой з\п: " & Format(Abs(Dif), "Currency")

1.8.6 Функции работы с массивами

Оператор Option Base Синтаксис: Option Base base

Оператор устанавливает нижнюю границу по умолчанию для всех измерений массивов в значении base (0 или 1). По умолчанию нижняя граница измерений массивов установлена в 0.

Option Base действует в пределах, содержащего его модуля и может использоваться в модуле только один раз. Если он используется, то должен предшествовать объявлениям всех массивов и операторам ReDim в этом модуле.

Пример. Создание одномерного массива из 10 элементов (от агг(1) до агг(10)) с начальным значением индекса равным 1.

Option Base 1

Dim arr(10) As Integer

i=0

Forall x In sample i=i+l End Forall

Print {Всего: } & i & { элементов) ' выводит Всего: 10 элементовФункция LBoundСинтаксис: LBound ( arrayName [, dimension ]) Тип возвращаемого значения: Integer. Параметры: arrayName - имя массива.

dimension - опция, целое число, определяющее измерение массива, значение нижней границы которого необходимо получить.

Возвращает значение нижней границы указанного измерения массива.

arrayName - имя массива.

Параметр dimension - опция, целое число, определяющее измерение массива, значение нижней границы которого необходимо получить. Возвращаемое значение имеет тип Integer.

По умолчанию нижняя граница размерности массива есть 0 или 1, что определяется назначениями в Option Base (см. описание опции Option Base на стр. 354).

< Все символы форматируемой строки, соответствующие нижнему регистру.

> Все символы форматируемой строки, соответствующие верхнему регистру.

! Заполнение символами @ или & слева направо

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

247

Page 248: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Dim arr(5 То 15)

Print Lbound(arr) ' Выводит: 5

Функция UBound Синтаксис: UBound ( arrayName [, dimension ]) Тип возвращаемо значания: Integer. Параметры: arrayName - имя массива.

dimension - опция, целое число, определяющее измерение массива, значение нижней границы которого необходимо получить.

Возвращает значение верхней границы указанного измерения dimension массива arrayName. Возвращаемое значение имеет тип Integer. По умолчанию параметр dimension устанавливается равным 1. Размерность массива устанавливается при объявлении массива фиксированного размера, или при использовании функции ReDim для определения размерности динамического массива.

Пример.

Dim arrl(2 To 4)

Print Ubound(arrl) 'Выводит: 4

Dim arr2 (3 To 9,4 To 16)

Print Ubound(arr2) 'Выводит: 9

Print Ubound(arr2,2) 'Выводит: 16

Функция ArrayAppend Синтаксис: ArrayAppend( sourceArrayl, sourceArray2)Тип возвращаемого значения: Variant, содержащим массив.Параметры: sourceArray1 - значение типа Variant, содержащее массив.

sourceArray2 - произвольное значение типа Variant.

Добавляет массив к другому массиву и возвращает результирующий третий массив.

Если вы уже знакомы с языком @-формул Notes, то функцию ArrayAppend удобно понимать как аналог оператора":".

Возвращаемый результат является значением типа Variant, содержащим массив. Данный массив обладает следующими свойствами:

• размерность получаемого массива равна сумме размерностей аргументов (если sourceArray2 - скалярное

значение, то оно рассматривается как одноэлементный массив);

• если объединяются массивы одинаковых типов, то результирующий массив получается того же типа;

• если объединяются массивы разных типов, то результирующий массив содержит значения типа Variant, но

реальные типы элементов совпадают с типами соответствующих элементов исходных массивов;

• нижнее значение измерения совпадает с оным в sourceArrayl.

Функция не затрагивает оригинальных значений аргументов - sourceArrayl и sourceArray2.

Притом, что второй аргумент - sourceArray2 - может быть скалярным значением или одномерным массивом, первый аргумент обязан быть одномерным массивом. В противном случае возникает ошибка времени исполнения "Type Mismatch".

Превышение максимально допустимой размерности массива также приводит к ошибке времени исполнения - "Subscript out of range".

Пример 1. Объединение двух массивов различных типов. Dim arr1(2) As Integer Dim arr2(1) As String Dim arr3,

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

248

Page 249: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

i% arr1(0) = 1 arr1(1) = 2 arr1(2) = 3 arr2(0) = 4 arr2 (1) = 5arr3 = Arrayappend(arr1, arr2) For i% = Lbound(arr3) To Ubound(arr3) Print i%, Typename(arr3(i%))Next' Вывод в строке состояния:

4 STRINGФункция ArrayGet lndexСинтаксис: ArrayGet lndex( sourceArray, searchValue [, compMethod]) Тип возвращаемого значения: Long.

Параметры: sourceArray - массив или значение типа Variant, содержащее массив.searchValue - произвольное значение.compMethod - числовая опция, задающая правила сравнения значений.

Возвращает позицию значения searchValue в массиве sourceArray.

Если вы уже знакомы с языком @-формул Notes, то функцию ArrayGetlndex удобно понимать как аналог функции @Member.

Если искомое значение присутствует в массиве, то результатом является значение Variant типа Long, содержащее номер позиции искомого значения в массиве. Если значение searchValue не содержится в массиве sourceArray, то возвращается NULL.

При выполнении сравнения и элементы массива sourceArray, и значение searchValue предварительно преобразуются к строковому виду. Те элементы, преобразование которых в строковом виде невозможно, в сравнении не участвуют.

В случае если массив sourceArray имеет несколько измерений, позиция элемента определяется по следующему правилу. Массив виртуально представляется имеющим одно измерение с размерностью равной сумме размерностей всех его измерений. Индекс представляется состоящим из нескольких частей - по числу измерений оригинального массива. "Быстрее" изменяется первая часть индекса, соответствующая первому измерению. Данное правило иллюстрирует пример 2.

Опция compMethod является числом 0, 1, 4 или 5. Определение этих значений аналогично определению для функции InStr (см. описание функции InStr на стр. Ошибка ! Закладка не определена. ) . В случае, если опция пропущена, используется значение по умолчанию, определяемое наличием или отсутствием для текущего модуля опции Option Compare (стр. 163).

Пример 1. Использование функции ArrayGetlndex Dim

arr(2) As Integer arr(0) = 1 arr (1) = 3 arr(2)

= 4

Print Arraygetindex(arr, 1), Arraygetindex(arr, "4"), Arraygetindex(arr, 8) ' Вывод в

строке состояния ' 0 2 Null

Пример 2. Случай

массива с

несколькими

измерениями Dim

arr(l, 1) As

Variant arr (0,

0) = "1" arr (1,

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

249

Page 250: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

0) = "3" arr(0,

1) = "4" arr (1,

1) = "7"

Print Arraygetindex(arr, "1"), Arraygetindex(arr, "4"),_

Arraygetindex(arr, "8") ' Вывод в строке состоянияФункция ArrayReplace Синтаксис: ArrayReplace ( arrayName, v2, v3)

ArrayReplace( sourceArray, compareArray, replaceArray ) Параметры: sourceArray - значение типа Variant, содержащее массив.

compareArray, replaceArray - значения типа Variant, содержащие массивы; могут быть скалярными значениями - тогда они понимаются как массив размерности 1.

Функция возвращает копию массива sourceArray, в котором элементы, имеющие аналоги в compareArray, заменяются на соответствующие элементы replaceArray.

Если вы уже знакомы с языком @-формул Notes, то функцию ArrayReplace удобно понимать как аналог функции @Replace.

Результат возвращается в виде значения Variant, содержащего массив. Результирующий массив строится по следующему правилу. Функция создает копию массива sourceArray и в процессе поэлементного копирования проверяет, имеется ли очередной элемент массива sourceArray в массиве compareArray. Если совпадение обнаружено, в результирующий массив помещается элемент массива replaceArray, находящийся на той же позиции в replaceArray, что и совпавший в compareArray. Если индекс совпавшего элемента в массиве compareArray больше размерности массива replaceArray, то копируется пустой элемент - 0 или пустая строка. Очевидно, что размерность массива-результата равна размерности исходного массива sourceArray.

При выборе элемента из массива replaceArray используется не абсолютное значение индекса элемента в compareArray, а относительное. Лучше показать это на примере. Предположим, массив compareArray имеет индекс (-10, -1, 0), а массив replaceArray - (1, 10). Тогда элементу compareArray (-10) соответствует элемент replaceArray (1), элементу compareArray (-1) - replaceArray (10), а индекс элемента compareArray (0) уже выходит за пределы размерности replaceArray.

В последней реализации функции (на момент написания этих строк последней является версия 8.0.1) не производится никакого преобразования типов данных элементов массивов. Это означает, что совпадение элементов массивов sourceArray и compareArray может быть обнаружено только тогда, когда элементы имеют одинаковый тип. Это видно и из примеров 2 и 3.

Кроме того, опыт использования этой функции показывает, что не производится сравнение элементов типа дата/время. Это видно в примере 1.

Пример 1.

Option Declare

Dim v1(2) As Integer, v2(2) As Integer,

Dim v3 (0) As Variant, v4 (0) as Variant

Dim res1, res2, res3

Dim i as Integer

v1 (0) = 1

v1(1) = 2

v1 (2) = 9 ' массив v1 = [1, 2, 9]

v2(0) = 1

v2 (1) =2

v2(2) = 3 ' массив v2 = [1, 2, 3]

v3 (0) = Today ' массив v3 = [20.05.99]

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

250

Page 251: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

v4 (0) = Cstr (v3 (0) ) ' массив v4 = ("20.05.99"] res1 = Arrayreplace (vl, v2, v3)

• resl = [20.05.99, 0, 9] For i% = Lbound(res1) To

Ubound(resi)

Print resl(i%) , Typename(resl (i%))

Next

' выводит:

res2 = Arrayreplace (v3, v3, 999)

' res2 = [20.05.99]

' не работает сравнение элементов типа DATE res3 = Arrayreplace(v4, v4,

999)

' res3 = [999] ' но работает сравнение элементов типа Variant, '

содержащих строку

Пример 2. Не сравниваются элементы массивов разных типов Dim v1(l) As Integer, v2(l) As String,

v3(0) As Variant Dim resl v1 (0) = 1 v1(l) = 9 v2 (0) = "1" v2(1) = "2" v3(0) = "some value" resl

= Arrayreplace (v1, v2, v3)

Пример 3. Даже для массивов одинаковых типов Variant типов. Если бы преобразование типа имело место, то 2 и результат имел бы вид ["some value", 0]

Dim vl(l) As Variant, v2(l) As Variant, v3(0) As

Dim resl

vl(0) = 1

vl (l) = 2

v2 (0) = 1

v2(l) = "2"

v3(0) = "some value"

resl = Arrayreplace (vl, v2, v3)

сравниваются элементы только одинаковых "2" считались бы одинаковыми и массив-

Variant

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

251

Page 252: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©Функция Array l ln ique

Синтаксис : Ar rayUnique(sourceArray [,c o m p M e t h o d ] ) Параметры: sourceArray - массив любого типа.

compMethod - числовое выражение, задающее правило сравнения строк.

Удаляет повторяющиеся элементы из массива.

Данная функция появилась в Lotus Domino R6.

Если Вы не используете compMethod, то по умолчанию режим сравнения будет установлен согласно Option Compare объявленному в текущем модуле. Если в текущем модуле нет объявления Option Compare, то по умолчанию используется режим сравнения с учетом регистра и с полным совпадением.

Возвращает массив типа Variant после удаления дублирующих значений. В результирующий массив попадает первый элемент из двух равных.

Элементы, в массиве будут сравниваться только в том случае если они имеют один и тот же тип. Массив не может содержать элементы типа класс или объекты. Элементы массива содержащие значение Null соответствуют другим элементам со значением Null. Элементы массива содержащие значение Empty соответствуют другим элементам со значением Empty.

ArrayUnique может вернуть ошибку исполнения «Туре mismatch», в том случае если:

1. Первый параметр функции не является массивом

2. Первым параметром функции является список

3. Не инициализированный массив

4. Массив является массивом классов

5. Массив является массивом элементов класса NotesDocuments

6. Массив содержит массив в качестве одного из элементов массива

7. Массив содержит элемент со значением Nothing

ArrayUnique возвращает ошибку исполнения «Wrong Number of Dimensions error», если массив не является одномерным.

Пример.

Dim Arr

Arr=Evaluate({""}

) Redim Arr(7)

Arr(0)="abc"

Arr(1)="bac"

Arr(2)="cab"

Arr(3)="cba"

Arr(4)="bca"

compMethod Способ сравнения

0 С учетом регистра. С учетом полного совпадения

1 Без учета регистра. С учетом полного совпадения

4 С учетом регистра. Без учета полного совпадения (частичное совпадение)

5 Без учета регистра. Без учета полного совпадения (частичное совпадение)

З а м е ч а н и е . Д а н н а я ф у н к ц и я п о я в и л а с ь в L o t u s N o t e s D o m i n o 6 .

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

252

Page 253: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Arr(5)="abc"

Arr(6)="acb"

Arr(7)="cba"

Arr=Arrayuni que (Arr)

Forall x In Arr

Print x

End Forall

' Выводит "abc" "bac" "cab" "cba" "bca" "acb"

Функция FullTrimСинтаксис: FullTrim ( expr)Параметры: ехрг - выражение типа Variant, содержащее массив или строку.

Для аргумента-массива функция удаляет "пустые" элементы. То, какой элемент считается пустым, зависит от типа массива.

Для аргумента-массива функция удаляет "пустые" элементы. То, какой элемент считается "пустым", зависит от типа массива. Так в массиве строк, "пустыми" считаются элементы "" (пустая строка). В числовом массиве, "пустые" элементы - это нулевые элементы. В массиве типа Variant, "пустыми" также считаются элементы со значениями Empty и Null. Очевидно, что после удаления "пустых" элементов размерность результирующего массива может уменьшиться. Если все элементы массива оказались "пустыми", возвращается массив с единственным "пустым" элементом.

Пример 1. Удаление "пустых" элементов массива. Dim

StrArr(2) As String Dim NumArr(2) As Integer Dim

VarArr(6) As Variant

StrArr(0) = "aaa" : StrArr(l) = "" : StrArr(2) = "bbb" ' Массив

StrArr: ["aaa", "", "bbb"] NumArr(0) = 1 : NumArr(1) = 0 :

NumArr(2) = 2 1 Массив NumArr: [1, 0, 2]

'VarArr(l)- специально не заполняем - он останется Empty

VarArr(0) = "QWERTY" VarArr(2) = "" VarArr(3) =0 VarArr(4) = 12

VarArr(5) = Now VarArr(6) = Null

' Массив VarArr: [,"QWERTY", "", 0, 12, 28.05.99 20:21:34, Null] Dim vl,

v2, v3 vl = Fulltrim(StrArr) • Массив vl: ["aaa", "bbb"] v2 =

Fulltrim(NumArr) ' Массив v2: [1, 2] v3 = Fulltrim(VarArr)

' Массив v3: ["QWERTY", 12, 28.05.99 20:21:34] Пример 2. Ситуация, когда все элементы массивы "пустые"

Dim StrArr(1) As String

StrArr (0) = ""

StrArr (1) = ""

Dim ss As New NotesSession

Dim doc As New NotesDocument(ss.CurrentDatabase)

doc.Someltem = Fulltrim(StrArr) 'В документе появляется поле с значением Dim vVarWar = Fulltrim(StrArr) ' Ошибки «Туре mismatch» HE БУДЕТ!

©Функция Implode, Jo in Синтаксис: Implode {sourceArray, [delimiter])

Jo in (sourceArray, [delimiter]) Параметры: sourceArray - одномерный массив содержащий строки для объединения.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

253

Page 254: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Элементы массива должны быть типа String, либо Variant. delimiter - необязательный параметр, разделитель строк, содержащий один или несколько символов типа String.

З а м е ч а н и е . Д а н н а я ф у н к ц и я п о я в и л а с ь в L o t u s N o t e s D o m i n o 6 .

Объединяет все элементы массива sourceArray в строку и возвращает строку. Элементы разделяются разделителем delimiter если он предусмотрен, иначе элементы разделены пробелом.

sourceArray - одномерный массив содержащий строки для объединения. Элементы массива должны быть типа String, либо Variant. Если элементы массива типа Variant, то Lotus будет стараться конвертировать каждый не строковый элемент.

delimiter - необязательный параметр, разделитель строк, содержащий один или несколько символов типа String.

Implode возвращает строку, содержащую все элементы массива sourceArray, разделенные между собой разделителем delimiter, либо разделенные пробелом, в том случае если разделитель не указан.

Implode создает строку, с которой будет проводиться конкатенация элементов из sourceArray. Затем Implode на каждой итерации добавляет элемент в результирующую строку, при необходимости элемент преобразуется к типу String. После добавления элемента из sourceArray, Implode добавляет к результирующей строке один разделитель (пробел, либо заданное значение). Работа функции продолжается до тех пор пока не будут перебраны все элементы массива, после чего возвращается результирующая строка.

Implode может вернуть ошибку исполнения «Туре mismatch», если:1. Элемент массива невозможно конвертировать в тип String2. Значение разделителя равно Nothing3. Тип данных массива не String или Variant4. Вместо массива список5. Массив содержит элементы со значением Nothing6. Массив не инициализирован

Implode возвращает ошибку исполнения «Wrong Number of Dimensions error», если массив не одномерный.

Так же Implode возвращает ошибку исполнения «Invalid Use of Null», в том случае когда один из элементов массива имеет значение Null, либо параметр разделителя имеет значение Null.

Замечание : Функция Implode идентична функции Join.

Пример использования функции Implode

Dim Lnd (0 То 3) As String

Lnd(O)="Lotus"

Lnd(l)="Notes"

Lnd(2)="Domino"

Lnd (3) =" 8 . x"

Print Implode(Lnd) 'Выводит Lotus Notes Domino 8.x Print Implode(Lnd,"\") 'Выводит Lotus\Notes\

Domino\8.x

1.8 .7 Операции с окнами

Функция InputBox Синтаксис: lnputBox[$] ( p r o m p t [ , [ title ] [, [ default ] [, xpos , ypos ] ] ])

Выводит на экран диалоговое окно с сообщением, определенным пользователем, и возвращает введенную пользователем строку.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

254

Page 255: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

prompt - строковое выражение, значение которого выводится в диалоговое окно, длина выражения prompt не должна превышать 128 символов.

title - опция, являющаяся строковым выражением. Значение title выводится в заголовок диалогового окна. Максимальная длина значения title не должна превышать 128 символов. Если значением опции title является пустая строка - заголовок окна будет пустым. Если для пустого значения title установлены координаты xpos и ypos, в заголовок окна выводится запятая.

default - опция, являющаяся строковым выражением. Значение опции default выводится в диалоговое окно как, установленный по умолчанию, ответ пользователя. Длина строки default не должна превышать 512 символов. Если значением опции default является пустая строка и определены координаты xpos и ypos, в поле ввода ответа пользователя выводится запятая.

xpos - опция, являющаяся числовым выражением, определяющим смещение левой границы диалогового окна от левой границы экрана в специальных единицах 1/1440 inch (.05 point). Если определено значение xpos, необходимо определить и значение ypos.

ypos - опция, являющаяся числовым выражением, определяющая смещение верхней границы диалогового окна от верхней границы экрана в специальных единицах 1/1440 inch (.05 point). Если определено значение ypos, необходимо определить и значение xpos.

Функция InputBox возвращает значение типа Variant, содержащее строку. Функция lnputBox$ возвращает строку типа String.

Функция InputBox выводит на экран диалоговое окно, содержащее кнопки OK, Cancel, поле для ввода текста пользователем, при этом выполнение скрипта приостанавливается до момента, пока пользователь нажмет кнопку ОК или Cancel. Если нажата кнопка Cancel, то возвращается пустая строка ("").

Пример. Введенный пользователем текст преобразуется в целое число. Sub

Old

On Error Goto ErrH

Dim agelnt As Integer, ageStr As String

Retry:

ageStr = Inputbox$("Сколько Вам лет?","Возраст", "21")

If ageStr<>"" Then agelnt = Cint (ageStr) Exit Sub

ErrH:

Msgbox {Введенное значение не является числом!} Resume

Retry End Sub

Функция и оператор MessageBox

Синтаксис:Функция: MessageBox ( message [, [ buttons + icon + default + mode ] [, boxTitle ] ]) Оператор:

MessageBox message [, [ buttons + icon + default + mode ] [, boxTitle ] ]

Вместо MessageBox возможно использовать оператор MsgBox

Выводит на экран сообщение в окне сообщений и ждет ответа пользователя. Функция возвращает значение, приписанное кнопке, нажатой пользователем. Функция и оператор MessageBox идентичны, только функция возвращает значение, а оператор - нет. Допустимо использовать MsgBox вместо MessageBox.

message - сообщение, выводимое в окно сообщений, длина сообщения зависит от операционной системы.

buttons - определенные числами или значениями констант из следующей таблицы типы кнопок, представленные в окне сообщений.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

255

Page 256: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Имя константы Значение Кнопка

мв_ок 0 OK

MB_OKCANCEL 1 OK и Cancel

MB_ABORTRETRYIGNORE 2 Abort, Retry, и Ignore

MB_YESNOCANCEL 3 Yes, No, и Cancel

MB_YESNO 4 Yes и No

MB_RETRYCANCEL 5 Retry и Cancel

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

256

Page 257: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

icon - определяет пиктограммы, выводимые в окно сообщения. Значение icon определяется из следующей таблицы.

default - определяет кнопку, на которую по умолчанию становится фокус в окно сообщений. Нажатие клавиши ENTER или Пробел для такой кнопки эквивалентно "клику" по клавише "мыши". Значения кнопок "мыши" в окне определяются следующей таблицей:

mode - определяет действие кнопок окна сообщений. Следующая таблица представляет список действий, производимых кнопками окна сообщений.

boxTitle - строка, выводимая в заголовок окна сообщений, длиной до 128 символов.

Функция MessageBox возвращает целое число от 1 до 7, включительно. Это значение определяет, какая кнопка была нажата пользователем в окне сообщений. Соответствие между значениями функции и значением кнопок приведено в следующей таблице.

Имя константы Значение Пиктограмма

MBJCONSTOP 16 Знак Stop

MBJCONQUESTION 32 Знак вопроса

MBJCONEXCLAMATION 48 Восклицательный знак

MBJCONINFORMATION 64 Информация

Имя константы Значение Кнопка "мыши"

MB_DEFBUTTON1 0 1-я кнопка

MB_DEFBUTTON2 256 2-я кнопка

MB_DEFBUTTON3 512 3-я кнопка

Имя константы Значение Действие

MB_APPLMODAL 0 Останавливает выполнение текущего приложения до тех пор, пока пользователь не отреагирует в окне сообщений нажатием кнопки.

MB_SYSTEMMODAL 4096 Останавливает выполнение всех приложений до тех пор, пока пользователь не отреагирует в окне сообщений нажатием кнопки.

Возвращаемое значение

Кнопка Константа

1 ОК IDOK

2 Cancel IDCANCEL

3 Abort IDABORT

4 Retry IDRETRY

5 Ignore IDIGNORE

6 Yes I DYES

7 No IDNO

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

257

Page 258: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Все значения констант, представленные в этих таблицах, содержатся в файле LSCONST.LSS. Для использования значений констант, хранящихся в этом файле, его необходимо включить в скрипт с помощью директивы %lnclude.

Пример 1. Вывод запроса:" Вас еще не утомили эти функции?" в окне с заголовком." Вопрос толстой книги ", содержащим кнопки Yes и No. Значение, возвращаемое функцией MessageBox присваивается переменной answer.

%Include "LSCONST.LSS"

Dim msgType As Long, answer As Integer msgType

& = MB_YE SNO + MB_ICONQUESTION

answer% = MessageBox("Вас еще не утомили эти функции?", msgType &,

"Вопрос толстой книги")

После нажатия кнопки (предположим. Yes) выводим результат MessageBox answer%

Выводит б или 7

Пример 2. Оператор MessageBox выводит в окно сообщений с заголовком "Demo" и кнопкой ОК несколько строк.

%Include "LSCONST.LSS"

Dim ManyLine As String

ManyLine$ = |Вот так

реализуется

многострочное

сообщение|

Messagebox ManyLine$, МВ_ОК, "Пример"

ManyLine$={BoT та^+Ch^ (10) +{реализуется}+Chr$ (10) + {многострочное} _ +Chr$(10)+{сообщение}

Messagebox ManyLine$, МВ_ОК, "Пример" ' Получаем подряд два одинаковых сообщения:

jПример

Вот так

реализуетсямно построчноесообщение

■ L......ок.......JI

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

258

Page 259: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Оператор Act iva teApp (активизировать окно)Синтаксис: Act iva teApp (windowName)Параметры: windowName - текст заголовка активизируемого окна - строковое выражение,

без учета регистра.

Активизирует окно приложения, имеющее указанный заголовок.

При поиске окна учитывается лишь вхождение текста из строки windowName слева в заголовок. Например, если необходимо активизировать окно Notes с заголовком "Lotus Notes - Workspace", то в качестве windowName достаточно задать "Lotus Notes". Если в списке имеющихся окон окажется несколько с одинаковым или подобным заголовком, будет активизировано первое найденное окно.

Учтите, что ActivateApp только активирует окно (т.е. передает ему фокус ввода), но не может восстановить в нормальный размер или максимизировать, если окно свернуто. Для восстановления размеров окна или максимизации следовало бы послать этому окну "серию нажатий клавиш, используя оператор SendKeys. В случае если окно с указанным именем не существует то возникает ошибка «Illegal function call"

Пример. Активирует окно с заголовком "Lotus Notes - Workspace".Call ActivateApp ("Lotus Notes")

Оператор SendKeys Синтаксис: SendKeys string [, processNow]

Строка string содержит последовательность клавиш клавиатуры, имитацию нажатий которых в активном окне выполняет этот оператор. Имеется целый ряд соглашений, как в строке кодируются клавишные комбинации: {F4}, {CAPSLOCK}, {RIGHT 3}...

К сожалению, в реализации LotusScript для Notes этот оператор не поддерживается. В качестве компенсации читателю предлагается пример, в котором необходимый эффект достигается путем вызова соответствующих функций Windows API. Пример можно найти в главе, посвященной обращению к внешним С-функциям на стр. 264.

1.8 .8 Специальные функции и операторы

Оператор Веер (звуковой сигнап)Синтаксис: Веер

Издает простой звуковой сигнал.

Для воспроизведения более сложных звуков можно воспользоваться либо новым методом PlayTune класса NotesUIWorkspace (см. стр. 711), либо использовать средства Winodws API (см. пример на стр. Ошибка! Закладка не определена . )

Функция Command Синтаксис: Command[$]

Возвращает строку параметров, которая была передана при запуске приложению Lotus, использующему LotusScript, или пустую строку (""), если приложение было запущено без параметров. Функция Command возвращает значение типа Variant of DataType 8 (String). Функция Commands возвращает строку.

Пример. Определяется наличие параметров в командной строке. If

Command$() = "» Then

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

259

Page 260: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print "Notes запущен без параметров" Else

Print " Notes запущен с параметрами: " + Command$() End If

Функция Envi ron Синтаксис: Envi ron[$ ] ( { environName \ n})Тип возвращаемого значения: Environ возвращает значение типа Variant,

Environ$ возвращает значение типа String.Параметры: environName - строка символов верхнего регистра, определяющая имя

переменной среды.п - число от 1 до 255, включительно, определяющее положение переменной среды в таблице

переменных среды.

Возвращает информацию, содержащуюся в переменной среды операционной системы.

Если для определения имени переменной среды используется environName, возвращается значение, определенное переменной среды. Если переменная среды не найдена, возвращается пустая строка (""). Если строка environName - пустая строка, или строка содержащая значение Null или Empty, то генерируется ошибка.

Если позиция переменной среды определена числом п, возвращается строка с именем переменной среды и ее значением. Если значение п превышает действительное число строк в таблице, то возвращается пустая строка (""). Если п меньше 1 или больше 255, то генерируется ошибка.

Пример. Microsoft Windows ХР хранит временно существующие рабочие файлы в каталоге, объявленном в переменной среды с именем Temp. Введенная пользователем строка выводится в файл MyText.txt в этом каталоге.

Dim TDir As String, TFile As Integer

Dim FileName As String, Text As String

Text$ = Inputbox("Введите какаю-либо строку:", "Ввод строки...")

TDir$ = Environ("Temp")

Chdir TDir$

TFile% = FreefileO

FileName$ = "MyText.txt"

Open FileName$ For Output As TFile%

Print #TFile%, Text$

Close TFile%

Print {Файл сохранен по пути: } & Chr(10) & TDir$Функция ShellСинтаксис: Shell ( program [, windowStyle ])Параметры: Program - строковое выражение, значение которого определяет имя

запускаемой на выполнение программы. WindowStyle - опция, являющаяся числом, определяющим стиль окна запускаемого приложения.

Запускает программу.

Program - строковое выражение, значение которого определяет имя запускаемой на выполнение программы. Program должно быть именем исполняемого файла с расширением ВАТ, COM, PIF, или ЕХЕ. Указание расширения или включение полного пути в спецификацию файла программы необязательно. Запуск с помощью функции Shell на выполнение внутренней команды DOS вызывает ошибку.

WindowStyle - опция, являющаяся числом, определяющим стиль окна запускаемого приложения. Она определяется по следующей таблице:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

260

Page 261: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Эти константы определены в файле LSCONST.LSS. Для обеспечения возможности использования этих констант включите этот файл в скрипт при помощи директивы %INCLUDE .

Если используется операционная система Windows 3.1 и LotusScript успешно запускает программу, Shell возвращает идентификатор запущенной задачи. Если используется ОС Windows NT и LotusScript успешно запускает программу, Shell возвращает число 33. Если LotusScript не может запустить программу, Shell возвращает ошибку.

Shell может вызываться из выражения или оператора присваивания, если они возвращают используемое этим оператором значение. После выполнения Shell, LotusScript продолжает выполнение скрипта, не ожидая завершения выполнения запущенной программы.

Пример. Запуск приложения Windows Notepad.

Dim task As Integer

task% = Shell("Notepad.exe" , 3)

Функция и оператор Yield Синтаксис: Yield

В м е с т о ф у н к ц и и Y i e l d в о з м о ж н о и с п о л ь з о в а т ь ф у н к ц и ю D o E v e n t s .

Ф у н к ц и я и о п е р а т о р Y i e l d п е р е д а ю т у п р а в л е н и е о п е р а ц и о н н о й с и с т е м е , а в ы п о л н е н и е т е к у щ е г о п р о ц е с с а " в с т а е т в о ч е р е д ь " . О С

W i n d o w s н е м о ж е т в е р н у т ь у п р а в л е н и е п р о ц е с с у д о т е х п о р , п о к а н е о б р а б о т а е т в с е с т о я щ и е в о ч е р е д и з а п р о с ы . О п е р а т о р и ф у н к ц и я Y i e l d

д о п у с т и м ы в н у т р и п р о ц е д у р ы и л и к л а с с а и н е д о п у с т и м ы в м о д у л е . Ф у н к ц и я Y i e l d в о з в р а щ а е т з н а ч е н и е т и п а I n t e g e r р а в н о е 0 .

П р и м е р . З а п у с к п р о р а м м ы Б л о к н о т и о ж и д а н и е , к о г д а п о л ь з о в а т е л ь з а к р о е т п р о г р а м м у . Private Const

NORMAL_PRIORITY_CLASS = &H2 0& Private Const INFINITE = -1& Private Type STARTUPINFO

cb As Long

lpReserved As String

lpDesktop As String

lpTitle As String dwX As

Long dwY As Long dwXSize

As Long dwYSize As Long

dwXCountChars As Long

dwYCountChars As Long

dwFillAttribute As Long

dwFlags As Long

Стиль (Style) Описание Константа

1, 5 или 9 Нормальное с фокусом SHELL_NORMAL_FOCUS

2 Минимизированное с фокусом (по умолчанию) SHELL_MIN_FOCUS

3 Максимизированное с фокусом SHELL_MAX_FOCUS

4 или 8 Нормальное без фокуса SHELL_NORMAL_NO_FOCUS

6 или 7 Минимизированное без фокуса SHELL_MIN_NO_FOCUS

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

261

Page 262: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

wShowWindow As Integer

cbReserved2 As Integer

lpReserved2 As Long

hStdlnput As Long

hStdOutput As Long

hStdError As Long End Type

Private Type PROCESS_INFORMATION

hProcess As Long hThread As

Long dwProcessID As Long

dwThreadID As Long End TypeDeclare Function WaitForSingleObject Lib "kernel32" (Byval hHandle As Long, Byval

dwMilliseconds As Long) As Long

Declare Function CreateProcessA Lib "kernel32" (Byval lpApplicationName As Long, Byval lpCommandLine As String, Byval lpProcessAttributes As Long, Byval lpThreadAttributes As Long, Byval blnheritHandles As Long, Byval dwCreationFlags As Long, Byval IpEnvironment As Long,Byval lpCurrentDirectory As Long, IpStartupInfo As STARTUPINFO, lpProcesslnformation As PROCESS_INFORMATION) As Long

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (Byval hwnd As Long, Byval lpOperation As String, Byval lpFile As String, Byval lpParameters As String, Byval lpDirectory As String, Byval nShowCmd As Long ) As Long

Declare Function CloseHandle Lib "kernel32" (Byval hobject As Long) As Long

Dim RetVal As Long

Dim proc As PROCE S S_INFORMATI ON

Dim Startlnf As STARTUPINFO

Sub Click(Source As Button)

Call ShellAndWait("Notepad.exe")

End Sub

Private Function ShellAndWait(Byval RunProg As String) As Long

Startlnf.cb = Len(Startlnf)

Startlnf.wShowWindow = 0&

RetVal = CreateProcessA(0&, RunProg, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Startlnf, proc)

Do While WaitforSingleObject (proc.hProcess,10000) > 0

Yield

Loop

Messagebox "Запись окончена"

RetVal = CloseHandle(proc.hProcess)

ShellAndWait = RetVal

End Function

Оператор Stop Синтаксис: Stop

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

262

Page 263: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В режиме отладки скрипта имитирует наличие точки останова (breakpoint). При выполнении скрипта вне отладчика никак себя не проявляет.

Очень простой и в то же время полезный оператор. Используя данный оператор можно сэкономить ощутимое время на отладке скрипта (особенно таких, как скрипт события QuerySave формы).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

263

Page 264: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция IsEmpty Синтаксис: IsEmpty ( ехрг)Тип возвращаемого значения: Boolean.Параметры: ехрг-какое-либо выражение.

Проверяет, является ли значение выражения ехрг значением Empty. Возвращает True, если значением выражения ехрг является значение Empty. Это бывает только в случае, когда значение выражения ехрг имеет тип Variant и является пустой строкой. В противном случае функция IsEmpty возвращает значение False (0).

Пример.

Dim vVar As Variant Print IsEmpty(vVar) War = PI

Print IsEmpty(vVar) Функция IsNull

Функция IsNul l Синтаксис: IsNul l ( ехрг)Тип возвращаемого значения: Boolean.Параметры: ехрг- какое-либо выражение.

Возвращает True, если значением выражения ехрг является значение Null. В противном случае возвращает False.

Пример.

Dim v As Variant Print I sempty (v) Print I snull (v) v = Null Print I snull (v)

Функция IsNumer icСинтаксис: IsNumer ic ( expr)

Тип возвращаемого значения: Boolean.

Параметры: ехрг- какое-либо выражение.

Возвращает True, если значение выражения ехрг является числом или может быть преобразовано в число. Значения следующих типов являются числом: Integer, Long, Single, Double, Currency, Byte, Date/Time, Empty, String (если преобразуется в число), OLE-ошибка, Boolean (True, False). Если значение выражения ехрг не является числом и не может быть преобразовано в число, функция возвращает False. Следующие значения или типы не могут быть числовыми: Null, Array, List, Nothing, String(ecnn не преобразуется в число).

'Выводит: False

' Выводит:

True 'Выводит:

False

' Выводит: True

'Выводит: True

1.8 .9 Функции проверки значений

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

264

Page 265: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример.

Dim v As Variant

Print Isnumeric(v) 'Выводит: True (v имеет значение Empty)

Set v=Nothing

Print Isnumeric(v) 'Выводит: False (v имеет значение Nothing)

v = 0

Print Isnumeric(v) 'Выводит: True

'Строка, не преобразуемая в число v = "Zero"

Print Isnumeric(v) 'Выводит: False

'Строка, преобразуемая в число

v = "О"

Print Isnumeric(v) 'Выводит: True

Функция IsDateСинтаксис: IsDate ( ехрг)Тип возвращаемого значения: Boolean.Параметры: ехрг- какое-либо выражение.

Проверяет, является ли значение выражения ехрг значением даты-времени. Возвращает значение True, если значением выражения ехрг является:

• выражение типа Variant DataType 7 (Date/Time);

• выражение типа Variant (String), представляющее значение даты-времени;

• выражение типа String, представляющее значение даты-времени. В противном случае возвращает

значение False.

Пример. Функция IsDate проверяет значения переменных х, у, z на соответствие значению даты/времени.Dim х As Variant, у As Variant, z As Variantx = Cdat(777) 'Числовое значение

у = 777 'Числовое значение

z = " April 6, 2008" ' Строка, представляющая

Print Isdate(x) ' Выводит:

True

Print Isdate(y) ' Выводит:

False

Print Isdate(z) ' Выводит:

True

Print Isdate("777") ' Выводит:

False

Print Isdate("06.04. 2008") 'Выводит: True

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

265

Page 266: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция IsSca larСинтаксис: IsSca lar (ехрг )Тип возвращаемого значения: Boolean.Параметры: ехрг- какое-либо выражение.

Проверяет, является ли тип значения выражения ехрг скалярным типом. Возвращает True, если значение выражения ехрг равно или имеет тип: Empty, Byte, Integer, Long, Single, Double, Currency, Оа1еЯ1те, String, OLE-ошибка, Boolean (True, False). Иначе (если значением выражения ехрг являются: массив, список, объект, значения Nothing или Null) функция возвращает значение False.

Пример.

Class MyClass

' ... объявление класса End Class Dim a As Variant Print Isscalar (a) Set a =

New MyClass Print Isscalar (a) a = 1

Print Isscalar (a) Dim arr (1 To 5) a = arr

Print Isscalar (a) a = "Добрый день!" Print Isscalar (a) Dim 1st List a = 1st

Print Isscalar (а) 'Выводит: False

Функция IsArrayСинтаксис: IsArray ( expr)Тип возвращаемого значения: Boolean.Параметры: ехрг- какое-либо выражение.

Проверяет, является ли значение выражения ехрг массивом. Возвращает значение True, если значение выражения ехрг является массивом, в противном случае False.

Пример.

Dim FixedArray(0 То 9) Dim DynamicArray Print Isarray(FixedArray) Print

Isarray(DynamicArray) Dynami cArray=Evaluate({""}) Print Isarray(DynamicArray)

Выводит: True

' Выводит: False

' Выводит: True

'Выводит: True

'Выводит: False

'Выводит: True

'Выводит: False

'Выводит: True

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

266

Page 267: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Is L ist Синтаксис: IsList ( ехрг) Тип возвращаемого значения Параметры: ехрг - какое-либо

Проверяет, является ли значение выражения ехрг списком. Возвращает True, если значение выражения ехрг является списком. В противном случае возвращает False.

Пример.

Dim 1st List

Dim SomeVar As Variant

Print Islist (1st) • Выводит: True

Print Islist (SomeVar) ' Выводит: False

SomeVar = 1st

Print Islist (SomeVar) ' Выводит: True

Функция L istTag Синтаксис: L istTag ( r e f V a r )Параметры: refVar - ссылка на переменную.

Возвращает имя текущего элемента из списка, поэлементно обрабатываемого оператором ForAII. Параметр refVar - ссылка на переменную, определяющую в операторе ForAII.

Функция применяется только внутри блока ForAII. Выдает ошибку, если значение refVar не является ссылкой на переменную, определенную в операторе ForAII.

Пример. Печать имен элементов списка Colours.

Dim Colours List As Integer Colours%("красный") = &HFF00 Colours%("зелёный") = &H00FF00 Colours%

("синий") = &H0000FF Forall x In Colours%

Pr

int

Listtag(x

) End

Forall

'Выводит:

'красный

'зелёный

'синий

: Boolean. выражение.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

267

Page 268: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция IsElement Синтаксис: IsElement ( l i s t N a m e ( stringExpr) ) Тип возвращаемого значения: Boolean. Параметры:

stringExpr - строковое выржение.listName - имя списка.

Проверяет, является ли строковое выражение stringExpr элементом списка listName. Возвращает значение True, если в списке listName содержится элемент с именем stringExpr, иначе возвращает False.

Если предложение listName не является именем объявленного списка, LotusScript выдает ошибку. Если значением выражения ехрг является числовое выражение, LotusScript преобразует его значение в строковое выражение.

Пример. Создается список элементов, которым присваиваются некоторые значения. Выдается запрос на идентификацию удаляемых из списка элементов. Если в WriterList есть элементы для удаления из списка, то происходит удаление указанных элементов из списка. В противном случае выдается соответствующее сообщение и выполнение скрипта прекращается

Dim WriterList List As String

Dim WriterFName As String, WriterLName As String

WriterList("Пушкин")="Александр"

WriterList("Лермонтов")="Михаил"

WriterList("Горький")="Максим"

WriterList("Чехов")="Антон"

WriterList("Бунин")="Иван"

WriterFName=Inputbox$("Введите фамилию писателя:","Игра","Пушкин") If

Iselement(WriterList(WriterFName)) Then

Forall x In WriterList If Lcase$(Listtag(x))=Lcase$(WriterFName) Then Erase

WriterList(WriterFName) End Forall

If Not Iselement (WriterList(WriterFName) ) Then Messagebox "Вы удалили " &

WriterFNameElse

Messagebox ("Такой писатель, увы, не найден в списке!")End If

Функция IsUnknownСинтаксис: IsUnknown ( ехрг)Тип возвращаемого значения: Boolean.

Параметры: ехрг - какое-либо выражение.

Проверяет, является ли значение выражения ехрг значением OLE VJUNKNOWN. Возвращает значение True, если значение выражения ехрг имеет тип Variant и равно VJUNKNOWN. Такое значение может иметь только ссылка на OLE-объект. В противном случае функция возвращает False.

Функция IsDef ined Синтаксис: IsDef ined ( ехрг)Тип возвращаемого значения: Boolean.Параметры: ехрг- какое-либо выражение.

Проверяет, является ли значение строкового выражения stringExpr именем константы, определенной в Lotus-продукте. Возвращает значение True, если значение выражения stringExpr определено в Lotus- продукте, иначе возвращает False.

Обычно функция используется для проверки значения констант, идентифицирующих используемую платформу. Такие проверки могут использоваться в %lf директиве условной компиляции скрипта.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

268

Page 269: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.8 .10 Средства работы с файловой системой

1.8 .10.1 Операторы и функции для работы с устройствами и каталогами

Оператор ChDir (назначить каталог)

Синтаксис: ChDir pathПараметры: path - строковое выражение, представляющее каталог, назначаемый в качестве текущего.

Устанавливает текущую директорию.

Назначает в качестве текущего (рабочего) каталога каталог, путь к которому указан в выражении path. Если первым символом выражения path не является символ, обозначающий дисковое устройство (диск), то в качестве рабочего используется текущий диск, в противном случае рабочим становится диск, обозначение которого присутствует в выражении path. В случае если path указывает на несуществующую директорию, то Lotus вернет ошибку "Path not found"

Формат и максимальная длина выражения path должны соответствовать соглашениям, принятым в используемой платформе.

Пример 1. Назначает устройство (диск) D текущим устройством.ChDrive "С"

Пример 2. Назначает каталог TEST текущим каталогом на устройстве С.ChDir "C:\Lotus"

Пример 3. Назначить каталог TEST текущим каталогом на текущем устройстве D.

Dim path$

path$ =Envi ron (" TEMP " )

Chdir path$

Print "Путь в папке временных файлов: " & CurdirOОператор ChDr ive (назначить устройство) Синтаксис: ChDr ive driveПараметры: drive - строка, представляющая существующее устройство.

Оператор ChDrive назначает текущее устройство согласно значению строки drive. Текущее устройство - это устройство, которое используется, если происходит обращение к указанному пользователем файлу, или при использовании пути, в котором отсутствует спецификация устройства. Если значением строки drive является пустая строка (""), то оператор ChDrive не меняет назначение, оставляя текущим устройство, используемое до выполнения оператора ChDrive.

Если значением строки drive является строка, содержащая более одного символа, в качестве обозначения переназначаемого устройства берется первый символ значения строки drive. Оператор ChDrive не требует наличия знака двоеточие (:) после символа, обозначающего назначаемое устройство. Символом, обозначающим устройство, может быть любая буква от А до буквы, представленной опцией lastdrive в системном файле CONFIG.SYS, включительно, в противном случае возникнет ошибка "Device unavailable".

Пример. Назначить D текущим устройством.

ChDrive "С"

Функция CurDi r Синтаксис: CurDi r [$ ] [ ( drive ) ]Тип возвращаемого значения: CurDir возвращает значение Variant of DataType8 (String).

CurDir$ возвращает значение типа String. Параметры: drive - опция, являющаяся строковым выражением, определяющая существующее устройство.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

269

Page 270: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Определяет назначение текущего каталога заданного устройства.

drive - опция, являющаяся строковым выражением, определяющая существующее устройство. Если опция отсутствует, функция CurDir использует текущее устройство.

Если спецификация устройства представляет собой строку, состоящую более, чем из одного символа, CurDir использует только первый символ строки. CurDir не требует наличия знака (: ) после буквы, определяющей устройство.

Пример.

Dim path$

path$=Environ("TEMP") Chdir path$

Print CurdirO 'Выводит папку для временных файлов в системе

Функция CurDr ive Синтаксис: CurPr ive[$]Тип возвращаемого значения: String.

Возвращает строку, идентифицирующую текущее устройство (диск), состоящую из символа устройства, с последующим двоеточием. Функция CurDrive возвращает значение типа Variant (String). Функция CurDrive$ возвращает значение типа String.

Пример.

Dim tempDrive As String

tempDrive$ = CurDrive$() If

tempDrive$ о "C:B Then

ChDrive "C"

End If

ChDir " \TEST"

Print CurDir$ () 'Выводит "C:\TEST"

Функция DirСинтаксис: D i r [$] [ ( fileSpec [, attributeMask ]) ]Тип возвращаемого значения: Dir возвращает значение типа Variant (String)

Dir$ - типа String.Параметры: fileSpec - строковое выражение, определяющее путь к файлу.

attributeMask - любое целое выражение, значение которого является возвращаемым именем.

Возвращает имя файла, каталога, или букву - название устройства.

fileSpec - строковое выражение, определяющее путь к файлу. Этот аргумент является обязательным только при первом обращении к функции Dir$ с указанием данного пути. Составленное по правилам определения пути к файлам, fileSpec обеспечивает доступ к файлам, синтаксис указателя пути к которым удовлетворяет принятой спецификации (например, использование в указателе пути знаков "*" и "?").

attributeMask - любое целое выражение, значение которого является возвращаемым именем. Если пропущен этот аргумент, имена существующих на устройстве файлов сравниваются со значениями, содержащимися в fileSpec. Если есть аргумент attributeMask, то должен быть и аргумент fileSpec. Для включения в возвращаемый список типов файлов, используются суммарные значения графы Mask из следующей таблицы, представляющей типы файлов:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

270

Page 271: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Константы, использованные в таблице, хранятся в файле LSCONST.LSS. Включение этого файла в скрипт при помощи директивы %INCLUDE позволяет использовать названия атрибутов вместо их численного кода. Для определения существования файла используется его правильное (в рамках используемой платформы) имя в качестве аргумента для функции Dir (Dir$). Возвращаемое значение может быть либо именем файла, либо сообщением об отсутствии файла на указанном устройстве. Первое обращение к функции Dir (Dir$) возвращает имя первого файла в указанном каталоге согласно спецификации имени файла в fileSpec. Последующие вызовы функции Dir (Dir$) с другими аргументами позволяют добавить имена файлов по списку fileSpec.

Если в указанном каталоге больше нет файлов, соответствующих спецификации, то функция Dir возвращает значение типа Variant (String), а функция Dir$ возвращает пустую строку (""). Если, после получения пустой строки, функция Dir (Dir$) вызывается еще раз с той же спецификацией пути, то генерируется ошибка.

Пример. Получения списка файлов в папке для хранения временных файлов

Dim path As String, FName As String path =

Environ("TEMP" ) & "\*.*" FName = Dir$

(path, 0) Do While FName <> "" Print FName

FName = Dir$()Loop

Оператор MkDir (создать каталог )

Синтаксис: MkDir pathПараметры: path - строковое выражение, значение которого является именем создаваемого каталога.

path - строковое выражение, значение которого является именем создаваемого каталога. В выражении path буква, определяющая дисковое устройство, не является обязательной. Если она отсутствует, то используется текущее назначение устройства. Правила указания каталога должны соответствовать правилам используемой операционной платформы.

При невозможности создать требуемый каталог LotusScript выдает ошибку "Path/File access error".

Пример. Создание каталога Lotus Notes Domino в текущем каталоге.

Mkdir Curdir$ & "\Lotus Notes Domino"

Оператор Name (переименовать /переместить файл/каталог)

Синтаксис: Name oldName As newNameПараметры: oldName - строковое выражение, определяющее имя существующего файла/каталога, необязательно содержащее путь; newName - строковое выражение, определяющее новое имя файла/каталога, необязательно содержащее путь.

Mask Атрибуты файла Константа

0 Normal file ATTR_NORMAL

2 Hidden file ATTRJHIDDEN

4 System file ATTR_SYSTEM

8 Volume label ATTR_VOLUME

Атрибуты файла hidden .system, или directory не имеют смысла для Volume label

16 Directory ATTR_DIRECTORY

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

271

Page 272: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Переименовывает (и/или перемещает) файл или каталог.

Для перемещения файла необходимо указывать полный путь и для файла с именем oldName и для файла с именем newName. Для переименования используйте имя файла в обоих аргументах. При отсутствии указанного файла/каталога LotusScript выдает ошибку.

Для перемещения файла с одного устройство на другое необходима ОС Windows NT или Windows 95.

Пример. Переименование каталога с именем Lotus Notes, находящегося в корневом каталоге на устройстве С, в файл с именем Lotus Domino, и перемещение переименованного файла в каталог Temp на устройстве С.

Mkdir "C:\Lotus Notes"Name "C:\Lotus Notes" As "C:\Temp\Lotus Domino"

Оператор RmDi r (удалить каталог) Синтаксис: RmDi r pathПараметры: path - строковое выражение - указатель пути к удаляемому каталогу.

path - строковое выражение - указатель пути к удаляемому каталогу. Максимальная длина указателя пути к каталогу определяется рамками используемой платформы. Если имя каталога в указателе пути отсутствует, то генерируется ошибка.

Пример. Удаление каталога C:\TEST из файловой системыRmdir "C:\Temp\Lotus Domino"

1.8 .10.2 Операторы и функции для работы с файлами

Функция F i leAt t r Синтаксис: F i leAt t r ( fileNumber, attribute )Тип возвращаемого значения: Integer.Параметры: fileNumber - номер, присвоенный файлу при его открытии.

attribute - число (1 или 2), специфицирующее тип используемой информации.

Возвращает значение типа доступа или значения системных атрибутов для открытого файла.

fileNumber - номер, присвоенный файлу при его открытии.

attribute - число (1 или 2), специфицирующее тип используемой информации. Вместо 1 или 2 можно использовать для спецификации соответствующие этим значениям константы ATTR_MODE или ATTR_HANDLE. Эти константы определены в файле LSCONST.LSS. Включение этого файла в скрипт с помощью директивы %lnclude позволит использовать значения текстовых констант вместо числовых значений.

Если значением атрибута является строка ATTR_HANDLE, то функция FileAttr возвращает системные атрибуты файла. Если значением атрибута является строка ATTR_MODE, то функция FileAttr возвращает целое число, определяющее тип доступа к файлу, согласно следующей таблице:

Пример. Открывается (создается) файл с именем DATA.TXT и на экран выводится значение типа доступа к этому файлу.

%Include "LSCONST.LSS"

Возвращаемое значение Тип доступа Константа

1 Input ATTR INPUT

2 Output ATTR OUTPUT

4 Random ATTR RANDOM

8 Append ATTR APPEND

32 Binary ATTR BINARY

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

272

Page 273: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Dim mode As String, msg As String

Dim FNum As Integer

FNum% = FreefileO

Open "example.txt" For Output As FNum% Select

Case Fileattr(FNum%, ATTR_MODE) Case 1 : Print

"DOS File Mode = Input" Case 2 : Print "DOS

File Mode = Output" Case 4 : Print "DOS File

Mode = Random"

Case 8 : Print "DOS File Mode = Append" Case

32: Print "DOS File Mode = Binary" End Select Close

FNum%

Функция F i leDateT ime ________________________________________________________________Синтаксис: F i leDateT ime ( fileName )Параметры: fileName - строковое выражение, которое может содержать путь к файлу в рамках синтаксиса используемой платформы.

Возвращает дату и время создания или последней модификации файла.

fileName - строковое выражение, которое может содержать путь к файлу в рамках синтаксиса используемой платформы.

Функция возвращает дату и время создания или последней модификации файла в формате, соответствующем используемой операционной платформе или в международном формате. Если файла с указанным именем нет по указанному пути, возвращается сообщение об ошибке.

Пример. Создается файл с именем DATA.TXT и выводится дата и время его создания. %Include

"LSCONST.LSS"

Dim FNum As Integer, FName As String Print

Curdir() FNum% = FreefileO

FName$="example.txt"

Open FName$ For Output As FNum% ' Создание файла example.txt Close

FNum%

Print FName$; " Создан "; Filedatetime(FName$)

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

273

Page 274: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция F i leLenСинтаксис: F i leLen ( fileName ) Тип возвращаемого значения: Long.Параметры: fileName - строковое выражение; может содержать путь и не может содержать специальные символы.

Возвращает длину файла в байтах (тип Long).

Пример. Создается файл «example.txt», записывается некоторая информация, файл сохраняется и выводится размер полученного файла, а так же информация о дате создания.

Dim FNum As Integer, FName As String

FNum% = FreefileO

FName$="example.txt"

Open FName$ For Output As FNum% ' Создание файла example.txt

Write #FNum%, "I study now LotusScript" 'Запись какой-либо строки в файл

Close FNum%

Print FName$; " Создан "; Filedatetime(FName$) Print "Размер файла: " & Filelen(FName$) & " байт"Функция GetF i l eAtt r Синтаксис: GetF i l eAtt r ( fileName ) Тип возвращаемого значения: Integer.Параметры: fileName - имя файла или каталога; при необходимости может содержать указатель пути к файлу или

каталогу.

Возвращает значения системных атрибутов файла или каталога.

Вместо GetFileAttr возможно использовать функцию GetAttr.

Возвращаемым значением является число, равное сумме целых значений кодов атрибутов файла, согласно следующей таблице.

Константы представляют собой значения, определенные в файле LSCONST.LSS. Для обеспечения возможности использования имен этих констант, необходимо включить этот файл в скрипт при помощи директивы % IN C L U D E.

Пример. В режиме Output открывается (создается) файл с именем example.txt, записывается какая- либо информация, после чего файл сохраняется и проверяются его атрибуты.

%Include "LSCONST.LSS"

Dim FNum As Integer, FName As String, attr As Integer FNum% = FreefileO FName$="example.txt"

Open FName$ For Output As FNum% ' Создание файла example.txt

Write #FNum%, "I study now LotusScript" 'Запись какой-либо строки в файл

Close FNum%

Код значения Атрибут Константа

0 Normal file ATTR_NORMAL

1 Read-only file (только для чтения) ATTR_READONLY

2 Hidden file (скрытый файл) ATTRJHIDDEN

4 System file (системный файл) ATTR_SYSTEM

16 Directory (каталог) ATTR_DIRECTORY

32 File(archived) (архивный) ATTR_ARCHIVE

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ruI

274

Page 275: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

attr=Getfileattr(FName$)

Оператор Se tF i l eAt tr (назначить файлу атрибуты) Синтаксис: Se tF i l eAt tr fileName ,

attributesПараметры: fileName - строковое выражение; может включать путь к файлу.

attributes - атрибуты файла, определенные суммой любых кодов атрибутов.

Вместо оператора SetFileAttr можно использовать оператор SetAttr.

fileName - строковое выражение; может включать путь к файлу.

attributes - атрибуты файла, определенные суммой любых кодов атрибутов из следующей таблицы.

Значения всех этих констант определены в файле LSCONST.LSS. Для использования значений констант необходимо включить этот файл в скрипт с помощью директивы %INCLUDE.

SetFileAttr не применяется к открытому файлу, если только он не открыт в режиме "только чтение"(геас!-оп1у).Пример. Создает файл и использует оператор SetFileAttr для назначения этому файлу атрибутов Hidden, System,

и Archive. Затем, для проверки значений атрибутов файла используется оператор GetFileAttr и выводятся значения атрибутов.

%Include "LSCONST.LSS"

Dim FNum As Integer, FName As String, attr As Integer FNum% =

FreefileO FName$="example.txt"

Open FName$ For Append As FNum% ' Создание файла example.txt

Write #FNum%, "I study now LotusScript" 'Запись какой-либо строки в файл

Close FNum%

Setfileattr FName$, ATTR_HIDDEN+ATTR_SYSTEM+ATTR_ARCHIVE

attr=Getf ileattr(FName$)

If attr And ATTR NORMAL Then Print "Обычный файл"If attr And ATTR READONLY Then Print "Только для чтения

If attr And ATTR HIDDEN Then Print "Скрытый файл"

If attr And ATTR SYSTEM Then Print "Системный файл"

If attr And ATTR DIRECTORY Then Print "Каталог"

If attr And ATTR ARCHIVE Then Print"Архивный файл"

Значение Описание Константа

0 Normal file ATTR_NORMAL

1 Read-only (только чтение) ATTR_READONLY

2 Hidden (скрытый) ATTR_HIDDEN

4 System (системный) ATTR_SYSTEM

32 Changed since last back-up ATTR_ARCHIVE

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

275

Page 276: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

If attr And ATTR_NORMAL Then Print "Обычный файл" If attr

And ATTR_READONLY Then Print "Только для чтения" If attr

And ATTR_HIDDEN Then Print "Скрытый файл" If attr And

ATTR_SYSTEM Then Print "Системный файл" If attr And

ATTR_DIRECTORY Then Print "Каталог" If attr And

ATTRARCHIVE Then Print" Архивный файл" Kill FName$

Оператор F i leCopy (копировать файл)

Синтаксис: F i leCopy source , destinationПараметры: source - строковое выражение, определяющее имя копируемого файла,

может включать указатель пути к этому файлу. destination - строковое выражение, определяющее имя файла - копии, также может включать указатель пути к файлу - копии.

Перед копированием файл открывается в режиме Read. Выражения, определяющие исходный и результирующий файлы могут содержать специальные символы. Если результирующий файл уже существует, он будет замещен копируемым файлом. Во избежание этого необходимо использовать функцию Dir, чтобы определить имена уже существующих файлов. Для установки атрибута файла "только для чтения" используется оператор SetFileAttr.

Пример. Создаем файл с именем example.txt, записываем какую-либо информацию, сохраняем файл, создаем новый каталог и копируем в него созданный файл.

Dim FNum As Integer, FName As String, NewDir As String

Chdir "С:\"

FNum% = FreefileO

FName$="example.txt"

Open FName$ For Output As FNum% ' Создание файла example.txt

Write #FNum%, "I study now LotusScript" 'Запись какой-либо строки в файл

Close FNum%

NewDir="Temp_For_Lotus"

Mkdir NewDir

Filecopy FName$, NewDir & & FName$

Оператор Kill (удалить файл) Синтаксис: Kill filenameПараметры: fileName - строковое выражение, являющееся именем файла; оно может содержать

букву, определяющую устройство и путь к файлу.

Использование оператора Kill требует особого внимания, хотя чаще всего ошибочно удаленный файл можно восстановить с помощью соответствующей команды используемой платформы. Перед удалением файл должен быть закрыт. Kill удаляет файлы, но не каталоги.

Пример. Удаление файла C:\example.txt из файловой системы.

Kill "C:\example.txt"

1.8.11 Операции ввода/вывода

1.8 .11.1 Основные положения

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

276

Page 277: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Для записи или чтения информации из файла необходимо открыть файл. Открываемый файл идентифицируется номером в интервале от 1 до 255. Этот номер обычно используется, как идентификатор файла при выполнении операций ввода/вывода. (Только некоторые операции с файлом используют его имя вместо номера). Соответствие между именем и номером файла, определенное при его открытии, сохраняется до момента закрытия этого файла, после чего этот же номер может быть использован для операций с другим файлом.

Замечание : в описании файловой системы используются названия операторов ввода/вывода. Подробное описание этих операторов представлено в конце раздела.

Файл последовательного доступа

Файл последовательного доступа является текстовым файлом, информация в котором хранится в виде символьных строк произвольной длины. Концом строки файла является символ перехода на новую строку. Данные файла не являются блочными записями. Такой файл не удобен для хранения информации в виде чисел, т.к. числа в нем представлены в виде символьных строк, что влечет за собой необходимость преобразования типа данных файла при выполнении расчетов или записи числовой информации в файл.

Открытие файла последовательного доступа

Файл последовательного доступа открывается в одном из следующих режимов:

• Inpu t (ввод);

• Outpu t (вывод);

• Append (добавление).

Уже открытый файл нельзя открыть еще раз . Для открытия файла последовательного доступа используется оператор Open.

Файл, открываемый для чтения, обязательно должен присутствовать на диске, в противном случае генерируется сообщение об ошибочной попытке открыть несуществующий файл. Файл, открываемый для записи или добавления данных, может не существовать, но, оператором Open, он будет создан автоматически пустым.

Описание типов доступа к файлам, используемым в LotusScript, представлено в следующей таблице.Тип доступа Описание

Последовательный Простой, чаще других встречающийся тип. Обычно, их содержимое - это строки текста, ограниченные символом конца строки. Чтение этих файлов чаще всего производится соответствующими текстовыми редакторами

Прямой Содержит структурированные данные, которые не читаются обычным образом из LotusScript.

Произвольный Являются максимально удобными для манипулирования информацией на уровне байта, который, в свою очередь является минимально доступным уровнем в дисковых операциях

Вывод (запись) данных в файл последовательного доступа_

Для записи значения переменной в файл последовательного доступа, или добавления, используется оператор Print # и Write #

открытый в режиме вывода

Ввод (чтение) данных из файла последовательного доступа 1

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

277

Page 278: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Для чтения данных из файла последовательного доступа, последний открывается в режиме Input. Возможно использование операторов Line Input #, Input # или функции Input для ввода из файла значений переменных. Line Input # вводит из файла одну текстовую строку до символа "Конец строки", не включая этот символ во введенную строку. Например:

Do Until EOF(FilNum%)

Line Input # FilNum%, StrLine$

Print StrLine$

Loop

Эти операторы осуществляют чтение из файла по одной строке до конца файла. Оператор Print осуществляет вывод этих строк на экран дисплея, добавляя при этом в конец каждой строки признак "конец строки". Оператор Input # может быть использован для ввода форматированных записей и записей, сделанных оператором Write #.

Например, допустим, что файл с номером FilNum% содержит следующую строку:

"Learning",987,654,#FALSE#.

Следующие операторы, считывая данные из этого файла, осуществляют присваивание соответствующих значений переменным в следующем порядке: Learning в Label; 987 в intVar; 654 в intVar2; FALSE в Var.

Dim Label As String, Var As Variant

Dim intVar As Integer, intVar2 As Integer

Input #idFile, Label, intVar, intVar2, VarЕсли предполагается частое использование операторов Write # и Input # для операций с файлами

последовательного доступа, то лучше всего поменять стратегию организации обмена и перейти к работе с файлами прямого доступа. Этот тип файлов является лучшим с точки зрения организации частого обмена данными между программой и диском. Для чтения данных из файла последовательного доступа может также использоваться функция Input. В качестве параметра она использует число, указывающее количество вводимых символов, и возвращает строку из заданного количества символов при обращении к ней. Следующий пример демонстрирует применение этой функции для вычисления количества символов, содержащихся в файле:

Dim LenghtFile As String

LenghtFile= Input$(Lof(FileNum%), FileNum%)

' LOF возвращает длину файла, выраженную количеством символов в нем.

Файлы прямого доступа

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

Открытие файла прямого доступа

Для открытия файла прямого доступа используется оператор Open. Если к моменту исполнения оператора Open файл не существовал, то он будет создан этим оператором пустым.

Определение типа записи

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

278

Page 279: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Т.к. все записи файла прямого доступа имеют одну и ту же, определенную длину, то тип данных такого файла определен с фиксированной длиной В противном случае, данные, прочитанные из файпа прямого доступа, будут некорректны. Если длина выводимой в файл записи меньше установленной длины, то запись дополняется пробелами слева, если же длина больше установленной для данного файла запись "усекается" до нужной длины. Для простоты, все внутренние поля записи, определенной пользователем, имеют фиксированную длину.

Если заранее известно, что для вывода в файл будут использованы записи разной длины, параметр Len должен иметь значение максимальной длины выводимых в файл строк, для чего необходимо предварительно оценить длину выводимых строк. Можно выбрать для операции ввода/вывода любую строку файла, указывая номер записи в операторах Get или Put. Пользователь может определить свой тип записи, который может иметь достаточно сложную структуру. Например,

Type BookRec

ID As Integer ' тип Integer, длина 2 байта

NameBook As String * 30 ' Строка фиксированной длины - 60 байт

Author As String * 20 ' Строка фиксированной длины - 4 0 байт

Sale As Integer ' тип Integer, длина 2 байта End TypeЭта запись, длиной 104 байта, поддерживается в операторе Open с помощью указателя длины записи Len=104.

Длина записи подобного типа может быть определена и в момент выполнения операции ввода - вывода с помощью использования функции Len. Например:

Dim RecordSize As Integer, FileNum As Integer

Dim Record As BookRec

FileNum% = 1 ' Номер открытого файла

RecordSize% = Len(Record) ' Длина записи в этом файле

Open "Library.txt" For Random As FileNum% Len = RecordSize%

Ввод (чтение) данных из файлов прямого доступа

Для чтения данных их файла прямого доступа используется оператор Get. Следующий пример демонстрирует чтение записи № 3 из файла с номером FileNum в переменную Record (предполагается существование записи № 3 в файле):

Dim Position As Integer

Dim Record As BookRec

Position = 3

Get FileNum, Position, Record

Вывод (запись) данных в файл прямого доступа

Для записи данных в файл прямого доступа используется оператор Put. Этот оператор либо добавляет новую запись к уже имеющимся в файле, либо перемещает существующую в файле запись на новое место (новый номер). Put используется со следующими параметрами: номер файла, к которому происходит обращение, номер записи, которая записывается в файл, имя переменной, содержащей выводимую в файл запись. Для перемещения записи в файле необходимо просто указать ее номер среди записей файла:

Dim Position As Integer

Position = 3

Перемещение записи 3 с использованием переменной Record:

Put FileNum, Position, Record

Для добавления новой записи к файлу достаточно использовать номер записи, на единицу превышающий номер последней записи в файле. Так, чтобы добавить запись к файлу, содержащему 9 записей, используется номер записи 10.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

279

Page 280: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Для удаления записи из файла произвольного доступа надо перезаписать записи с номерами большими, чем номер удаляемой записи, уменьшив номер каждой из них на 1, т.о. из файла будет исключена запись, т.к. на ее место (номер) будет записана следующая за ней запись. Например:

Dim Record As BookRec

For i = Position To LastRecordNum - 1

Get FileNumber, i + 1, TmpRecord Put FileNumber, i, TmpRecord

Next i

Этот способ не исключает возникновения ошибок, связанных с появлением дублирующих записей в файле из-за ошибки определения начального номера сканирования.

Более надежным способом (хотя и более сложным в реализации) является создание файла, в который копируются все записи, кроме удаляемой, затем исходный файл удаляется, а файл-копия переименовывается именем исходного файла.

Двоичные файлы (произвольного доступа)

Двоичные файлы представляют максимальные возможности управления операциями ввода - вывода данных. Недостатком этого способа доступа, называемого также произвольным доступом, является необходимость точно знать, как записывался этот файл, чтобы обеспечить правильный порядок чтения из него данных. Хотя очень немногие функции и операторы обеспечивают операции с двоичными файлами, в отличие от файлов последовательного и прямого доступа, тем не менее, двоичные файлы являются наиболее гибкими в смысле возможности управления ими.

Открытие двоичных файлов

Для открытия двоичного файла используется оператор Open. Если файл не существует, то при исполнении оператора Open он будет создан пустым, независимо от режима выполнения этого оператора (чтение или запись).

Использование переменной длины полей

В отличие от файлов прямого доступа двоичные файлы могут содержать записи переменной (не фиксированной) длины. Тем не менее, необходимо знать длину записей в порядке их следования в файле. Хорошим стилем программирования считается определение длины каждой записи в двоичном файле. Однако, это необязательно, если строка является составным, определенным пользователем типом. В этом случае, LotusScript автоматически присвоит длину соответствующего поля для каждой строки переменной длины. Двоичный доступ обеспечивает побайтный просмотр файла. Сам файл представляет собой последовательность байтов, которые могут быть как символьной, так и цифровой информацией.

Вывод (запись) данных в двоичный файл

Для записи в двоичный файл используется оператор Put.

Ввод (чтение) данных из двоичного файла

Для чтения данных из двоичного файла используется или оператор Get, или функция Input. Оператор Get, при отсутствии ошибок, считывает информацию из двоичного файла с указанного номера байта в переменную, которая может быть строкой переменной длины или переменной целого типа. Для строки переменной длины количество считываемых символов определяет длину этой строки. (Кстати, это количество может быть равным О, соответствующим образом определяя длину строки переменной длины). Поэтому, необходимо в первую очередь установить длину "принимающей" строки. Если строка в файле находится внутри типа, определенного пользователем, длина строки определяется с некоторым запасом. Например, можно удлинить строку для обеспечения разделения полей, содержащихся в строке.

Функции Input и Inputs также используются для чтения данных из двоичного файла.1.8 .11.2 Операторы ввода/вывода

Оператор Close (закрыть файл(ы))Синтаксис: Close [ [ # ] fileNumber[, [ # ] fileNumber]... ]

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

280

Page 281: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Параметры: fileNumber - опция, являющаяся номером, присвоенным файлу в скрипте при его открытии.

Закрывает один или более открытых файлов, после записи содержимого всех внутренних буферов в эти файлы.

fileNumber - опция, являющаяся номером, присвоенным файлу в скрипте при его открытии. Если опция fileNumber отсутствует, оператор Close без параметров закрывает все открытые файлы.

Отсутствие знака (#) перед fileNumber не влияет на выполнение оператора. Перед закрытием открытых файлов, оператор Close записывает содержимое всех внутренних буферов в эти файлы. Если LotusScript встречается с ошибкой периода выполнения для которой нет оператора On Error, LotusScript закрывает все открытые файлы.

Если значение опции fileNumber содержит дробную часть, LotusScript округляет его до целого значения.

Пример.

Open "example.txt" For Input Access Read Shared As 1 Len = 256 Close #1

Оператор Get (чтение из двоичного файла) Синтаксис: Get [#] fileNumber, [ recordNumber], variableNameПараметры: fileNumber - номер, присвоенный файлу при его открытии в операторе

Open. Номеру предшествует символ #, имя файла и имя переменной, в которую производится считывание данных recordNumber - опция, определяющая позицию в файле (в двоичном файле - позицию байта, в файле произвольного доступа - позицию записи), из которой производится считывание. Если параметр recordNumber пропущен, считывание данных производится из текущей позиции файла.

variableName - переменная, "принимающая" данные из файла.

Первый байт или запись в файле имеют номер позиции 1. После выполнения каждого оператора чтения, значение номера увеличивается. Оператор Get считывает данные в переменную variableName определенного типа.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

281

Page 282: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Следующая таблица определяет "реакцию" оператора Get на различные типы данных переменной variableName.

равна длине записи, Выводятся значения

Type BookRec

ID As Integer Author As

String * 20 End Type

Dim FNum As Integer Dim FName As String Dim Record As BookRec FNum = FreefileO FName =

"library.txt"

Open FName For Random As FNum Len = Len (Record) 'Вывод записи в 1 позицию. Record.ID=00001

Тип var iab leName Действие

Variant Оператор Get преобразует первые два байта к значению типа DataType и считывает их. Если значением DataType является значение Empty или Null, оператор Get останавливает ввод и присваивает переменной variableName значение Empty или Null. Если DataType - число, оператор Get считывает столько байтов, сколько помещается в типе Data Type: Byte - 1 байт, Boolean - 2 байта, Integer - 2 байта; Long - 4 байта; Single - 4 байта; Double - 8 байт; Currency - 8 байт; Date/time - 8 байт.

Строка фиксированной длины Оператор Get считывает определенное число символов, например, если переменная объявлена, как String*10, оператор Get считает 10 символов.

Строка переменной длины Оператор Get считывает данные в зависимости от типа файла.

Произвольный: два байта, считанные первыми, определяют длину строки и Get считывает соответствующее число символов. Если значение variableName меньше числа записей в файле, данные считываются до тех пор, пока это позволяет значение variableName. После этого указатель устанавливается на следующую непрочитанную запись.

Двоичный Указанное число байтов считывается из файла в строку, длина которой определена в опции variableName. Если начальное значение опции не определено, данные из файла не считываются.

Тип, определенный пользователем Число байтов, считываемых из файла равно сумме байтов всех элементов определенного пользователем типа. Этот тип не может содержать элементов типа массив, список или объект.

Пример. Открывается файл произвольного доступа, длина записи в котором указанной в переменной Record. Выводятся записи в указанные позиции файла.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

282

Page 283: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Record.Author="nymKMH" Put

#FNum, 1, Record 'Вывод записи

в 2 позицию. Record.ID=00002

Record.Author="Чехов" Put

#FNum, 2, Record 'Вывод записи

в 3 позицию. Record.ID=00003

Record. Author="ropbKnii' ' Put

#FNum, , Record

'Возврат к началу файла и печать всех записей. Seek

FNum, 1 Do While Not Eof (FNum)

Get #FNum, , Record

Print Record.ID; Record.Author

Loop

Close FNum

'Печатаются следующие записи: ' 1 Пушкин ' 2 Чехов '

3 Горький

Оператор Input #

Синтаксис: Input #fileNumber, variableListПараметры: fileNumber - число - номер открываемого файла. Номеру файла

обязательно предшествует символ #. variableList - список переменных, разделенных запятой.

Читает данные из файла последовательного доступа в переменную.

fileNumber - число - номер открываемого файла. Номеру файла обязательно предшествует символ #.

variableList - список переменных, разделенных запятой. Данные считываются из файла в назначенные переменные. Тип данных файла должен соответствовать типу данных этих переменных. Список variableList не может включать в себя массивы, списки, переменные определенного пользователем типа, или переменные-ссылки. Можно использовать отдельные элементы массива, списка и, определенного пользователем типа или класса.

Следующая таблица представляет для оператора Input # режимы чтения символов в зависимости от типа данных variableList.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

283

Page 284: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Для всех используемых платформ, LotusScript вставляет символ "\п" в любую многостроковую переменную. При печати этот символ трактуется как символ перевода строки. Т.о. при чтении таких данных из файла последовательного

доступа предпочтительнее использовать Input, а не Line Input. Также, при чтении данных из файла произвольного доступа, предпочтительнее использовать Get вместо оператора Input #.

Пример. Файл с именем library.txt открывается для записи в него данных. После закрытия файла, он снова открывается для чтения из него данных. Данные считываются из файла и выводятся на печать.

Dim FNum As Integer, BookNum As Integer, i As Integer Dim

FName As String, BookAuthor As String Dim BookLocation As

Variant Dim BookSale As Currency

Тип данных в var iab leL is t Как Input # считывает символы

Числовая переменная Первый символ в файле, отличный от пробела, становится первой цифрой числа.

Встреченный пробел, запятая и символ конца строки в файле определяет конец числа.

Пустые строки и нечисловые символы преобразуются в цифры 0.

Строковая переменная Первый символ в файле, отличный от пробела, становится первой буквой строки. При формировании строки выполняются следующие условия:

если символ - ("), он игнорируется; но все символы следующие за ним, включая запятые, пробелы, и символы конца строки, вплоть до следующего символа (") считываются в строковую переменную;

если первый символ не является символом ("), то следующий пробел, запятая или символ конца строки заканчивают строку. Символ табуляции не является пробелом.

Строковая переменная фиксированной длины

Считывается согласно указанной длине.

Переменная типа Variant Первый непустой символ файла начинает значение переменной. Если в файле прочитана пустая строка, то переменной присваивается значение пустой строки.

Символы формата дата-время, LotusScript считывает в переменную с типом Variant(Data/Time).

При считывании значения Null переменной присваивается значение Null.

При невозможности определить тип переменной в файле, LotusScript формирует переменную, типа String.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

284

Page 285: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

FNum = FreefileO

FName = "1ibrary.txt"

Open FName For Output As FNum

Write #FNum, "Пушкин", 001, "Russua" ,

Write #FNum, "Хемингуэй", 020, "USA", 9000

Write #FNum, "Гоголь", 300, "Ukraine",

Close FNum

Open FName For Input As FNum For i = 1 To 3

Input #FNum, BookAuthor, BookNum, BookLocation, BookSale Print

BookAuthor, BookNum, BookLocation, BookSale

Next i Close FNum

'Выводит следующие группы значений, которые содержат значения типа

'String, Integer, Variant, и Currency. 'Пушкин 001 Russua 10000

'Хемингуэй 020 USA 9000

'Гоголь 300 Ukraine 8000

10000

8000

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

285

Page 286: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

286

Page 287: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Оператор L ine Input # Синтаксис: L ine Input #fileNumber, varNameПараметры: #fileNumber- номер, присваиваемый файлу при его открытии. Символ #

должен предшествовать номеру файла. varName - переменная, типа String или Variant, в которую считывается строка из файла.

Считывает строку из файла последовательного доступа в переменную типа String или Variant.

Оператор Line Input # считывает символы из файла последовательного доступа пока не встретит символ "перевод строки", который Line Input # не считывает в переменную. При считывании "многостроковой" строки из файла последовательного доступа используется оператор Input #, а не Line Input #.

Пример. Вывод содержимого файла С:\ boot.ini Dim

txt As String, FNum As Integer FNum =

FreefileO

Open "C:\boot.ini" For Input As FNum Do

While Not Eof(FNum)

Line Input #1, txt

Print txt 'Печать одной строки из boot.ini

Loop

Close FNum

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

287

Page 288: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Операторы Lock и UnlockLock [#]fileNumber [, recordNumber \ {[ start ] To end} ] Un lock [#]fileNumber [, recordNumber | {[ start ] To end} ] fileNumber - номер, назначенный файлу при его открытии. recordNumber - для файла произвольного доступа является номером

записи, доступ к которой блокируется/разблокируется; для двоичного файла является номером байта, доступ к которому блокируется/разблокируется. start То end-для файла произвольного доступа это диапазон номеров

записей, к которым блокируется/разблокируется доступ (аналогично, для байтов двоичного файла).

Обеспечивают блокирование/разблокирование доступа к данным файлов.

fileNumber - номер, назначенный файлу при его открытии.

recordNumber - для файла произвольного доступа является номером записи, доступ к которой блокируется/разблокируется; для двоичного файла является номером байта, доступ к которому блокируется/разблокируется.

Первая запись в файле произвольного доступа - это запись номер 1; первый байт в двоичном файле - это байт номер 1.

LotusScript блокирует/разблокирует доступ только к определенной записи или байту. Для файла последовательного доступа блокируется/разблокируется доступ ко всему файлу, независимо от значения, содержащегося в recordNumber.

start То end - для файла произвольного доступа это диапазон номеров записей, к которым блокируется/разблокируется доступ (аналогично, для байтов двоичного файла). Если предложение start пропущено, LotusScript определяет режим доступа в диапазоне от начала файла до значения, указанного в позиции end. Независимо от указанного диапазона, для файлов последовательного доступа LotusScript устанавливает режим доступа для всего файла.

Пример. Создание записи с номером recNum% в файле произвольного доступа с именем DATA.TXT. В качестве номера открываемого файла используется первый свободный номер, значение которого получено с помощью функции FreeFile(). Затем, файл открывается и созданная запись модифицируется. Исходная и измененная записи выводятся на экран.

Type BookRec

ID As Integer

Author As String * 20

End Type

Dim Recordl As BookRec, Record2 As BookRecDim FNum As Integer, RecordNum As Integer

Dim FName As String

RecordNum = 1

FNum = FreefileO

FName = "library.txt"

Open FName For Random As FNum

Recordl.ID = 100

Recordl.Author = "Пушкин"

Синтаксис:

Параметры:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

288

Page 289: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Put #FNum( RecordNum, Recordl Print

Recordl.Author ; Recordl.ID 'Выводит

Пушкин 100

'Открытие и изменение записи. Lock

#FNum, RecordNum Get #FNum, RecordNum,

Record2 Print Record2.Author ;

Record2.ID 'Выводит Пушкин 100

Record2.Author = "Горький" Put #FNum,

RecordNum, Record2 Print Record2.Author

; Record2.ID 'Выводит Горький 100

Unlock #FNum, RecordNum

Close FNum

Оператор Open (открыть файл) Синтаксис: Open fileName [ For { Random | Input | Output | Append | B inary } ] [ Access {

Read | Read Wr i te | Wr i te} ] [ { Shared | Lock Read | Lock Read Wr i te | Lock Wr i te } ]As [#]fileNumber [ Len = recLen ] [ Charse t = MIMECharsetName ] Параметры: fileName -

строковое выражение, определяющее открываемый файл.fileNumber - целое выражение, значение которого лежит в интервале от 0

до 255 включительно. recLen - опция, определяющая длину записи;

Открывает файл для чтения/записи данных. Т.к. этот оператор должен быть записан одной строкой, то при необходимости нужно использовать символ продолжения строки - символ подчеркивания ( _).

fileName - строковое выражение, определяющее открываемый файл. Оно может включать в себя полный путь к файлу. Если специфицированный файл не существует, то для режима Input LotusScript вырабатывает ошибку; для других режимов LotusScript создает пустой файл и открывает его.

For mode (режим) - опция, значение которой определяет режим доступа к файлу; по умолчанию открывается файл произвольного доступа.

Random - режим по умолчанию. Определяет режим произвольного доступа к файлу. В таком файле данные существуют в виде записей, и доступ к ним осуществляется по номеру записи. Для чтения данных из файла используется оператор Get, для записи данных в файл используется оператор Put. Если предложение Access пропущено, LotusScript пытается открыть файл в одном из трех режимов: доступ в режиме Read Write, затем в режиме Write и, наконец, в режиме Read. Если все три попытки открыть файл неудачны, то вырабатывается сообщение об ошибке.

Inpu t - определяет режим последовательного чтения данных из файла. В этом случае используются операторы Input и Input #. Если режим не совпадает с типом файла, LotusScript вырабатывает ошибку. Например, файл открыт в режиме Input при определенном доступе Write.

Ou tpu t - определяет режим последовательного вывода данных в файл. В этом случае используются операторы Write # и Print #. При несовпадении режима с типом файла LotusScript вырабатывает ошибку. Например, файл открыт в режиме Output при определенном доступе Read.

Append - определяет вывод данных (добавление) в конец файла. При несовпадении режимов вырабатывается ошибка. Например, файл открыт в режиме Append при определенном доступе Read.

B ina ry - определяет двоичный файл. Для чтения/записи используются операторы Get и Put. Если предложение Access пропущено, LotusScript пытается открыть файл в одном из трех режимов: Read Write, затем Write и, наконец, Read. Если все три попытки неудачны - вырабатывается сообщение об ошибке.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

289

Page 290: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Access - опция. Определяет операцию, выполняемую с файлом. Вырабатывается ошибка при не совпадении типа доступа и режима файла в предложении For.

Read - по умолчанию определяет доступ к файлу в режиме Input. Разрешает только операцию чтения файла.

Read Wr i te - по умолчанию определяет доступ к файлу, как к файлу произвольного доступа. Разрешает как операцию чтения из файла, так и операцию записи в файл.

Wr i te - по умолчанию определяет доступ к файлу в режимах Output, Append, и Binary. Разрешает только операцию вывода данных в файл.

Lock - опция; значение опции по умолчанию - Shared. Определяет, как открытый файл может использоваться в сетевых процессах. Эта опция не поддерживается операционной системой MS-DOS.

Shared - по умолчанию разрешает для данной машины и других машин сети операции чтения из файла и записи в файл.

Lock Read - запрещает операцию чтения данных из файла, хотя запись данных в файл разрешена. Работает только тогда, когда режим чтения еще не предоставлен какому-либо процессу.

Lock Read Wr i t e - запрещает операции чтения из файла и записи в файл. Работает только тогда, когда режим чтения или записи еще не предоставлен какому-либо процессу.

Lock Wr i t e - запрещает операции записи данных в файл. Работает только тогда, когда режим записи еще не предоставлен какому-либо процессу.

fileNumber - целое выражение, значение которого лежит в интервале от 0 до 255 включительно. Это число определяет номер открытого файла. Другие команды, оперирующие тем или иным образом с этим файлом, используют этот номер, как ссылку на файл.

recLen - опция, определяющая длину записи; используется значение целого выражения в интервале от 1 до 32767 включительно.

• для файла типа Random, опция recLen определяет длину записи в файле (все записи в таком файле имеют

одинаковую длину). По умолчанию, длина записи устанавливается равной 128 байтам;

• для файлов последовательного доступа (Input, Output, или Append), recLen определяет число байтов,

считываемых из файла во внутренний буфер, или из внутреннего буфера в файл, потому, что длина записи

в файле последовательного доступа не фиксирована. Большой объем внутреннего буфера для файловых

дисковых операций увеличивает их скорость. По умолчанию размер буфера равен 512 байт;MIMECharsetName (элемент является новым с LotusDomino R6) - опция, определяет набор символов для

использования во время ввода/вывода в последовательном файле. Если удается найти набор символов, то ввод/вывод в файл осуществляется в зависимости от кодовой страницы текущей платформы со следующими исключениями:

• Если в начале этого файла обнаружен байт (ВОМ) в UTF-16 и UTF-8, то операции ввода/вывода будут

использовать кодовую страницу указанную в этом байте.

• Для существующих файлов OSMOO (iSeries), если не удается обнаружить UTF-16 и UTF-8 ВОМ, то кодовая

страница определяется по файлу в CCSID (набор символов).

Если файл открыт, как Binary, Random, или Input, то данные из него могут быть скопированы в открытый файл с другим номером. Если файл открыт, как Append или Outpute, он должен быть закрыт прежде, чем будет открыт другой файл для его копирования.

Пример. LotusScript вводит данные файла C:\Library.txt в массив BookRec. BookRec тип, определенный пользователем. C:\Library.txt содержит следующие значения: "Пушкин", 100; "Лермонтов", 150; "Гоголь", 50; "Чехов", 200; "Толстой", 250; "Некрасов", 003

Type BookRec

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

290

Page 291: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

ID As Integer

Author As String * 20

End Type

Dim ArrayOfRecords() As BookRec Dim txt As String, FName As String

Dim FNum As Integer, Count As Integer, RecordsCount As Integer FNum =

FreefileO FName="C:\Library.txt" Count = 0

Open FName For Input As FNum Do

While Not Eof(FNum)

Line Input #FNum, txt Count = Count + 1

Loop

Seek FNum, 3

Redim ArrayOfRecords(1 To Count) For RecordsCount = 1 To Count

Input #FNum, ArrayOfRecords(RecordsCount) .Author, _ ArrayOfRecords(RecordsCount) .ID Next

Close FNum

Print ArrayOfRecords(3).Author & " " ArrayOfRecords(3).ID 'Выводит:

'Roman Гоголь 50

Оператор Print (вывод данных) Синтаксис: Print [

exprList ]Параметры: exprList - список выражений, разделенных точкой с запятой, пробелом или запятой.

Выводит данные на экран (в строку состояния).

exprList - список выражений, разделенных точкой с запятой, пробелом или запятой. Если пропущено exprList, оператор Print выводит пустую строку. Для вставки пробелов или символов табуляции между выводимыми элементами данных используются функции Spc и Tab. Оператор Print добавляет символ "перевод строки" (возврат каретки) в конце списка exprList, если в конце списка нет запятой или точки с запятой. LotusScript вставляет символ '\п" в любую "многостроковую" строку (например, строчный блок, заключенный в фигурные скобки). Для всех используемых ппатформ этот знак интерпретируется как символ "перевод строки".

Следующая таблица демонстрирует, как оператора Print "реагирует" на тип данных, определенных в списке exprList.

* для файлов Binary опция recLen игнорируется.

Элемент данных Выводится

Переменная Значение переменной

Строка Строка

Дата-время Строка, соответствующая в используемой платформе формату Short Date и Time. Если одна из частей выражения дата-время отсутстсвует, то выводится только та, которая присутствует в выражении.

Variant/Empty Пустая строка ("").

Variant/Null Строка #Null#.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

291

Page 292: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Следующая таблица демонстрирует действие разделителей точки с запятой и запятой на вывод элементов списка exprList.

Знак пунктуации Действие

Точка с запятой или пробел Следующий элемент списка выводится "вплотную" к предыдущему элементу.

Точка с запятой в конце списка Следующий оператор Print продолжает выводить данные в ту же строку "вплотную" к предыдущему элементу.

Запятая Следующий элемент списка выводится в следующую позицию (зону) табуляции (они следуют одна за другой; длина такой зоны -1 4 символов).

Запятая в конце списка Следующий оператор Print продолжает вывод в ту же строку в следующую позицию табуляции.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

292

Page 293: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример.

Dim one$, two$, three$ one$ = "Один" two$ = "Два" three$ = "Три"

Print one$, two$, three$ 'Выводит Один Два Три

Оператор Pr int # (вывод данных) Pr int #fileNumber, [ exprList ]

fileNumber - номер файла, назначаемый ему при его открытии.Элементы: #, fileNumber(HOMep файла) и запятая являются обязательными.

exprList - опция, являющаяся списком строковых и/или числовыхвыражений, разделенных точкой с запятой, пробелом или запятой. При отсутствии списка exprList оператор Print # выводит пустую строку.

Выводит данные в текстовый файл последовательного доступа.

Оператор Print # используется только для файлов, открытых в режимах Output или Append. В отличие от оператора Write #, оператор Print # не выводит такие форматирующие символы, как запятая и двойные кавычки. Для вставки между выводимыми элементами пробелов или табуляций используются функции Spc и Tab.

Если для установки ширины строки используется оператор Width, то запятая, использованная в качестве разделителя выводного списка, перемещает позицию вывода в следующую позицию табуляции. Если такое перемещение выходит за рамки установленной ширины, то следующий элемент выводится с начала новой строки. Если выводимый элемент не помещается в рамки установленной ширины строки, то, т.к. Print # не обрезает значение выводимого элемента, элемент никуда не выводится. Однако, если такой элемент заканчивается символом "перевод строки", то он выводится с начала следующей строки.

Следующая таблица демонстрирует работу оператора Print # с элементами, определенными в списке exprList.

Синтаксис: Параметры:

Элемент данных Действие

Переменная Значение переменной

Строка Строка

Дата/время Строка, соответствующая в используемой платформе формату Short Date и Time. Если одна из частей выражения дата-время отсутстсвуют, то выводится только та, которая присутствует в выражении.

Variant/Empty Пустая строка ("")

Variant/Null Строка #Null#

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

293

Page 294: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Следующая таблица демонстрирует действие разделителей точки с запятой и запятой на вывод элементов списка exprList.

Пример. Открывается файл example.txt. В файл выводятся две строки. Первая строка содержит 2 значение типа String, вторая строка содержит значение Null, значение Empty, переменную типа Integer, значение типа String, разделенные символом табуляции, после чего файл закрывается и открывается вновь для чтения. Результат чтения данных из файла представлен в последней строке примера.

Dim Varl As Variant, Var 2 As Variant

Dim txt As String, FName As String

FName = " example . txt11

Varl = Null

Dim FNum As Integer

FNum = FreefileO

Open FName For Output As FNum

Print #FNum, "Строка 1: " ; "Кто подставил кролика Роджера?" Print #FNum,

Varl, Var2, FNum, "- To, что попало во вторую строку." Close FNum

Open FName For Input As FNum Do

Until Eof(FNum)

Line Input #FNum, txt

Print txtLoop

Close FNum

'Выводит:

'Строка 1: Кто подставил кролика Роджера?

'Null 1 - То, что попало во вторую строку.Оператор Put (вывод данных) Синтаксис: Put [# ] fileNumber, [recordNumber], variableNameПараметры: fileNumber - номер, присвоенный файлу при его открытии оператором

Open.recordNumber - опция, определяющая позицию в файле (байта в двоичном файле и записи в файле произвольного доступа), в которую выводится текущее значение переменной. variableName - переменная, содержащая выводимые данные.

Выводит значение переменной в двоичный файл или в файл произвольного доступа.

fileNumber - номер, присвоенный файлу при его открытии оператором Open. Наличие знака #, номера файла fileNumber и variableName обязательно.

Знак пунктуации Действие

Точка с запятой или пробел

Следующий элемент списка выводится "вплотную" к предыдущему элементу.

Точка с запятой в конце списка

Следующий оператор Print продолжает выводить данные в туже строку "вплотную" к предыдущему элементу.

Запятая Следующий элемент списка выводится в следующую позицию табуляции

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

294

Page 295: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

recordNumber - опция, определяющая позицию в файле (байта в двоичном файле и записи в файле произвольного доступа), в которую выводится текущее значение переменной. Если эта опция пропущена, вывод данных осуществляется в текущую позицию открытого файла.

variableName - переменная, содержащая выводимые данные. Она не может быть обычным массивом, но может быть массивом фиксированной длины, определенным внутри типа, с определенным количеством элементов.

Первая запись или байт в файле имеет номер 1. После каждого выполнения операции вывода позиция вывода смещается:

• для двоичного файла - на длину выводимой переменной;

• для файла произвольного доступа - на длину выводимой записи.

Если длина значения в переменной variableName длиннее записи, определенной в файле, то не происходит ни стирания, ни удаления уже существующей в файле записи при выводе variableName.

Следующая таблица демонстрирует действия оператора Put в зависимости от типа переменной variableName.

Тип var iab leName Действие оператора Put

Variant Выводятся первые два байта значения переменной

Empty или Null Данные не выводятся

Числовой тип Выводится количество байтов, соответствующего числового типа: Byte - 1 байт, Boolean - 2 байта, Integer - 2 байта, Long - 4 байта, Single - 4 байта, Double - 8 байт, Currency - 8 байт, Date/time - 8 байт

Строка фиксированной длины

Выводится указанное количество символов, например, для переменной, объявленной, как String * 10, будет выведено 10 символов

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

295

Page 296: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример.

Type BookRec

BookID As Integer BookName As String

* 30 End Type

Dim FNum As Integer Dim

FName As String Dim

Book As BookRec FNum =

FreefileO FName =

"library.txt"

Open FName For Random As FNum Len = Len (Book)

Book.BookID = 1

Book.BookName = "Сказки Пушкина"

Put #FNum, 1, Book 'Вывод записи в позицию 1.

Book.BookID = 2 Book.BookName =

"Война и мир"

Put #FNum, 2, Book 'Вывод записи в позицию 2.

Book.BookID = 3

Book.BookName = "Евгений Онегин"

Put #FNum, ,Book 'Вывод записи в текущую позицию 3.

Seek FNum, 1 ' Возврат к началу файла

Do While Not Eof(FNum)

Get #FNum, , Book

Print Book.BookID, Book.BookNameLoop

Строка переменной длины,

Вывод зависит от типа используемого файла:

Файл произвольного доступа:

Первые два выводимых байта определяют длину выводимой строки. Оператор Put выводит соответствующее число символов. Если переменная variableName не инициализирована, то выводится строка нулевой длины. Если длина переменной variableName больше длины записи в файле, LotusScript вырабатывет ошибку. Если переменная variableName короче, чем запись, определенная в файле, то вывод производится но остаток предыдущей записи, на которую наложилась выводимая запись, не стирается.

Двоичный файл:

Число выводимых байтов, равно длине строки, содержащейся в переменной variableName. Если значение ее не инициализировано - данные в файл не выводятся.

Пользовательский тип. Выводит суммарное количество байтов, содержащихся во всех элементах типа, кроме динамических массивов, списков или объектов.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

296

Page 297: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Close FNum

'Результат:

'1 Сказки Пушкина

12 Война и мир

13 Евгений Онегин

Оператор Reset Синтаксис: Reset

Закрывает все открытые файлы. Перед закрытием открытых файлов, оператор Reset выводит, при необходимости, информацию из всех внутренних буферов в файлы.

Оператор Seek Синтаксис: Seek [#]fileNumber, positionПараметры: fileNumber - номер, назначенный файлу при его открытии в операторе

Open.position - позиция, необходимая пользователю для выполнения следующей операции ввода или

вывода данных.

Назначает в открытом файле позицию для выполнения очередной операции ввода/вывода: для байта в двоичном файле; для записи в файле произвольного доступа

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

Номер записи в операторе Get или Put неприемлемы в файле, позиция ввода/вывода в котором определена оператором Seek.

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

Пример.

Type BookRec

ID As Integer Name As

String * 20 End Type

Dim Bookl As BookRec, Book2 As BookRec

Dim FNum As Integer, BookNum As Integer

Dim FName As String

FNum = FreefileO

FName = "library.txt"

BookNum = 5

Open FName For Random As FNum Len = Len (Bookl)

Bookl.ID = 1

Bookl.Name = "Мертвые души"

Print Seek (FNum) 'Выводит 1 в текущую позицию файла

Put #FNum, BookNum, Bookl 'Вывод 5-й записи в файл

Print Seek(FNum) 'Выводит 6

Seek FNum, 1 'Возврат к 1-й записи в файле

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

297

Page 298: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print Seek(FNum) 'Выводит 1

Book2.ID = 2

Book2.Name = "Преступление и наказание"

Put #FNum, , Book2 'Вывод данных в текущую позицию файла

Print Seek(FNum) 'Выводит 2

Close FNum

Оператор Width #Синтаксис: Width MileNumber, widthПараметры: fileNumber - номер, присвоенный файлу в LotusScript во время его

открытия.width - целое выражение, значение которого лежит в интервале от 0 до 255 включительно.

Назначает ширину (длину) строки, выводимой в текстовый файл последовательного доступа.

fileNumber - номер, присвоенный файлу в LotusScript во время его открытия; перед номером должен стоять знак #. Файл обязательно должен быть открыт.

width - целое выражение, значение которого лежит в интервале от 0 до 255 включительно, определяющее количество символов, выводимых как одна строка, начиная с начала строки до перехода на следующую строку. По умолчанию, это значение равно 0 и определяет бесконечную по ширине строку.

Если данные, выводимые обычным образом, выходят за пределы ширины текущей строки,установленной оператором Width #, эти данные выводятся в начало следующей строки. Назначениеоператора Width # действительно только для оператора Print #; оператор Write # игнорирует назначение Width #.

Пример.

Dim FNum As Integer

Dim FName As String

FName = "example.txt"

Оператор Write #Синтаксис: Write #fileNumber[, exprList]Параметры: fileNumber - номер файла, присвоенный ему при открытии.

exprList - опция, являющаяся списком выражений числового типа или типа String, выводимых в файл.

Выводит в файл последовательного доступа любую последовательность символов.

fileNumber - номер файла, присвоенный ему при открытии. Наличие знака # перед номером обязательно.

exprList - опция, являющаяся списком выражений числового типа или типа String, выводимых в файл. Элементы списка разделяются запятыми. Если предложение exprList пропущено, Write # выводит в файл пустую строку.

FNum = FreefileO

Open FName For Output As FNumWidth #FNum, 10Print #FNum, "Первая строка";

Print #FNum, "абвгдеёжзиклмнопрстуфхцч

Print #FNum, "часть будет на другой";

Print #FNum, " увы" ;

Close FNum

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

298

Page 299: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Предложение exprList не может включать массивы, списки, переменные типы или объекты, а также отдельные элементы массива, списка или типа.

Оператор Write # используется только для файлов, открытых в режиме Output или Append. Для ввода данных, которые были выведены в файл с помощью оператора Write #, используется оператор Input #. Оператор Write # игнорирует в файле установку ширины линии оператором Width #. Элементы данных разделяются запятыми; символ "перевод строки" вставляется после вывода в файл любых данных.

При выводе строки с продолжением, LotusScript вставляет символ "\п" (продолжение строки) в любую мультистроку. Если для вывода строки в файл последовательного доступа используется оператор Print #, символ \п для всех используемых платформ трактуется, как символ "перевод строки". При использовании для этой же цели оператора Write # символ \п интерпретируется так же, поэтому, для ввода из файла последовательного доступа мультистрок, выведенных оператором Write #, используется только оператор Input, но не Line Input.

Следующая таблица показывает действие оператора Write # в зависимости от типа данных в списке exprList.

Пример.Dim FNum As Integer, WriterNum As Integer, i As IntegerDim FName As String, WriterName As StringDim WriterLoc As VariantDim WriterAge As ByteFNum = FreefileOFName = "Writers.txt"Open FName For Output As FNumWrite #FNum, "Пушкин Александр Сергеевич", 1, "Россия", 37 Write #FNum, "Хорхе Луис Борхес", 2, "Испания", 86 Write #FNum, "Александр Дюма", 3, "Франция", 68 Close FNum'Чтение из файла и вывод. Open FName For Input As FNum For i = 1 To 3

Input #FNum, WriterName, WriterNum, WriterLoc, WriterAge Print WriterName, WriterNum, WriterLoc, WriterAge

Next i Close FNum

1.8 .11.3 Функции ввода/вывода

Тип данных Действие оператора Wr i te #

Числовой Отбрасываются пробелы впереди и сзади строки

String Заключает все строки в двойные кавычки. Добавляет до необходимой длины пробелами значение фиксированной длины.

Variant (Date/Time) Используется один из следующих форматов: #yyyy-mm-dd hh:mm:ss# #yyyy-mm-dd#

#hh:mm:ss#

Если отсутствует какая-либо часть выражения (определяющая дату и/или определяющая время), выводится только присутствующая часть значения.

Variant, значение Empty В файл выводится запятая. Если же пустой элемент является последним в выводном списке, то запятая не выводится.

Variant, значение Null В файл выводится строка Null.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

299

Page 300: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция EOF Синтаксис: EOF ( fileNumber)Тип возвращаемого значения: Integer.Параметры: fileNumber - номер, идентифицирующий файл, присвоенный ему при его открытии.

Возвращает целое значение, определяющее достижение конца файла.

Возвращаемое значение зависит от типа используемого файла. Следующая таблица определяет значения функции EOF для двоичных файлов, файлов произвольного и последовательного доступа.

Определяет достижение конца файла при чтении из него данных. Символ Ctrl+Z (ASCII код = 26) не определяет маркер конца файла любого из вышеуказанных типов.

Пример.

Dim txt As String, FNum As Integer FNum = FreefileO

Open "C:\boot.ini" For Input As FNum Do

Until Eof(FNum)

Line Input #FNum, txt

Print txt

Loop

Close FNum

Функция FreeFileСинтаксис: FreeFileТип возвращаемого значения: Integer.

Возвращает свободный номер (тип Integer) для использования при открытии файла.

Функция FreeFile выдает номер файла, не являющийся номером ни одного уже открытого файла. Если все возможные номера использованы, выдается сообщение об ошибке. Всего таких номеров может быть от 1 до 255. Вызвать функцию можно в виде FreeFile или FreeFile().

Пример. Использование функции FreeFile для получения свободного номера файла. Значение номера хранится в переменной FNum.

Dim FNum As Integer

'Присваивает переменной fileNum значение следующего допустимого 'номера

файла. FNum = FreefileO

Тип файла EOF возвращает True ( -1 ) если: EOF возвращает False(O) если:

Двоичный При выполнении оператора Get не удалось выполнить чтение затребованных номером байтов данных.

при выполнении оператора Get удалось выполнить чтение затребованных номером байтов данных

Произвольный Затребованная запись не может быть прочитана по причине достижения конца записей в срайле

Чтение затребованной записи успешно выполнено

Последовательный Достигнут конец файла Не достигнут конец файла

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

300

Page 301: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Print FreefileO ' Выводит 1 (1 не использован)

Open "example.txt" For Input Access Read As FNum ' Открыт файл с № 1

Print FreefileO 'Выводит 2 (номер 1 использован)

Close FNum

Print FreefileO 'Выводит 1 (номер 1 не использован)

Функция Input Синтаксис: lnput[$] ( count, [#]fileNumber)Параметры: count - число считываемых символов.

fileNumber - число, определяющее номер открываемого файла.

Считывает последовательность символов из последовательного или двоичного файла в строковую переменную без каких-либо преобразований. Возвращаемое значение для функции Input - типа Variant, а для функции lnput$ - типа String.

LotusScript возвращает определенное число символов, начиная с текущей позиции в файле. Если количество запрашиваемых символов превышает разрешенное, возвращается максимально разрешенное количество символов. Если длина возвращаемой строки превышает значение count, выдается сообщение об ошибке. Если значение счетчика считываемых символов (count) = 0, LotusScript возвращает (""). Возвращаются все считываемые символы, включая символы "перевод строки", двойные кавычки, пробелы. При необходимости, можно получить байтовые представления символов используя функции InputB или InputBS.

Можно использовать функции Input, Inputs, InputB, или InputBS для чтения данных из файла, открытого в режиме Output, Append, или Random.

Пример.

Dim FNum As Integer Dim

FName As String Dim

FCheck As String FNum =

FreefileO FName =

"example.txt" 'Вывод

данных.

Open FName For Output As FNum

Write #FNum, "Александр Пушкин", 1, "Россия"

Write #FNum, "Мигель де Сервантес Сааведра", 2, "Испания"

Close FNum

'Чтение первых 30 символов и печать данных. Open

FName For Input As FNum FCheck = Input$(30, FNum)

Print FCheck ' Выводит: "Александр Пушкин", 1, "Россия"

Close FNum

Функция InputB Синтаксис: lnputB[$] ( count, [#]fileNumber)Параметры: count - количество считываемых.

fileNumber - номер открываемого для чтения файла.

Возвращает указанное количество байтов из файлов последовательного доступа или двоичных в строковую переменную без преобразования данных. Функция InputB возвращает значение типа Variant, а InputBS - типа String.

LotusScript возвращает указанное количество байтов, начиная с текущей позиции в файле. Если количество запрошенных байтов превышает допустимое, будет возвращено допустимое количество байтов и выдано сообщение об ошибке. Количество возвращаемых символов равно половине количества возвращаемых байтов (при нечетном количестве возвращаемых байтов их число автоматически приводится к четному с помощью операции count +1). Если count = 0, LotusScript возвращает пустую строку ("").

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

301

Page 302: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Считываемые данные не преобразуются. Все байты вводятся без изменения, включая байты, представляющие "перевод строки", двойные кавычки и пробел. Можно использовать функции Input, Inputs, InputB, или InputBS для чтения данных из файла, открытого в режиме Output, Append, или Random.

Пример. Выводит на печать 10 байтов из файла с номером FNum. FCheck

= Inputb$(10, FNum)Функция LOC ____________________________________________________________.Синтаксис: LOC ( fileNumber)Параметры: fileNumber - номер, назначаемый файлу при его открытии.

Пример. Создается произвольный файл с именем DATA.TXT и в него записываются две записи. В процессе записи контролируется длина файла. После перезаписи второй записи на место первой (удаления первой записи) длина файла уменьшается на 1. Туре BookRec

ID As Integer Name As

String * 20 End Type

Dim Book As BookRec

Dim FNum As Integer

Dim FName As String

FNum = FreefileO

FName = "examp1e.txt"

Open FName For Random As FNum

Book.ID = 1

Book.Name = "Красная книга" Put #FNum, 1, Book

Print Loc(FNum) ' Выводит 1

Book.ID = 2

Book.Name = "Герой нашего времения" Put #FNum, 2, Book

Print Loc(FNum) ' Выводит 2

Get #FNum, 1, Book

Print Loc(FNum) ' Выводит 1

Close FNumФункция LOF Синтаксис: LOF ( fileNumber)

Возвращает текущую позицию в файла.

Следующая таблица представляет значения, возвращаемые функцией LOC для произвольного доступа, последовательного доступа и двоичных файлов.

файлов

Тип файла Возвращаемое значение

Произвольный Номер последней записи считанной или записанной в файл, это позиция в файле минус 1.

Последовательный Номер позиции байта в файле, делённой на 128 и округленной до значения. целого

Двоичный Номер позиции последнего считанного или записанного в файл байта, это позиция в файле

минус 1.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

302

Page 303: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Тип возвращаемого значения: Long.

Параметры: fileNumber - номер, назначенный файлу при его открытии.

Возвращает длину открытого файла в байтах (тип Long). Функция LOF работает только с

открытым файлом.

Пример. Создание файла и использование LOF для определения размера файла

Dim FNum As Integer, i As Long

Dim FName As String, FSize As String

FNum = FreefileO

FName = "example.txt"

Open FName For Append As FNum

For i=0 To 100

Print #FNum, i

Print i

Next

Close FNum

Open FName For Input As FNum FSize = Lof(FNum)

Print "Размера файла составляет; " & FSize & " байт" Close FNum

Функция Seek Синтаксис: Seek ( fileNumber)Тип возвращаемого значения: Long.Параметры: fileNumber - номер, назначенный файлу при его открытии в операторе Open.

Возвращает значение текущей позиции в открытом файле (позицию байта в двоичном файле и позицию записи в файле произвольного доступа).

Функция Seek возвращает значение типа Long, заключенное в интервале от 1 до 2.0Е31 - 1 включительно, если номер позиции в файле не превышает этот диапазон. Для файла, в котором номер позиции превышает 2.0Е30, возвращается отрицательное значение.

Для двоичных файлов и файлов последовательного доступа, функция Seek возвращает значение текущей позиции байта внутри файла. Для файла произвольного доступа, функция Seek возвращает номер следующей записи внутри файла.

Первый байт или первая запись в файле всегда имеют номер позиции равный 1.

Пример.

Type BookRec

ID As Integer Name As

String * 20 End Type

Dim Book As BookRec

Dim FNum As Integer, BookRecNum As Integer Dim

FName As String

FNum = FreefileO FName =

"library.txt" BookRecNum =

5

Open FName For Random As FNum Len = Len (Book)

Book.ID = 1 Book.Name = "В людях"

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

303

Page 304: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция TabСинтаксис: Tab ( column )Параметры: column - любое числовое выражение в интервале значений от 1 до 32000 включительно

При вызове из операторов Print или Print # функция Tab выводит в текущую позицию указанное количество символов.

column - любое числовое выражение в интервале значений от 1 до 32000 включительно, определяющее количество позиций вывода. Даже если значение column меньше 1, по умолчанию функция Tab установит ее в 1 (левая граница вывода).

Если определена ширина для выводного файла, функция Tab проверяет значение column на соответствие этой ширине и выполняет следующее:

• если вывод производится уже за пределами установленной ширины, функция Tab выводит символ "перевод строки" и

продолжает вывод оставшихся символов в следующую строку;

если количество символов, определенное значением column, помещается в текущую позицию, функция Tab

выводит необходимое количество символов, начиная с указанной позиции в текущую строку. Если вывод

производится в строку, ширина которой установлена с помощью оператора Width #, функция Tab

выполняет следующее:

Пример. Выводится содержимое переменных firstN и lastN. Функция Tab() используется для разделения следующих элементов. Bob Jeremiah, Jeremiah, Jeremiah, Jeremiah. Точка с запятой в операторе Print является опцией; знак не влияет на формат вывода, если позиции вывода определяются с помощью Tab.

Dim FirstName As String, LastName As String

FirstName = "Александр"

LastName = "Пушкин"

Print FirstName; Tab(5); LastName; Tab(l); LastName; Tab(2); LastName;

Tab (3); LastName

Print Seek (FNum) 'Выводит 1 в текущую позицию файлаPut #FNum, BookRecNum, Book 'Вывод 5 -

йзаписи в файл

Print Seek (FNum) 'Выводит 6

Seek FNum, 1 'Возврат к 1-й записи в файле

Print Seek (FNum) 'Выводит 1Book.ID = 2

Book.Name = "По ком звонит колокол"

Put #FNum, , Book 'Вывод данных в текущую позицию файла

Print Seek(FNum) 'Выводит 2

Close FNum

Column Tab выводит

> ширины column Mod width

< 1 column 1

< текущей позиции вывода (column - текущая позиция) следующая строка

> текущей позиции вывода (column - текущая позиция)) та же строка

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

304

Page 305: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.8.12 Работа с OLE-объектами

Основные положения

Концепция связи и встраивания объектов (OLE - Object Linking and Embedding), обеспечивает текущему приложению доступ к данным других приложений, включая возможность их использования и, при необходимости, изменения.

OLE-объект - группа определенных данных, например, текст, графика, звук и вообще все, что отображается и поддерживается каким-либо приложением - OLE-сервером.

Любое другое приложение, поддерживающее протокол OLE - OLE-клиент - может обращаться к данным OLE-объекта. OLE-объект может быть или связан с использующим его приложением (сам OLE- объект в этом случае хранится отдельно от приложения, а приложение "знает", где он хранится), или встроен в текущее приложение (OLE-объект "хранится" в самом приложении). И в том и в другом случае приложение-клиент может получить доступ к данным OLE-объекта.

Функция CreateObject Синтаксис: CreateObject ( className )

Параметры: className - строка типа Variant, удовлетворяющая спецификации вида appName.appClass.

Создает OLE-объект и возвращает ссылку на него.

className - строка типа Variant, удовлетворяющая спецификации вида appName.appClass и определяющая тип создаваемого объекта, например, "WordPro.Document". appName - имя приложения, которое поддерживает OLE-объект. appClass - класс создаваемого OLE-объекта (одно приложение-сервер может поддерживать OLE-объекты нескольких классов).

Если приложение-сервер еще не выполняется, то CreateObject запускает его, чтобы создать OLE- объект.

Оператор Set присваивает возвращаемое функцией CreateObject значение ссылки переменной типа Variant. Ссылка на OLE-объект является допустимой только во время выполнения поддерживающего его приложения. Если это приложение завершается, a OLE- объект не сохранен, LotusScript возвращает ошибку периода выполнения.

LotusScript поддерживает OLE-коллекции оператором ForAII. Поддерживаются и "параметрические" свойства OLE-объектов. Например, если OLE-объект, ссылку на который "хранит" переменная w, имеет свойство Property с двумя аргументами, чтобы присвоить этому свойству значение 10, нужно "записать":

w.Property(argl, arg2) = 10Пример. Пример. Создание документа Word, вставка в него строки текста и сохранение документа в файле. Add,

TypeText, SaveAs, Quit - свойства и методы OLE-объекта класса Application и Document, поддерживаемого сервером (текстовым процессором) Word.

Dim objWordDoc As Variant

Set objWordDoc = CreateObject("Word.Application" ) obj

WordDoc.Documents.Add

objWordDoc.Selection.TypeText "Какой-либо текст! Это значение не имеет!"

obj WordDoc. Ac t iveDocument. SaveAs "с: \Doc1. docx"

obj WordDoc.Qui t

Set objWordDoc = Nothing

Функция GetObject Синтаксис: GetObjec t ( pathName [, className ])Параметры: pathName - строка, содержащая полный путь и имя файла OLE-объекта или

пустая строка. Если задана пустая строка, то должна быть пределена строка className.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

305

Page 306: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

className - строка вида appName.appClass, определяющая приложение, в котором создан OLE-объект и класс этого OLE-объекта. Например, "WordPro. Application".

Открывает OLE-объект и возвращает ссылку на него.

Возвращаемая функцией GetObject ссылка на OLE-объект присваивается переменной типа Variant оператором Set.

Если приложение, специфицированное как appName, не выполняется, функция GetObject запускает его. Ссылка на OLE-объект "имеет силу" только во время выполнения поддерживающего его приложения. Если это приложение незапланированно завершается, LotusScript выдает ошибку периода выполнения.

Если pathName указано пустой строкой (""), функция GetObject пытается найти любой текущий активный объект специфицированного класса. Если такой объект не найден - выдается ошибка.

Пример. Файл c:\status.sam загружается в редактор WordPro (как в приложение-сервер). Оператор Set присваивает переменной myDoc ссылку на OLE-объект. К OLE-объекту применяется метод Print - документ печатается.

Dim myDoc As Variant

' Получение ссылки на OLE-объект из файла Set myDoc =

GetObject("с:\Docl.docx", "Word.Document")

' Вызов метода Print, определенного для объекта класса Word.DocumentmyDoc.Print

1.8.13 Синхронизации работы параллельно выполняемых Web-агентов

Типичной реализацией выполнения серии операций в базе данных при взаимодействии Domino- приложения с Web-пользователем являются Web-агенты.

Начиная с версии Domino 4.5.1 возможно параллельное исполнение Web-агентов.

Каждый Web-агент исполняется в отдельном потоке серверного процесса HTTP. Если на сервере не разрешено одновременное (асинхронное) выполнение нескольких Web-агентов, то они выполняются последовательно (serialized). Это приводит к тому, пользователь может долго ждать результата простой операции в случае, если более сложную (длительную) операцию раньше запросил другой пользователь. Параллельное (asynchronous) исполнение Web-агентов позволяет достичь оптимального времени отзыва системы, адекватного сложности операции и зависящего от количества пользователей, но не от очередности обращения пользователей.

В примере в таблицах видно, что параллельное исполнение агентов приводит к относительно небольшому увеличению времени работы агента 1 (сложного) и в то же время к ощутимому уменьшению времени реакции системы на запрос пользователя В (простой агент 2).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

306

Page 307: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Но простого разрешения параллельного исполнения Web-агентов на сервере недостаточно. Необходимо обеспечение устойчивости такой многопотоковой системы. Устойчивость многопотоковой системы предполагает:

• либо отсутствие общих ресурсов потоков

Последовательное исполнение агентов:Момент времени Операция Комментарий

0 Пользователь А инициирует запуск агента 1

1 Вычисления Стартует агент 1. Пользователь В инициирует запуск агента 2

2 Вычисления Выполняется агент 1

3 Вычисления Выполняется агент 1

4 Вычисления Выполняется агент 1

5 Вывод результата Завершает работу агент 1

6 Вычисления Стартует агент 2

7 Вывод результата Завершает работу агент 2

Параллельное исполнение агентов:

Момент времени Поток 1 Поток 2 Комментарий

0 Пользователь А инициирует запуск агента 1

1 Вычисления Стартует агент 1. Пользователь В инициирует запуск агента 2

2 Вычисления Выполняется агент 1

3 Вычисления Агент 1 приостанавливается. Стартует агент 2

4 Вывод результата Завершает работу агент 2

5 Вычисления Выполняется агент 1

6 Вычисления Выполняется агент 1

7 Вывод результата Завершает работу агент 1

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

307

Page 308: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• либо наличие (и использование) механизмов блокировки ресурсов потоками

Общим ресурсом могут быть подлежащая модификации информация в БД. Для того, чтобы избежать конфликтов необходимы механизмы синхронизации.

LotusScript 5.0 (в Domino R8) такие средства синхронизации Web-агентов имеет. Они появились в LotusScript 4.0 (в Domino R5). Этими средствами являются встроенные функции работы с семафорами (с терминологии документации - lock):

CreateLock - создание (подключение к) семафора DestroyLock - уничтожение (отключение от) семафораCodeLock - закрытие семафора

CodeUnlock - открытие семафора

CodeLockCheck - длина очереди к семафору

Sleep - приостановка работы скрипта на указанное время

Функция CreateLock Синтаксис:

CreateLock ( пате )Тип возвращаемого значения: Integer. Параметры: пате -строка. Имя семафора.

Возвращает целочисленный идентификатор семафора (lock) с именем, заданным строкой пате. Если ссылок на семафор с таким именем до сих пор не было (например, в другом потоке), то он создается и ему присваивается идентификатор.

Успешно полученный идентификатор является целым числом.Можно сказать больше: значение идентификатора всегда число от 0 до 255 и нельзя определить более 256

семафоров (такая попытка заканчивается ошибкой с номером 238 - "Maximum number of semaphores permitted reached"). Т.е. под хранение идентификатора используется один байт.

Если переменная, хранящая значение идентификатора, оказалась за пределами области видимости, идентификатор может быть безболезненно переполучен повторным вызовом функции. Другими словами, в Web-агенте (т.е. в пределах одного потока) можно сколько угодно раз подключаться к одному и тому же семафору, например, в каждой определенной пользователем подпрограмме или функции. Имена семафоров уникальны в пределах текущей области общей памяти, т.е. для всех Web-агентов, выполняющихся в рамках задачи HTTP. При завершении работы потока все ссылки на использовавшиеся семафоры автоматически удаляются и, если нет больше ссылок, удаляется семафор. Несмотря на это правильнее удалять ссылки на семафоры явно, используя функцию DestroyLock.

Если платформа не поддерживает механизм семафоров или недостаточно общей памяти, то будет возвращена ошибка.

Функция CodeLock Синтаксис: CodeLock ( I D )Параметры: ID - целое число, индентифицирующее семафор.

Выполняется попытка зыкрытия семафора с идентификатором, заданным целым числом ID. Идентификатор ID должен быть предварительно получен вызовом функции CreateLock.

При успешном закрытии семафора функция возвращает TRUE. Другое значение означает неуспешное завершение операции. Этот исход принципиально отличается от ситуации, когда семафор уже закрыт другим Web-агентом. В этом случае выполнение Web-агента приостанавливается, как будто функция CodeLock долго не возвращает результат. В это

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

308

Page 309: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

время многопотоковая система передает управление следующему Web-агенту и т.д. Таким образом, образуется очередь агентов, пытающихся закрыть один и тот же семафор, и все "ждут" пока семафор откроется.

Попытка закрыть семафор с неизвестным идентификатором (ссылка на семафор не была создана вызовом CreateLock или уже была удалена вызовом DestroyLock) приводит к возникновению ошибки с номером 235 - "Lock ID has not been created".

Любой семафор, закрытый функцией CodeLock, обязательно должен быть открыт вызовом функции CodeUnLock. Несоблюдение этого правила приводит к непредсказуемым результатам.

Функция CodeUnLock Синтаксис: CodeUnlock ( I D )Параметры: ID- целое число, индентифицирующее семафор.

Открывает семафор, заданный идентификатром ID. Идентификатор ID должен быть предварительно получен вызовом функции CreateLock. Открытый семафор становится доступен следующему агенту в очереди на закрытие.

Любой семафор, закрытый вызовом функции CodeLock, обязательно должен быть открыт вызовом функции CodeUnLock. Несоблюдение этого правила приводит к непредсказуемым результатам.

Функция CodeLockCheckСинтаксис: CodeLockCheck ( I D As Integer)Тип возвращаемого значения: Long.Параметры: ID - целое число, индентифицирующее семафор.

Для указанного идентификатором ID семафора возвращает число агентов закрывших семафор или ожидающих своей очереди на закрытие. Другими словами, возвращается длина очереди агентов "к закрытому семафору" плюс один. Результат является целым числом.

Эта функция никак не отражает число агентов ссылающихся на данный семафор (получивших с помощью функции CreateLock его идентификатор).

Пример 1. Семафор "SomeLockName" закрыт неким агентом и других агентов, ожидающих его открытия, нет.

Dim LockID As Integer, fl As Boolean

LockID = Createlock("Lockerl")

fl=Codelock(LockID)

Print "Агент 1: " & Codelockcheck(LockID) ' Печатает 1

Пример 2. Семафор "SomeLockName" закрыт неким агентом и есть еще один агент, запросивший закрытие семафора и ожидающий его открытия.

Dim LockID As Integer

LockID = Createlock("Lockerl")

Print ".Агент 2: " Codelockcheck(LockID) ' Печатает 2

Пример 3. Семафор "SomeLockName" открыт.

Dim LockID As Integer, fl As Boolean LockID =

Createlock("Lockerl" ) fl=Codeunlock(LockID)

Print "Агент 1: " & Codelockcheck(LockID) ' Печатает 0

Функция DestroyLock Синтаксис: DestroyLock ( I D as Integer)Параметры: ID - целое число, индентифицирующее семафор.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

309

Page 310: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Удаляет ссылку текущего агента (т.е. потока) на указанный семафор. Если при этом общее количество ссылок на этот семафор оказывается равным нулю, то семафор удаляется (освобождается его идентификатор). Идентификатор ID должен быть предварительно получен вызовом функции CreateLock.

При успешном удалении ссылки на семафор функция возвращает TRUE. Другое значение означает неуспешное выполнение операции.

Несмотря на то, что при завершении работы агента ссылки на использовавшиеся агентом семафоры автоматически удаляются, рекомендуется удалять ссылки на семафоры явно, используя функцию DestroyLock.

Пример. Удаление ссылок агента на семафоры Dim LockID As Integer

LockID = Createlock("Lockerl") ' Получаем 0 - идент. семафора Print

Destroylock(LockID) ' Печатает True

Print Destroylock(10) ' Ошибка № 235 - "Lock ID has Not been created"

Оператор Sleep Синтаксис: Sleep ( t i m e as Float)Параметры: time - дробное число типа Float.

Приостанавливает выполнение скрипта на указанное время. Время остановки указывается в секундах дробным числом time. Приостановка выполнение скрипта с помощью этого оператора имеет принципиальные отличия и преимущества от традиционной реализации задержки в виде формального цикла:

• при задержке по оператору Sleep не занимаются вычислительные ресурсы;

освободившиеся ресурсы используются другим процессом; в

многопоточной системе управление передается другому потоку.

В случае параллельного исполнения Web-агентов при приостановке одного из них управление автоматически передается следующему.

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

Минимальное время задержки определяется платформой, на которой исполняется код. Если минимальным квантом является милисекунда, то указанное дробное число будет округлено до тысячных.

Обширный пример использования оператора Sleep имеется в пункте "Пример синхронизации работы параллельно выполняемых Web-агентов" этого параграфа.

Пример. На диаграмме загрузки процессора (см. ниже) хорошо видно, что при приостановке скрипта оператором Sleep системные ресурсы не занимаются. Кстати, пики загрузки процессора приходятся на формальные циклы.

For i& = 1 То 100000 ' занимает процессорное время

Next

Print Now

Print "-"Print Now ' выполняется моментально вслед за предыдущим оператором (время попросту

совпадает)

Print "-"

Sleep(5) ' процессор не нагружается

Print Now ' время отличается ровно на 5 секунд

For i& = 1 То 100000 ' занимает процессорное время

Next

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

310

Page 311: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция GetThreadlnfo Синтаксис: GetThreadlnfo ( I n f o l D )

Параметры: InfolD - числовой код, определяющий вид возвращаемого показателя. Возвращает

системную информацию о текущем потоке.Возможные значения и назначения данного кода приведены с таблице:_______________

Функция возвращает значение типа Variant, содержащее строку или число в зависимости от конкретного кода.

Пример. Результат работы функции GetTheadlnfo на рабочей станции Notes 5.0. %INCLUDE "lsconst.lss" Sub

Click(Source As Button)

Kernel: Processor Usage (%)

Код Показатель

LSI THREAD LINE Номер текущей строки

LSI THREAD PROC Имя текущей процедуры

LSI THREAD MODULE Системное имя текущего модуля

LSI THREAD VERSION Номер версии LotusScript

LSI THREAD LANGUAGE Текущие языковые настройки

LSI THREAD COUNTRY Номер национальных настроек

LSI THREAD TICKS Значение системного таймера

LSI THREAD TICKS PER SEC Число квантов таймера в секунду

LSI THREAD PROCESS ID ID текущего процесса

LSI THREAD TASK ID ID текущей задачи

LSI THREAD CALLPROC Имя вызвавшей процедуры

LSI THREAD CALLMODULE Имя вызвавшего модуля

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

311

Page 312: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Разрешение параллельного исполнения Web-агентов

Для того чтобы Web-агенты выполнялись не последовательно (serialized), а параллельно (asynchronous),необходимо в файл notes.ini сервера записать строку

DominoAsynchronizeAgents-1 и перезапустить серверную задачу HTTP.

Файл notes.ini можно (и лучше) не править напрямую, а включить соответствующую опцию в серверном документе в базе данных Domino Directory (название в предыдущих версиях - Public Address Book):

Basics j Security | Ports j Server Tasks "Internet Protocols)! MTAs | Miscellaneous | Transactional Logging | Administration

(HTTP) Domino Web Engine ] NOP ] LDAP ] NNTP )

Пример синхронизации работы параллельно выполняемых Web-агентов

Предположим, имеется некое Domino-приложение, выполняющееся на сервере Domino, допускающем асинхронное исполнение Web-агентов. Запросы пользователей обрабатываются Web- агентами, которые выполняют критичную для многопотоковой работы операцию, например, модификацию одних и тех же данных. Во избежание конфликта агенты создают (и непосредственно перед записью блокируют) специальный флаг. Назовем его "MyUpdateLock".

Таким образом, сценарий работы таков:

Call SubProcOEnd SubSub SubProc()

Print Getthreadinfo(LSI THREAD __LINE) ' Выводит 2

Print Getthreadinfo(LSI THREAD PROC) 1 Выводит SUBPROC

Print Getthreadinfo(LSI THREAD MODULE) ' Выводит •2D78814

Print Getthreadinfo(LSI THREAD VERSION) ' Выводит Б.0.0.0 8А

Print Getthreadinfo(LSI THREAD LANGUAGE) 1 Выводит en

Print Getthreadinfo(LSI THREAD COUNTRY) ' Выводит 0

Print Getthreadinfo(LSI. THREAD TICKS) ' Выводит 20477828

Print Getthreadinfo(LSI. THREAD TICKS PER SEC) 1 Выводит 1000

Print Getthreadinfo(LSI THREAD PROCES S ID) ' Выводит 3832

Print Getthreadinfo(LSI THREAD TASK ID) ' Выводит 0

Print Getthreadinfo(LSI THREAD CALLPROC) 1 Выводит CLICK

Print Getthreadinfo(LSI THREAD CALLMODULE) • Выводит •2D78814

End Sub

• 'ШШвЖкЯВВЯМКИИВМ ̂ НИИИШРИВ

1i v.. in . ни

Run web agents r Enabled r.-H.concurrently? 1Web agent timeout (in seconds)

r 0 j

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

312

Page 313: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Агент Agentl стартует, создает флаг "MyUpdateLock" и выводит об этом сообщение. Далее агент Agentl приостанавливает свою работу на секунду. Это сделано в примере специально, для того чтобы заведомо смог начать параллельную работу агент Agent2 (в противном случае нельзя быть уверенным в том, когда именно будет переключен контекст потоков). Агент Agent2, стартовав, также создает флаг "MyUpdateLock".

Далее один из агентов, например Agent2, захватавает (блокирует) флаг "MyUpdateLock" и выводит об этом сообщение. Потенциально продолжительная работа агента по модификации данных в нашем примере сымитирована секундной задержкой. В это время опять может (и происходит) переключение на другой поток. Но параллельный агент не может войти в критичный блок "модификации данных", так как не может захватить флаг - флаг остался занят первым агентом - и ждет (фактически, результата функции захвата флага). Контекст снова переключается. Первый агент, закончив критичную работу, освобождает (разблокирует) флаг и выводит на консоль соответствующее сообщение. В этом месте кода намеренно сделана очередная секундная задержка, для того чтобы снова переключился контекст потоков. Это происходит. Агент, пытающийся захватить флаг, наконец, его получает и так далее.

В нашем примере захват-освобождение флага повторяется в цикле 5 раз. Option

Public Option Declare Sub Initialize Const CountSec=l

Dim TaskID As String, LockerName As String Dim

LockerlD As Integer, i As Integer Dim CodeLocker

As Variant On Error Goto ErrH

' Присваиваем агенту имя (чтобы идентифицировать вывод) TaskID =

agn

Print TaskID & " стартует"

LockerName = " AgentLocker" '

Создаем флаг

LockerlD = Createlock(LockerName)

If (LockerlD <> -1) Then Print TaskID & " создал блокировку: " & LockerlD ' Делаем

задержку в одну секунду ' Это позволит запуститься второму агенту. Sleep CountSec For

i = 1 То 5

' Пытаемся захватить флаг, сообщаем об этом • а также сообщаем длину очереди на

захват флага CodeLocker = Codelock(LockerlD) If (CodeLocker) Then

Print TaskID & " захватил блокировку: " & LockerD & " - в: " & Now()

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

313

Page 314: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

CodeLocker = Codelockcheck(LockerlD)

Print TaskID & " - количество запущенных агентов: " & CodeLocker '

Выполняем критичную работу. Для простоты ' создаем задержку в одну секунду

Sleep CountSec

Else

Print TaskID & ". He удалось захватить блокировку"

End If

' Освобождаем флаг. Другой агент теперь может его захватить

CodeLocker = Codeunlock(LokerlD) If (CodeLocker) Then

Print TaskID & " отпустил блокировку: " & LockerlD & " - в: " & Now() ' Делаем

задержку для того, чтобы другой агент мог захватить ' флаг прежде, чем данный агент

снова его захватит Sleep CountSec

Else

Print TaskID & " . He удалось отпустить блокировку."

End If

Next

' Критичная работа завершена. Отключаемся от флага.

CodeLocker = Destroylock(LockerlD) If (CodeLocker ) Then

Print TaskID & " уничтожил блокировку " & LockerlD

Else

Print TaskID & " не удалось уничтожить блокировку"

End If

Print TaskID & " завершился"

Exit Sub

ErrH:

Print Err & {: } & Error$ & { - } & Getthreadinfo(1) & ( в строке } & Erl Resume

Next End Sub

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

314

Page 315: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Так выглядит вывод сообщений на консоль сервера при запуске наших агентов:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

315

Page 316: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

316

Page 317: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

message box: Агент #1 стартует message box: Агент #1 создал блокировку: О message box: Агент #2 стартует message box: Агент #2 создал блокировку: 0 message box: Агент #2 захватил блокировку: 0 - message box: Агент #2 количество запущенных message box: Агент #2 отпустил блокировку: 0 - message box: Агент #1 захватил блокировку: 0- message box: Агент #1 количество запущенных message box: Агент #1 отпустил блокировку: 0 - message box: Агент #2 захватил блокировку: 0- message box: Агент #2 количество запущенных message box: Агент #2 отпустил блокировку: 0- message box: Агент #1 захватил блокировку: 0 - message box: Агент #1 количество запущенных message box: Агент #1 отпустил блокировку: 0- message box: Агент #2 захватил блокировку: 0 - message box: Агент #2 количество запущенных message box: Агент #1 захватил блокировку: 0 - message box: Агент #2 отпустил блокировку: 0- message box: Агент #1 количество запущенных message box: Агент #1 отпустил блокировку: 0- message box: Агент #2 захватил блокировку: 0- message box: Агент #2 количество запущенных message box: Агент #2 отпустил блокировку: 0- message box: Агент #1 захватил блокировку: 0- message box: Агент #1 количество запущенных message box: Агент #1 отпустил блокировку: 0 - message box: Агент #2 захватил блокировку: 0- message box: Агент #2 количество запущенных message box: Агент #2 отпустил блокировку: 0- message box: Агент #1 захватил блокировку: 0 - message box: Агент #1 количество запущенных message box: Агент #2 уничтожил блокировку 0 message box: Агент #2 завершился message box: Агент #1 отпустил блокировку: 0 - message box: Агент #1 уничтожил блокировку 0 message box: Агент #1 завершился

15.04.08 13:16:04 Add n Agent15.04.08 13:16:04 Add n Agent15.04.08 13:16:04 Add n Agent15.04.08 13:16:04 Add n Agent15.04.08 13:16:05 Add n Agent15.04.08 13:16:05 Add n Agent15.04.08 13:16:06 Add n Agent15.04.08 13:16:06 Add n Agent15.04.08 13:16:06 Add n Agent15.04.08 13:16:08 Add n Agent15.04.08 13:16:08 Add n Agent15.04.08 13:16:08 Add n Agent15.04.08 13:16:09 Add n Agent15.04.08 13:16:09 Add n Agent15.04.08 13:16:09 Add n Agent15.04.08 13:16:10 Add n Agent15.04.08 13:16:10 Add n Agent15.04.08 13:16:10 Add n Agent15.04.08 13:16:11 Add n Agent15.04.08 13:16:11 Add n Agent15.04.08 13:16:11 Add n Agent15.04.08 13:16:12 Add n Agent15.04.08 13:16:12 Add n Agent15.04.08 13:16:12 Add n Agent15.04.08 13:16:13 Add n Agent15.04.08 13:16:13 Add n Agent15.04.08 13:16:13 Add n Agent15.04.08 13:16:14 Add n Agent15.04.08 13:16:14 Add n Agent15.04.08 13:16:14 Add n Agent15.04.08 13:16:15 Add n Agent15.04.08 13:16:15 Add n Agent15.04.08 13:16:15 Add n Agent15.04.08 13:16:17 Add n

:Agent

15.04.08 13:16:17 Add n:

Agent

15.04.08 13:16:17 Add n:

Agent

15.04.08 13:16:18 Add n:

Agent

15.04.08 13:16:18 Add n:

Agent

в: 15.04 агентов: в: 15.04 в: 15.04 агентов: в: 15.04 в: 15.04. агентов: в: 15.04. в: 15.04 агентов: в: 15.04. в: 15.04 агентов: в: 15.04 в: 15.04. агентов: в: 15.04. в: 15.04. агентов: в: 15.04. в: 15.04. агентов: в: 15.04 в: 15.04. агентов: в: 15.04. в: 15.04 агентов:

.2008 12008 2008 12008 2008 12008 2008 12008 2008 12008 2008 12008 2008 12008 2008 12008 2008 12008 2008 1

13:16:05

13:16:06 13:16:06

13:16:07 13:16:08

13:16:09 13:16:09

13:16:10 13:16:10

13:16:11 13:16:11

13:16:12 13:16:12

13:16:13 13:16:13

13:16:14 13:16:14

13:16:15 13:16:15

в: 15.04.2008 13:16:18

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

317

Page 318: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.8.14 Обработка ошибок в LotusScript 1.8 .14.1

Основные положения

При разработке программы на LotusScript (скрипта) ошибки могут возникнуть как на этапе создания скрипта, так и на этапе его выполнения. Соответственно этому ошибки делятся на две группы:

• ошибки периода компиляции;

• ошибки периода выполнения.

Ошибки периода компиляции

Могут появляться во время обработки компилятором LotusScript исходного текста скрипта. Ошибка компиляции останавливает процесс компиляции. При наличии ошибки необходимо проанализировать синтаксис операторов скрипта и, после исправления ошибки, запустить повторно процесс его компиляции.

Ошибки периода выполнения

Могут возникать во время выполнения скрипта. Ошибки периода выполнения скрипта отражают нарушения условий выполнения и не могут быть обнаружены на этапе его компиляции. Примерами ошибок периода выполнения могут служить, например, ошибка, связанная с попыткой открыть для чтения несуществующий на диске файл, или ошибка, связанная с попыткой использования в качестве делителя переменной, значение которой к моменту выполнения этой операции равно нулю.

Ошибки периода выполнения останавливают выполнение скрипта, если пользователем в тексте программы не предусмотрены "ловушки ошибок", т.е. специальные операторы, к которым происходит обращение при появлении соответствующей ошибки.

LotusScript идентифицирует большинство ошибок периода выполнения и выдает соответствующие сообщения о них. Можно вставить в скрипт свои процедуры обработки ошибок периода выполнения, которые будут идентифицировать возникающие ошибки, выдавать соответствующие сообщения, а при необходимости, и обеспечивать продолжение выполнения скрипта.

Номера ошибок

Каждая ошибка периода выполнения имеет свой собственный номер, однозначно идентифицирующий ее. Когда во время выполнения скрипта возникает ошибка, LotusScript, "зная" номер ошибки, ищет соответствующий ей оператор On Error. Если оператор имеется, дальнейшая обработка ошибки проистекает в соответствии с этим оператором. Например, при возникновении ошибки с номером 357 можно воспользоваться следующим оператором - "ловушкой", передающим управление на метку.

On Error 357 GoTo аросбОО

Большинство ошибок периода выполнения уже предопределены в LotusScript. Файл LSERR.LSS содержит константы, значениями которых являются номера ошибок периода выполнения. При создании скрипта можно включить в него этот файл с помощью директивы %lnclude "LSERR.LSS".

Можно также задать номера для "пользовательских" ошибок. Сигнал о том, что случилась "пользовательская ошибка", обычно "подается" оператором Error номер_ошибки. Если для пользовательской ошибки предусмотрен оператор On Error, он получает управление. Например:

Const ooBounds = 677' Определяет номер "пользовательской" ошибки1 Этот номер выходит за рамки существующей спецификации ошибок

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

318

Page 319: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

On Error ooBounds ... ' что делать при возникновении ошибки ■Error ooBounds ' сигнал о возникновении ошибки

Обработка ошибок периода выполнения

Итак, при выполнении скрипта возникает ошибка. Это или предопределенная ошибка, обнаруженная внутренними средствами LotusScript, или "пользовательская ошибка", сигнал о которой "подал" сам разработчик скрипта. В любом случае известен номер ошибки.

LotusScript проверяет текущую процедуру на наличие в ней оператора On Error п, где n - номер ошибки. Если оператор On Error п не найден, проверяется наличие оператора On Error, не связанного с номером конкретной ошибки. Если такие операторы не найдены, LotusScript продолжает их поиск в процедуре, вызвавшей текущую, и т.д.

Если не найден соответствующий оператор On Error, выводится сообщение о возникшей ошибке и выполнение прекращается.

Если же соответствующий оператор On Error найден, то, если в On Error указан оператор Resume Next, продолжается выполнение той процедуры, в которой возникла ошибка, с оператора, следующего за оператором, при выполнении которого возникла ошибка.

Если оператор On Error определяет переход на метку (Goto метка), то выполнение продолжается с оператора, помеченного этой меткой. Если в качестве метки указан 0, повторяется выполнение вызвавшего ошибку оператора.

Далее следует описание операторов, реализующих функции идентификации и обработки ошибок.

1.8 .14.2 Операторы обработки ошибок

Оператор Err (установить номер ошибки) Синтаксис: Err = errNumberПараметры: errNumber - числовое выражение, значение которого является номером

ошибки.

Устанавливает номер текущей ошибки. Параметр errNumber - числовое выражение, значение которого является номером ошибки. Номер может принимать любое значение из диапазона от 0 до 32767 включительно.

Оператор Error (установить номер и сообщение об ошибке) Синтаксис: Error errNumber [, msgExpr]Параметры: errNumber - числовое выражение, значение которого является номером

ошибки.msgExpr - строковое выражение, содержащее сообщение об ошибке.

Устанавливает номер ошибки и соответствующее ей сообщение. Параметр errNumber - числовое выражение, значением которого является номер ошибки, определенной в LotusScript или определенной пользователем. Аргумент errNumber может принимать любое значение из диапазона от 1 до 32767 включительно. Параметр msgExpr - строковое выражение, содержащее сообщение об ошибке. Это строковое выражение замещает любое существующее сообщение, соответствующее ошибке с данным номером.

Если значением errNumber является ошибка, определенная в LotusScript, то оператор Error фиксирует ошибку LotusScript. Иначе фиксируется ошибка, определенная пользователем. Если для данной ошибки не предусмотрена обработка (нет оператора On Error), выдается соответствующее сообщение об ошибке. Это сообщение может быть определено в параметре msgExpr. Если параметр msgExpr отсутствовал, LotusScript выдает свое сообщение, соответствующее данному номеру ошибки, если таковое существует. В противном случае выдается сообщение об ошибке, определенной пользователем.

Оператор On Error (реакция на ошибку) Синтаксис: On Er ror [ errNumber] { GoTo label | Resume Next | GoTo 0 } Параметры: errNumber - выражение, значением которого является целое число, задающее номер ошибки.

Определяет реакцию на ошибку, возникшую в период выполнения скрипта.

Параметр errNumber - выражение, значением которого является целое число, задающее номер ошибки. При отсутствии этого параметра оператор описывает реакцию на любую ошибку, возникающую в текущей процедуре во время выполнения.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

319

Page 320: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Оператор GoTo label определяет адрес передачи управления при возникновении ошибки с указанным номером. Обычно, это подпрограмма обработки ошибок.

Оператор Resume Nex t определяет, что при возникновении ошибки выполнение процедуры должно продолжаться с оператора, следующего за оператором, в котором возникла ошибка. В этом случае не инициируется функция обработки ошибок.

Оператор GoTo 0 определяет, что при возникновении ошибки не будет происходить ее обработка.

Пример. При возникновении деления на нуль получает управление оператор On Error. В его теле имеется оператор Resume Next, передающий управление на следующий оператор за тем, в котором возникла ошибка. Если действительно имело место деление на нуль (номер ошибки равен константе ErrDivisionByZero, определенной в файле LSERR.LSS), печатается сообщение, и функция завершается.

%Include "LSERR.LSS"

Function Div()

Dim x As Integer, у As Integer

On Error Resume Next

x=10

y=0

x=x / у ' Ошибка деления на ноль If

Err о 0 Then

Print "Ошибка: " & Error(Err)

Exit Function

End If

End Function

Call Div()

Оператор Resume Синтаксис: Resume [ 0 | Next | label]

Определяет, куда следует передать управление после обработки ошибки: • 0 - управление получает оператор, в

котором возникла ошибка;

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

320

Page 321: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• Next - управление получает оператор, следующий за оператором, в котором возникла ошибка;

• label - управление получает оператор, помеченный меткой label.

Учтите, что если причины возникновения ошибки в процедуре обработки ошибки не были устранены, оператор Resume [0] породит бесконечный цикл.

Оператор Resume устанавливает в 0 значение функций Err, Erl, Error.

Пример. При выполнении данного скрипта возникает ошибка открытия файла.При возникновении ошибки управление получет метка ErrH, в которой происходит вывод ошибки и управление передается следующей строке посте строки с ошибкой.

Sub ExamplProcessErr()

On Error Goto ErrH

Dim FNum As Integer

FNum=Freefile()

Open "C:\non-existent_file.txt" For Input As FNum

Write #FNum, "Привет!"

Close FNum

Exit Sub

ErrH:

Print "Ошибка: " & Error (Err) & " - " & Getthreadinfo(l) 4 " в строке " & Erl Resume

Next End Sub

Функции обработки ошибок

Функция Erl Синтаксис: ErlТип возвращаемого значения: Integer.

Возвращает номер строки (тип Integer) в тексте скрипта, в операторе из которой возникла ошибка. Если ошибки нет, возвращается значение False (0).

Пример. Выводит 0, поскольку нет ошибки.

Sub RepErr

Dim х As Integer x% = Erl () Print x% End Sub Call RepErr

1.8 .14.3

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

321

Page 322: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Функция Err

Синтаксис: ErrТип возвращаемого значения: Integer.

Возвращает номер текущей ошибки (тип Integer). Если ошибки нет, возвращается значение False (0). Функция

ErrorСинтаксис: Error [$ ] [ ( errNumber) ] Параметры: errNumber- число, номер ошибки.

Возвращает сообщение об ошибке с номером errNumber, либо если номер не указан, сообщение о последней имевшей место ошибке. Функция Error возвращает значение типа Variant, а функция Error$ - типа String. Если отсутствует выражение errNumber и нет текущей ошибки, функция возвращает пустую строку("").

Пример. Пользователь вводит число, значение которого должно находиться в диапазоне 1 - 100. Если введенное значение не может быть приведено к 4-х байтовому целому значению, то выдается ошибка. Определены и две пользовательские ошибки при выходе за диапазон значений 1-100.

Const ENTRY_SMALL = 1001, ENTRY_BIG = 1002

Sub GetNumO

Dim x As Single

Dim Num As String

On Error Goto ErrH

Num$ = Inputbox$("Введите значение между 50 и 150:") х! =

Csng(Num$)'Преобразование строки 4-байтное single значение 'Проверка

введенного значения If х! < 50 Then

Error ENTRY_SMALL, "Значение меньше допустимого"

Elseif х! > 150 Then

Error ENTRY_BIG, "Значение больше допустимого"

End If

'Вывод сообщения при отсутствии ошибок ввода

Messagebox "Хорошая работа! " & Num$ & " - Введено правильно." Exit Sub

'При наличии ошибок выводится номер ошибки и сообщение ErrH:

'Error$ возвращает диагностическое сообщение, Err возвращает номер ошибки

Messagebox "Ошибка " & Str(Err) & ": " & Error$ Exit Sub End Sub

Call GetNum ' Вызов подпрограммы GetNum1.9 Вызов внешних функций из библиотек динамической компоновки

Основные положения

LotusScript поддерживает возможность вызова внешних функций, написанных обычно на языке С и размещающихся в библиотеках функций. В терминах WINDOWS такая библиотека функций называется библиотекой динамической компоновки - DLL (Dinamic Link Library).

При работе с внешними С-функциями необходимо знать их интерфейсы (виды аргументов, вид возвращаемого функцией значения) и собственно назначения функций. Для получения этой информации может потребоваться соответствующая документация. Если говорить о функциях WINDOWS, то документация по Windows API входит в состав Windows Software Developer's Kit. Кроме того данной теме посвящено множество книг.

DLL чаще пишут на языке С, хотя последнее необязательно. В любом случае внешние функции должны удовлетворять следующим соглашениям по вызову:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

322

Page 323: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

• WINDOWS 3.1 (Win16) - Pascal,

• WINDOWS 95, 98 и WINDOWS NT (Win32) - STDCALL,

• OS/2 - _System,

• UNIX и Macintosh - соответствующее CDECL,

• AS/400 - CDECL или _System.

Вызываемая из LotusScript внешняя функция обязательно должна быть предварительно объявлена в скрипте. Аргументы во внешнюю функцию могут передаваться по ссылке или по значению.

На платформе Win32 (WINDOWS 95, 98 и WINDOWS NT) следует помнить, что имя функции, экспортируемой DLL, чувствительно к регистру.

Пример. Объявляется внешняя функция из библиотеки C:\myxports.dll. Библиотека экспортирует эту функцию под именем _HelpOut (с учетом регистра). Из LotusScript функцию будут вызывать по имени DirDLL (уже без учета регистра). Функция имеет два скалярных параметра, оба типа Long. Параметры передаются ссылкой. DirDLL(5, 10) - уже пример вызова этой функции.

' Объявление

Declare Function DirDLL Lib "C:\myxports.dll" _

Alias "_HelpOut" (II As Long, 12 As Long) ' Вызов

DirDLL(5, 10)

Объявление С-функций

Любую С-функцию необходимо объявить прежде, чем она будет вызвана. Объявление выполняется с помощью специальной формы оператора Declare. Оператор Declare следует помещать в область Declarations модуля, внутри которого предполагается вызов (или вызовы) С-функции.

В операторе Declare вы можете объявить С-функцию либо как функцию LotusScript, либо как подпрограмму. Синтаксис таков:

Declare [Publ ic | Pr iva te ] {Funct ion | Sub} LSFunctionName L ib libName [Alias aliasName ] ([ argList]) [ As return Type ]

Если С-функция не возвращает результата или результат вас не интересует, то имеет смысл объявлять С-функцию как подпрограмму LotusScript. В противном случае - как функцию LotusScript. Проиллюстрируем сказанное с помощью примеров. Рассмотрим функции находящиеся в библиотеке User Windows API.

Функция GetActiveWindow не требует параметров и возвращает дескриптор (целое число) активного окна (окна, имеющего фокус).

Declare Function GetActiveWindow Lib "User" () As Integer

Функция SetWindowText ничего не возвращает, поэтому вы можете декларировать её как процедуру. Функция требует два параметра: дескриптор окна и текстовую строку. В оригинале имена обоих параметров удовлетворяют требованиям к идентификаторам LotusScript. Поэтому при декларации функции можно использовать оригинальные имена параметров, взяв их из документации по API (как сделано в примере), а можно ввести новые, собственные имена.

Declare Sub SetWindowText Lib "User" (ByVal hwnd As Integer, ByVal IpString As String)

Оператор Declare (объявление внешних С-функций) Синтаксис: Declare [ Public | Private ] { Function | Sub} LSname Lib libName

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

323

Page 324: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

[Alias aliasName ] ([ argList ]) [ As returnType ]

Объявляет внешние С-функции, содержащиеся в библиотеке функций, в качестве функций или подпрограмм, вызываемых из LotusScript.

Pub l i c | Pr i va te - по выбору. Необязательно. Public определяет, что С-функция доступна в LotusScript за пределами модуля, в котором она объявлена, пока этот модуль находится в памяти. Private определяет, что С-функция доступна только внутри модуля, содержащего ее объявление. По умолчанию С-функция считается Private.

Func t ion | Sub - определяют способ вызова С-функции из LotusScript: как функцию или как подпрограмму.

LSname - имя функции или подпрограммы, используемое в LotusScript. Если оператор объявляет функцию (использовано ключевое слово Function), к LSname можно добавить суффикс, определяющий тип возвращаемого функцией значения.

Если спецификатор Alias опущен, это имя должно совпадать с именем С-функции в библиотеке функций. Для платформы Win32 существенно сохранение оригинального регистра написания имени функции.

L ib libName - задается строка символов или символьная константа, специфицирующая имя файла библиотеки функций. Стандартное расширение необязательно. Необязательно и указание пути к файлу.

A l ias aliasName - задается строка символов или символьная константа, содержащая одно из следующих:

• с учетом регистра, имя С-функции, как оно объявлено в библиотеке функций;

• число с префиксом #, определяет положение (позицию) функции в библиотеке функций; например, #1.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

324

Page 325: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Этот спецификатор полезно использовать в допустимым именем в LotusScript или попросту для простым для восприятия.

argList - список аргументов внешней функции, использоваться даже в том случае, если функция не

запятыми, а каждый аргумент имеет формат: том случае, если имя С-функции не является того, чтобы сделать имя функции в скрипте болеезаключенный в круглые скобки. Скобки должны имеет аргументов. Аргументы в списке разделяются

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

325

Page 326: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

326

Page 327: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

[ ByVa l ] name As [ LMBCS | Un icode ] [ dataType | Any ]

Если указано ключевое слово ByVal, то аргумент передается по значению, иначе по ссылке. Необязательные ключевые слова LMBCS или Unicode могут использовать только для аргументов типа String. DataType определяет тип аргумента. Ключевое слово Any используют, когда аргумент должен передаваться в С-функцию без проверки типа.

As returnType имеет формат As [ LMBCS | Un icode ] dataType и определяет тип возвращаемого функцией значения. Этот спецификатор не используется для С-функции, вызываемой как подпрограмма. Для функций используют или явную спецификацию As returnType, или суффикс, определяющий тип возвращаемого функцией LSname значения, но не оба варианта вместе. В качестве типа возвращаемого значения не должны использоваться Any, Variant, Currency или String фиксированной длины. Если тип возвращаемых данных не указан явно и в имени вызываемой функции нет суффикса, считается, что функция возвращает значение типа согласно оператору описания типа Deffype для используемого имени функции. Учтите, что тип dataType должен точно соответствовать типу возвращаемого С-функцией значения - LotusScript не производит над возвращаемым значением каких-либо преобразований типа. Ключевые слова LMBCS или Unicode могут использоваться только тогда, когда функция возвращает значение типа String.

Передача аргументов. По умолчанию LotusScript передает аргументы во внешнюю функцию по ссылке. Чтобы передавать аргументы по значению, следует указать в описании аргумента ключевое слово ByVal. Однако это возможно только тогда, когда LotusScript может привести передаваемое значение к типу данных аргумента С-функции. Массивы, переменные определенных пользователем типов или объекты объявленных пользователем классов могут передаваться только по ссылке. В С-функцию нельзя передать (ни по значению, ни по ссылке) список. Объекты встроенных классов "представлены" четырехбайтовым дескриптором объекта (instance handle), который может быть передан в С-функцию как по значению, так и по ссылке. Для организации передачи объекта по значению аргумент должен быть явно описан с использованием ключевого слова ByVal. Использование круглых скобок при передаче фактического значения объекта не допускается

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

Подробнее о передаче аргументов С-функции рассказано ниже в отдельных разделах.

Использование LMBCS или Un icode. Ключевые слова LMBCS или Unicode применяются только для аргументов или возвращаемых функцией значений типа String. Они определяют способ кодировки символов в строке. Unicode означает кодировку Unicode (2 байта на символ) с использованием зависящего от платформы порядка байтов. LMBCS означает кодировку LMBCS фирмы Lotus (несколько байтов на символ, английские буквы кодируются одним байтом, русские - двумя байтами, а символы японских, корейских и китайских "алфавитов" - тремя байтами). Если ни LMBCS, ни Unicode не указаны, предполагается, что символы в строке кодируются в соответствии с текущим способом кодировки на используемой платформе.

Пример 1. Объявление и вызов внешней функции StrUpr, содержащейся в библиотеке StrLib. Dim strOut

As String 'Объявление StrUpr

Declare Function StrUpr Lib "StrLib" (ByVal inVal As String) As String 'Вызов StrUpr strOut$

= StrUpr("abc")

Пример 2. Объявление и вызов С-функции _SendExportedRoutine (имя с учетом регистра), экспортируемой библиотекой C:\myxports.dll, как внешней функции SendDLL в LotusScript.

Declare Function SendDLL Lib "C:\myxports.dll"

Alias "_SendExportedRoutine" (il As Long, i2 As Long)

'Вызов SendDLL

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

327

Page 328: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

SendDLL(5, 10)

Пример 3. Объявление функции StrFun, получающей в качестве параметра amIStr строку в кодировке Unicode, и возвращающей строку в кодировке Unicode.

Declare Function StrFun Lib "lib.dll" (amIStr As Unicode String) As Unicode String

Пример 4. Объявление функции StrFun, получающей в качестве параметра amIStr строку в кодировке LMBCS, и возвращающей строку в текущей кодировке используемой платформы.

Declare Function StrFun Lib "lib.dll" (amLStr As LMBCS String) As String

Пример 5. Вопроизведение звука средствами Windows API

Declare Function sndPlaySound Lib "winmm" Alias "sndPlaySoundA"

(ByVal IpszSoundName As String, ByVal uFlags As Long) As Long Const SYNC = 1 Dim res

Res = sndPlaySound("rrrr", SYNC) print Res

Передача аргументов по ссылке

При передаче аргумента по ссылке из LotusScript в С-функцию последняя получает в стеке 4-х байтовый указатель на фактическое значение параметра в памяти LotusScript. Правда, в некоторых случаях фактический параметр указывает только на "публично читаемую структуру", не предоставляя доступа к закрытым данным. Однако во всех случаях С-функция может изменить доступные ей "по указателю" данные, и эти изменения произойдут в значениях переменных в LotusScript и в свойствах объектов встроенных классов, как только управление вернется в LotusScript.

Передача аргументов по значению

Вообще говоря, при передаче аргументов по значению С-функция получает в стеке копию текущего значения аргумента.

По умолчанию аргумент во внешнюю функцию из LotusScript передается ссылкой. Поэтому всякую передачу по значению следует специфицировать явно. Можно в операторе Declare явно указать для каждого передаваемого по

Следующая таблица поясняет, как параметры ссылкой передаются из LotusScript в С-функцию.Тип данных LotusScript Что передается в С-функцию

String 4-х байтовый указатель на строку во внутреннем формате строк LotusScript

Array 4-х байтовый указатель на массив во внутреннем формате массивов LotusScript

Объект встроенного класса (включая коллекцию)

4-х байтовый дескриптор (handle) объекта

Стандартный или определенный пользователем тип

4-х байтовый указатель на данные этого типа

Определенный пользователем объект 4-х байтовый указатель на члены-данные в этом объекте

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

328

Page 329: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

значению аргумента ключевое слово ByVal - тогда при вызове функции из LotusScript соответствующие параметры всегда будут передаваться по значению. Можно указать только при конкретном вызове внешний функции из LotusScript, что некоторые параметры передаются по значению - такие параметры записывают в круглых скобках или перед ними указывают ключевое слово ByVal.

Следующая таблица поясняет, как параметры по значению передаются из LotusScript в С-функцию.

Другие типы данных: массивы, списки, строки фиксированной длины, переменные определенных пользователем типов или объекты определенных пользователем классов- не могут передаваться в С- функцию по значению. Однако их (кроме списков) можно передать по ссылке. Обратите внимание, что список нельзя передать в С-функцию ни по значению, ни по ссылке.

Тип данных Какие данные передаются в С-функцию

Boolean 2-х байтовое целое, значение 0 или 1, записываемое в стек

Byte 1-х байтовое целое, записываемое в стек

Integer 2-х байтовое целое, записываемое в стек

Long 4-х байтовое значение типа Long, записываемое в стек

Single 4-х байтовое значение типа Single, записываемое в стек

Double 8-и байтовое значение типа Double, записываемое в стек

Currency 8-и байтовое значение во внутреннем формате LotusScript, записываемое в стек

String 4-х байтовый указатель на первый символ строки, записанный в стек. Это уже не классическая передача по значению, поскольку С-функция может изменить информацию в строке-параметре. С-функция не должна изменять информацию в памяти "за пределами" строки.

Variant 16-и байтовая структура во внутреннем формате LotusScript, записываемая в стек

Объектвстроенногокласса

4-х байтовый дескриптор объекта, записанный в стек

Any Записанное в стек значение передаваемого параметра текущей длины. Например, при одном обращении параметр может быть типа Integer, и будут переданы 2 байта. При другом обращении параметр может иметь тип Long, и будут переданы 4 байта. В результате затруднится разработка С-функции, поскольку во время компиляции неизвестно, какого типа параметры она получит.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

329

Page 330: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Если аргумент внешней функции объявлен в операторе Declare с типом Any, и должен передаваться по значению, при вызове функции следует передаваемый параметр специфицировать как ByVal. Наконец, когда аргумент объявлен с типом Any, а параметр при вызове передается как ByVal &0, С-функция получает "нулевой" указатель.

Пример. С-функция SemiCopy получает 4-х байтовый указатель на двухбайтовое целое значение переменной vTestA, и двухбайтовое значение - копию значения переменной vTestB. Поскольку первый аргумент передается по ссылке, С-функция может изменить значение переменной vTestA в LotusScript, "записывая по указателю" наподобие *ptr = newValue. В то же время С-функция не может изменить значение переменной vTestB в LotusScript.

Declare Sub SemiCopy Lib "mylib.dll" (valPtr As Integer, ByVal iVal As Integer) Dim

vTestA As Integer, vTestB As Integer vTestA = 1 vTestB = 2 ' вызов

SemiCopy vTestA, vTestB

Передача строк из LotusScript в С-функцию

Когда строка передается по ссылке, LotusScript передает 4-х байтовый указатель на эту строку в "своей" памяти. При этом С-функция не может безопасно модифицировать содержимое этой строки, если только она не написана специально для LotusScript (для этого требуется знание внутренних форматов строк LotusScript).

Когда строка передается по значению, С-функция получает 4-х байтовый указатель на копию строки LotusScript - "заканчивающуюся нулем строку", как это принято в языке С. Если передается строка фиксированной длины, она сначала преобразуется в "заканчивающуюся нулем строку". При этом С- функция может изменять данные в строке, но не должна изменять длину строки. Когда С-функция завершается, изменения, внесенные ею в копию строки, будут перенесены в соответствующую ей строку в формате LotusScript.

Если символы в передаваемой или возвращаемой строке заданы не в текущей кодировке используемой платформы, а в кодировке Unicode или LMBCS, это должно быть специфицировано явно.

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

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

330

Page 331: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Передача из LotusScript в С-функцию массивов, переменных определенных пользователем типов и объектов определенных пользователем классов

Передать массив в С-функцию можно только по ссылке. Но массивы в LotusScript хранятся в собственном внутреннем формате. При этом С-функция "должна понимать" внутренний формат массивов LotusScript. Авторы не встречали в документации подробного описания этих форматов. В некоторых простых случаях можно объявить в операторе Declare аргумент, по которому должен передаваться массив с "типом" Any, а в качестве значения фактического параметра передать по ссылке первый элемент массива.

Пример 1. Третий аргумент функции SetBitmapBits объявлен с "типом" Any, а при вызове функции по третьему аргументу передается ссылка на первый элемент этого массива.

Declare Sub SetBitmapBits Lib "_privDispSys"

(ByVal hBM As Integer, ByVal cBytes As Long, pBits As Any)

' Вызов функции

SetBitmapBits(hBitmap, cBytesInArray, bitArray(O))

Передать в С-функцию значение переменной определенного пользователем типа можно тоже только по ссылке. При этом С-функция получит 4-х байтовый указатель непосредственно на первый байт соответствующих данных в LotusScript. В простых случаях этого бывает достаточно, чтобы "добраться" до необходимых элементов данных. В более сложных случаях опять возникнут проблемы, связанные с "незнанием" внутренних форматов некоторых типов данных LotusScript.

Отметим, что если в определенном пользователем типе в качестве элементов присутствуют строки переменной или фиксированной длины (но не Variant типа String), для указания способа кодировки символов во всех строках "внутри типа" в операторе Declare можно использовать ключевые слова Unicode или LMBCS. Если ни Unicode, ни LMBCS не указано, строки в определенном пользователем типе передаются в текущей кодировке используемой платформы.

Пример 2. В первом операторе Declare все строки переменной или фиксированной длины в типе t1 и его вложенных типах передаются как строки Unicode, а во втором - как строки LMBCS.

Объявление строкового

аргумента в операторе Dec lare

С-функции cF

Если функция cF вызывается из LotusScr ip t в форме:

CF ( ( arg ) )

CF ( ByVa l ( arg ) )

Если функция cF вызывается из LotusScr ip t в форме:

cF ( arg )

cF ( ByVa l a rg )

ByVal String 4-х байтовый указатель на копию значения фактического параметра. Если функция cF изменяет данные по этому указателю, значение фактического параметра не меняется. Если функция cF "пишет" за границами полученной строки, возможен крах LotusScript.

4-х байтовый указатель на значение фактического параметра. Если функция cF изменяет данные по этому указателю, изменяется и значение фактического параметра. Если функция cF "пишет" за границами полученной строки, возможен крах LotusScript.

String 4-х байтовый указатель на копию значения фактического параметра во внутреннем формате строк LotusScript. Если функция cF изменяет данные по этому указателю, значение фактического параметра не меняется.

4-х байтовый указатель на значение фактического параметра во внутреннем формате строк LotusScript. Если cF "не знакома" с этим форматом, она может лишь заменить ссылку на эту строку ссылкой на другую (но корректную) строку.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

331

Page 332: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Declare Function UniTest Lib "Unilib" (typArg As Unicode tl) As Long

Declare Function LMBCSTest Lib "lmbcslib" (typArg As LMBCS tl) As Long

Обратите также внимание, что LotusScript в целях обеспечения межплатформной совместимости выравнивает некоторые элементы типа иначе, чем это принято по умолчанию в компиляторе С на используемой платформе. Например, для типа с определением

Type telMet

A As Integer

В As Integer

End Type

LotusScript выравнивает элемент В на четырехбайтовую границу, тогда как выравнивание по умолчанию в Windows 3.1 выполняется на двухбайтовую границу.

Пример 3. С-функции GetBrushOrgEx вторым аргументом передается определенный пользователем тип Point.

Type Point

хР As Integer

уР As Integer

End Type

Declare Function GetBrushOrgEx Lib "_pointLib" _

(ByVal hDC As Integer, pt As Point) As Integer Dim p As Point '

Вызов функции Ge tBrushOrgEx(hDC,p)Когда в С-функцию передается объект определенного пользователем класса, С-функция получает 4- х байтовый

указатель на первый байт неупакованных данных объекта. В случае простых объектов до их данных "удается добраться" сравнительно легко. Но для сложных объектов, содержащих внутри списки, массивы, строки или объекты встроенных классов, это может оказаться трудноразрешимой задачей.

Значение, возвращаемое С-функцией в LotusScript

Тип возвращаемых С-функцией данных должен быть указан одним из следующих способов:

• в операторе Declare явно;

• в операторе Declare с использованием суффикса;

• на основе оператора Deffype, предшествующего оператору Declare.

Если ничто из перечисленного не имеет места, по умолчанию в LotusScript будет предполагаться, что функция возвращает значение типа Variant, тогда как этот тип несовместим с языком С.

Следующая таблица показывает, данные каких типов могут быть возвращены С-функцией в

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

332

Page 333: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Пример. Функция GetWindowsDirectory входит в состав API Windows. Функция определяет каталог, в котором на текущем компьютере установлен Windows. Путь на каталог в форме строки записывается по указателю, передаваемому функции первым аргументом. Вторым аргументом задается максимальное количество байтов, которое функции "разрешается записать" по этому указателю. Возвращает же функция действительное количество байтов, которое ею было записано по указателю. Обратите внимание, что функция не записывает по указателю байт с нулевым кодом, являющийся в языке С традиционным признаком конца строки.

Этот пример проверялся под Windows NT 3.51 и Windows 98. Библиотека, в которой находится функция, называется Kernel32.dll. Внутреннее имя функции с учетом регистра в этой библиотеке GetWindowsDirectoryA, а не GetWindowsDirectory, под которым она традиционно экспортируется.

В скрипте объявлена строка фиксированной длины WinDir, в которую вызываемая внешняя функция заносит путь на каталог. Все параметры передаются во внешнюю функцию по значению. Уже после вызова функции, чтобы избежать проблем с длиной строки, она "корректируется по месту" функцией Mid$ LotusScript.

Declare Function GetWindowsDirectoryA Lib "Kernel32" (Byval lpBuffer As String, Byval nSize As Integer) As Integer

Const MAX_DIR_SIZE = 255

Dim WinDir As String*MAX_DIR_SIZE

Dim ActLen As Integer

Тип данных Может ли быть возвращен С- функцией в LotusScr ip t?

Тип данных в С

Boolean Да bool

Byte Да Byte

Integer Да Int

Long Да Long

Single Да Float

Double Да Double

Currency Нет

String Да, за исключением строки фиксированной длины

Char * или char[]

Variant Нет

Объект встроенного класса Да (как 4-х байтовый дескриптор объекта (handle) типа Long)

Объект определенного пользователем класса Да

Переменная определенного пользователем типа

Нет

Any Нет

Array Нет

List Нет

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

333

Page 334: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

'MAX_DIR_SIZE - максимальная длина буфера

'ActLen - текущая длина пути на каталог

ActLen = GetWindowsDirectoryA ( WinDir, MAX_DIR_SIZE )

WinDir = Mid$ (WinDir,1,ActLen)

Print WinDir ' Печатает C:\WINDOWS

При создании собственных библиотек С-функций

Если вы используете компилятор С+ + , то следует учитывать искажение имен функций. В этом случае при написании собственных С-функций следует использовать конструкцию "С" {. . . } для сохранения точного имени.

Символ "_" зарезервирован в Notes для специальных библиотек. Эта особенность впервые появилась в версии 4.5.1. В версии 4.5.1 и старше (в том числе и 5.x) при попытке загрузки в скрипте библиотеки (dll) с именем начинающимся с"_" выдается ошибка "Error in loading DLL".

Под значение типа Integer в LotusScript отводится 2 байта. В тоже время на платформе Win32 (Windows 95, 98, Windows NT) значение типа Integer занимает 4 байта. Поэтому, если разрабатываемая вами С-функция должна вернуть в LotusScript значение типа Integer, следует внутри С-функции использовать тип Short Integer, использующий 2 байта. Это замечание относится исключительно к реализации под Windows.

Пример импорта строки текстового файла

Предположим имеется задача чтения в скрипте русского текста из текстового файла в кодировке 866. Эта операция выполняется с помощью стандартных LotusScript средств ввода-вывода. Но прежде, чем строка станет "пригодной для использования" в Windows необходимо выполнить её перекодировку - из кодировки 866 в кодировку 1251 (сама операция чтения строки из файла никакой перекодировки не производит). Для этого используется функция Windows API "OemToAnsi".Скрипт в нашем примере оформлен в виде агента. Так в разных поколениях Windows местоположение необходимой нам функции различно, объявляются сразу две функции.

Declare Function OemToAnsi32 Lib "User32" Alias "OemToCharA"

(Byval lpOemStr As String, Byval lpAnsiStr As String) As Integer

Declare Function OemToAnsil6 Lib "Keyboard" Alias "OemToAnsi" _ (Byval lpOemStr

As String, Byval lpAnsiStr As String) As Integer

Function OemToAnsi(lpOemStr As String, lpAnsiStr As String) As Integer Dim

Session As New NotesSession ' В зависимости от версии Windows Л вызывается та

или иная С-функция

If session.Platform = "Windows/32" Then

OemToAnsi = OemToAnsi32(lpOemStr, lpAnsiStr)

Elseif session. Platform = "Windows/1611 Then

OemToAnsi = OemToAnsil6(lpOemStr, lpAnsiStr)

End If End

Function

Sub Initialize

Dim tfile%, res%

Dim StrokaOEM$,StrokaANSI$

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

334

Page 335: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

tfile%=Freefile ()

Open "c:\dos_file.txt" For Input As tfile% Line Input

#tFile%, StrokaOem$

Print StrokaOem$ * печатается Нерусский текст '

переменная Stroka$ получает значение из файла

StrokaANSI$ = StrokaOem$

res% = OemToAnsi(StrokaOem$, StrokaANSI$) Print

StrokaANSI$ ' печатается Русский текст

End SubПример. Замена оператора SendKeys

Как известно, оператор SendKeys не поддерживается в реализации LotusScript для Lotus Notes. Но благодаря имеющимся в LotusScript средствам обращения к внешним С-фукциям задачу решить можно (по частному мнению автора этих строк, вряд ли "фирменная" реализация оператора была бы устроена по-другому).

Данный пример публикуется с любезного согласия его автора - Андрэ Гайрарда (Andre Guirard), сотрудника американской компании Systems Consulting Group, Inc.

'SendKey script library:

Option Public

Option Declare

%REMДанная библиотека содержит функции для имитации ввода символов с клавиатуры.

Библиотека рассчитана на работу в среде Win32

Поддержка платформ Winl6 и OS/2 может быть достигнута путем использования других (соответствующих) библиотек (DLL).

Функции операционной системы, выполняющие основную работу, взяты из стандартных DLL и описаны, например, в документации к Visual Basic.

Данная библиотека включает следующие функции:

Sub SetKeyState(byval bvk As Integer, byval onoffstate As Integer) где bVk

- код клавиши с состояниями " вкл. " и " выкл. "

(соотв. значения True и False) Функция устанавливает состояние одного и

таких ключей, например Call SetKeyState(VK_SCROLL, False) выключает

клавишу [Scroll Lock]

Sub PressKey(Byval vk As Integer) где vk - код клавиши. Эта функция

посылает ОС код клавиши для имитации ее нажатия и отпускания.

Например, Call PressKey(VK_Fn + 3) эквивалентно нажатию клавиши

[ F3 ] .

Функция ориентирована на клавиши, для которых нет "непечатного" аналога

Sub HoldKey(byval vk As Integer) Данная функция посылает ОС код

клавиши, для которой нужно сымитировать нажатие и удержание в

нажатом состоянии

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

335

Page 336: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Sub ReleaseKey(byval vk As Integer) Данная функция "отпускает" ранее

"нажатую" с помощью функции HoldKey клавишу.

Например, если мы хотим передать последовательность [Alt]+[Enter], то

необходимо произвести следующие вызовы:

HoldKey VK_MENU

PressKey VK_RE TURN

ReleaseKey VK_MENU

Sub SendKey (Byval c$) Печатает символ. Данная функция предназначена для упрощенного

"нажатия" клавиш, у которых есть "печатные" аналоги. Например, цифры, буквы и т. п.

Sub SendString(Byval s$) Имитирует ввод целой строки. Фактически выполняет серию

вызовов функции SendKey %END REM

Const VK_MENU = &H12 ' [Alt] Const VK_RE TURN = &HOD Const VK_LEFT = &H25 Const VK_UP

= &H26 Const VK_RIGHT = &H27 Const VK_DOWN = &H28 Const VK_TAB = &H09 Const VKj SHIFT

= &H10 Const VK_CONTROL = &H11 Const VK_ESCAPE = &H1B Const VK_SCROLL = &H91 Const

VK_C APITAL = &H14 Const VK_NUMLOCK = &H90

Const VK_Fn = &H6F ' Функциональные клавиши; для получения кода ' конкретной клавиши

надо добавить ее номер, ' например, VK_Fn+3 для [F3]

Const KEYEVENTF_KEYUP = &Н2 ' код для "отпускания" клавиши Dim CapsLock%

Declare Sub keybd_event Lib "user32" (Byval bvk As Integer, Byval bScan As Integer, — Byval

dwflags As Long, Byval dwextrainfo As Long)Declare Sub mouse_event Lib "user32" (Byval dwflags As Long, Byval dx As Long, Byval dy As Long,

_

Byval cbuttons As Long, Byval dwextrainfo As Long)

Declare Function OemKeyScan Lib "user32" (Byval wOemchar As Integer) As LongDeclare Function CharToOem Lib "user32" Alias "CharToOemA" (Byval IpszSrc As String, Byval

IpszDst As String) As Long

Declare Function VkKeyScan Lib "user32" Alias "VkKeyScanA" (Byval cChar As Integer) As Integer

Declare Function MapVirtualKey& Lib "user32" Alias "MapVirtualKeyA" (Byval wCode As Long, wMapType As Long)

Declare Function GetKeyState% Lib "user32" (Byval virtkeyb)

Declare Sub GetKeyboardState Lib "User32" (LpKeyState As Any)

Declare Sub SetKeyboardState Lib "User32" (lpKeyState As Any)

Sub SendString(Byval s$)

CapsLock = ((1 And GetKeyState(VK_CAPITAL)) <> 0) Dim i%

For i = 1 To Len(s)

SendKey Mid$(s, i, 1)

Next End Sub

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

336

Page 337: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Sub PressKey(Byval vk As Integer) Dim scan% ' получаем scan code данной клавиши scan =

MapVirtualKey(vk, 1) And &HFF keybd_event vk, scan, 0, 0 ' "нажимаем ' клавишу

keybd_event vk, scan, KEYEVENTF_KEYUP, 0 ' котпускаем'" клавишу End Sub

Sub HoldKey(Byval vk As Integer) Dim scan%

получаем scan code данной клавиши scan = MapVirtualKey(vk, 1) And &HFF

keybd_event vk, scan, 0, 0 ' "нажимаеми клавишу End Sub

Sub ReleaseKey(Byval vk As Integer) Dim scan% ' получаем scan code данной клавиши scan =

MapVirtualKey(vk, 1) And &HFF

keybd_event vk, scan, KEYEVENTF_KEYUP, 0 ' "отпускаем" клавишу End Sub

Sub SetKeyState(Byval bvk As Integer, Byval onoffstate As Integer)

' Исп. для активации и деактивации клавиш Caps Lock, Num Lock, or Scroll Lock. Dim a%(0 To

127), ind%, mask% GetKeyboardState a(0) ind = bvk \ 2

If (bvk And 1) Then ' windows хранит впереди младший байт; если индекс четный -

нужен бит 1

mask = 1

Else

mask = SchOlOO

End If

' Теперь, если необх. режим не явл. текущим,

' now, if the desired state doesn't match the existing state, меняем бит активности и переписываем состояние

If ((a (ind) And mask) <> 0) <> onoffstate Then

a(ind) = a(ind) Xor mask

SetKeyboardState a(0)

End If End Sub

Sub SendKey(Byval c$)

Dim vk%, scan&, oemchar$, dl&, shifted%, scanshift% ' получаем виртуальный код данного

символа vk = VkKeyScan(Asc(с$) ) And &HFF

oemchar = " " ' Инициализируем строку на необходимую длину CharToOem Left$(c$, 1), oemchar

dl = OEMKeyScan(Asc(oemchar)) scan = dl And &H0000FFFF&

If (c$ >= "a" And c$ <= "z") Or (c$ >= "A" And c$ <= "Z") Then shifted = ((c = Ucase(c))

Xor CapsLock)

Else

shifted = (dl And &H00030000&) > 0

End If

If shifted Then

scanshift = MapVirtualKey(VK_SHIFT, 1)

keybd_event VK_SHIFT, scanshift, 0, 0

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

337

Page 338: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

End If

keybd_event vk, scan, 0, 0

keybd_event vk, scan, KEYEVENTF_KEYUP, 0

If shifted Then

keybd_event VK_SHIFT, scanshift, KEYEVENTF_KEYUP, 0

End If End Sub1.10 Ограничения языка

В новой версии LotusScript 4, использующейся в Notes/Domino R5, по сравнению с предыдущей версией (LotusScript 3 - Notes/Domino R4) сняты некоторые ограничения. Среди них такие: как ограничение на размер исполняемого кода модуля, ограничение на размер динамической строки. Большинство ограничений традиционно объединяют под общим названием "ограничения 64Кбайт". Все наиболее существенные ограничения далее рассматриваются отдельно.

1.10.1 Ограничения числовых типов данных

Диапазон допустимых значений двоичных, восьмеричных и шестнадцатиричных целых чисел совпадает с диапазоном типа Long.

Следующая таблица описывает максимальное число символов, необходимых для отображения соответственно двоичных, восьмеричных и шестнадцатиричных значений. Одновременно эта же таблица описывает максимальное число символов, которое могут вернуть функции Bin, Oct и Hex.

Тип данных Диапазон допустимых значений Объем занимаемой памяти

Boolean 0 (False) или -1 (True) 2 байта

Byte 0 до 255 1 байт

Integer от -32,768 до 32,767 2 байта

Long от -2,147,483,648 до 2,147,483,647 4 байта

Single от -3.402823Е+38 до 3.402823Е+38 4 байта

Double от -1.7976931348623158+308 до 1.7976931348623158+308 8 байт

Currency от -922,337,203,685,477.5807 до 922,337,203,685,477.5807 8 байт

String Ограничено доступной памятью 2 байт на символ

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

338

Page 339: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Целый тип Максимальное число символов, необходимых для отображения значения

Двоичный 32

Восьмеричный 11

Шестнадцатиричный 8

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

339

Page 340: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.10.2 Ограничения строковых данных

Ограничения на представление строк:

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

340

Page 341: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

341

Page 342: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Notes версий 8 .x

Ограничено только доступной памятью

Показатель

Общее число строк

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

342

Page 343: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

343

Page 344: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Общий объем строковых данных в модуле Ограничено только доступной памятью

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

344

Page 345: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

345

Page 346: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

16,267 символов (32,000 байт).Длина строкового литерала

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

346

Page 347: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

347

Page 348: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Длина строки

Общий объем строковых литералов в модуле.

2 Гбайт

2 Гбайт

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

348

Page 349: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

349

Page 350: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Несмотря на то, что в LotusScript 4 строки могут быть длинее 64К, остаются ограничения на длину строк, которые могут быть прочитаны или записаны с использованием операторов GET и PUT.

Строки фиксированной длины, переменные типа Variant, содержащие строки и файлы произвольного доступа не работают со строками длиннее 64К. Более длинные строки могут использоваться в двоичных файлах и строках переменной длины. Причина состоит в том, что все они имеют 2-х байтный заголовок, задающий длину строки. Двумя байтами нельзя описать большую длину, чем 64К.

1.10.3 Ограничения на массивы

Ограничение на число элементов массива обусловленно предельным объемом скалярных данных на уровне модуля. Это 64К. Так, одноразмерный массив типа Long, объявленный на уровне модуля может иметь не более 16,128 элементов. Общий объем скалярных данных на уровне модуля ограничен 64К байтами, а каждый элемент типа Long занимает 4 байта.

Показатель Notes версий 8 .x

Объем данных массива Ограничено только доступной памятью

Число измерений 8

Размерности измерений от -32,768 до 32,767 (представляется значением типа Integer)

Число элементов Определяется объемом доступной памяти и размером отдельного элемента массива (различен для разных типов данных).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

350

Page 351: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

1.10.4 Ограничения на файловые операции и операции ввода/вывода

1.10.5 Ограничения компилятора и структуры скрипта

I tem Maximum

Максимальное число одновременно открытых файлов Определяется конкретным продуктом, использующим LotusScript

Максимальный номер для оператора Open 255

Максимальное значение recLen в операторе Open 32767

Максимальная длина строки, которая может быть записана операторов Write

Без ограничений

Максимальное число элементов в операторах Print, Write, Input 255

Максимальное число символов в пути в операторах MkDir, RmDir, ChDir

128 включая символ, задающий имя устройства

Элементы языка:Элемент Максимальное число

Число символов в идентификаторе LotusScript, не считая суффикса типа данных

40

Число аргументов процедуры или функции 31

Число меток в операторе On...GoTo 255

Показатель Notes версий 8 .x

Максимальное число строк скрипта или включаемого файла (без учета файлов, подключаемых директивой % Include)

64 К

Глубина вложений файлов, подключаемых директивой %lnclude 16

Число ошибок компиляции до прекращения компиляции скрипта 20

Число символов в таблице символов на уровне модуля 64 К

Число рекурсивных вызовов (уровень рекурсии) функции Ограничено 32К байтным стеком

Объем данных в указанной области видимости Модуль: Ограничено только доступной памятью

Класс: 64К bytes

Процедура: 32К bytes

Размер исполняемого кода модуля Ограничено только доступной памятью

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

351

Page 352: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

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

Снятие ограничения 64kb на размер исполняемого кода модуля значительно увеличивает возможности разработчика создавать крупные модули на LotusScript. Раньше разработчики были вынуждены разбивать модули на несколько библиотек скриптов. Данное усовершенствование позволяет значительно повысить стройность приложений.

Ограничения на объем данных в указанных областях видимости распространяется только на переменные со значениями фиксированного размера: переменные скалярных типов данных, исключая строки переменной длины; типы, определенные пользователем; фиксированные массивы скалярных типов данных. Изменение порядка объявления переменных может за счет изменения внутреннего выравнивания данных обеспечить некоторый дополнительный выигрыш по емкости. Например, переменные типа Integer имеют 2-х байтное выравнивание, а переменные типа Long - 4-х байтное.

Максимальный объем данных "динамических" переменных (строки переменной длины, списки, динамические массивы, экземпляры классов) ограничен только объемом доступной памяти. В то же время

каждая такая переменная занимает 4 байта в своей области видимости.

По внутренним причинам LotusScript может формировать ошибку "Out of stack" непосредственно перед достижением предела емкости.

1.11 Отличия использования LotusScript на различных платформах

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

Далее, в виде сводных таблиц и пояснений, представлены особенности и отличия функционирования этих элементов LotusScript версии 8 на наиболее широко распространенных операционных платформах. Левая графа такой таблицы содержит имя элемента LotusScript, правая графа содержит краткое описание отличий и особенностей применения данного элемента в используемой платформе.

1.11.1 OS/2

Отличия и особенности использования элементов языка

Отличия файловой системы

Элемент языка Реакция системы на использование элемента в скрипте

Command Аргументы командной строки обычно не используются в OS/2. С другой стороны, если используемый продукт Lotus допускает использование аргументов командной строки, их значения успешно возвращаются функцией Command.

CreateObject Не поддерживается. Приводит к ошибке времени исполнения.

GetObject Не поддерживается. Приводит к ошибке времени исполнения.

Shell Аргумент, задающий стиль окна, не поддерживается для системных приложений OS/2, а также прикладных программ, использующих для сохранения параметров среды Profile. Стиль окна по умолчанию - нормальное с фокусом (SHELL_NORMAL_FOCUS).

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

352

Page 353: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Обе файловые системы OS/2 - HPFS и FAT - поддерживаются в LotusScript. FAT допускает использование только "обычных" имен файлов: не более 8-ми символов в имени файла и 3-х в расширении. Файловая система HPFS допускает использование как обычных имен файлов, так и так называемых "длинных" имен файлов, количество символов в которых может достигать 254. "Длинное" имя файла может содержать любое число точек и, если имя файла заключено в кавычки, пробелов. Не разрешаются только имена целиком состоящие из точек или пробелов. Имена файлов не чувствительны к регистру.

Символы "*" и "?" в имени файла имеют свое обычное значение - любое число произвольных символов и любой символ соответственно.

При копировании файла с "длинным" именем на устройство с файловой системой FAT имя файла приводится к обычному формату "8.3" Оригинальное имя при этом не теряется, а сохраняется как расширенный атрибут и восстанавливается при обратном копировании. Такая операция требует участия пользователя. Попытка обратиться к копии файла на устройстве FAT по оригинальному "длинному" имени вызовет ошибку времени исполнения.

Использование HPFS требует порядка 500 килобайт оперативной памяти и минимально допустимый

размер памяти станции составляет 6 Мб. С другой стороны, Notes или Domino Designer 5-ой версии сами по себе требуют большего объема памяти.

Отсутствие поддержки OLE

На платформе OS/2 нет понятия "OLE". В результате бессмысленны и не работают функции CreateOb jec t и Ge tOb jec t .

Взаимодействие с приложениями REXX

Приложение LotusScript на платформе OS/2 может взаимодействовать с приложением REXX. Для этой цели используется LSX (LotusScript extension), реализованный библиотекой LTSRX010.DLL. С помощью LSX скрипт может передавать значения приложению REXX, инициировать их обработку и получать результат. Выполнение строки REXX-приложения в LotusScript имеет вид вызова функции. Для этой цели служат функция и оператор REXXFunc t ion . Выполнение целого REXX-приложения (командного файла) в LotusScript обеспечивается функцией REXXCmd.

1.11.2 UNIX

Отличия и особенности использования элементов языка

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

353

Page 354: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Элемент языка Реакция системы на использование элемента в скрипте

ActivateApp Не поддерживается. Приводит к ошибке времени исполнения.

ChDir Ошибка времени исполнения возникает, если LotusScript не может интерпретировать аргумент ChDir, например, если в аргументе содержится буква определяющая устройство.

ChDrive CurDir, CurDir$

Приводят к ошибке времени исполнения, если аргумент, указывая на устройство по умолчанию, не является пустой строкой ("").

CreateObject Не поддерживается. Приводит к ошибке времени исполнения.

CurDrive, CurDrive$ Возвращают пустую строку (""), т.к. в UNIX нет буквенных обозначений устройств.

Date, Date$ Time, Time$

По соображениям безопасности и устойчивости системы в UNIX только супервизор может изменять системные дату и время. Соответственно, при работе под именем супервизора данные функции изменяют общесистемные дату и время. При работе же под другим непривилегированным именем данные функции вызывают ошибку времени исполнения.

Declare Не поддерживается соглашение о вызове Pasca l . Все внешние функции должны использовать соглашение о вызове CDECL. Не поддерживается спецификация с использованием A l ias номера внешней функции. Это приводит к возникновению ошибки времени исполнения в момент вызова объявленной таким образом функции.

Dir, Dir$. Игнорируются дополнительные значения аргумента атрибутов. Эти функции ведут себя так, как если бы атрибут у всех файлов был Normal. Для маски "V" возвращаются все файлы, а не только те, что имеют в имени ".", а также файлы с именем вида ".", но не файлы без расширения.

FileLen, Len, LenB, LenBP, LOF

В UNIX признак конца строки состоит из единственного символа (linefeed), а не из двух. Поэтому значения, возвращаемые данными функциями, в UNIX меньше, чем в Windows.

GetFileAttr Приводит к ошибке времени исполнения, если буква, обозначающая устройство включена в аргумент. Следующие атрибуты файлов не возвращаются: ATTR_HIDDEN, ATTR_ARCHIVE, ATTR_VOLUME ATTR_SYSTEM.

GetObject He поддерживается. Приводит к ошибке времени исполнения.

Input #, Input, lnput$, InputB, InputBS, Line #nput, Print, Write

Объектный код, полученный при компиляции скрипта, использующего данные функции, содержит специфичные для платформы конструкции. Специфичность набора символов, порядка следования байт, признака конца строки и точности чисел под UNIX отражаются на переносимости скрипта, использующего данные функции.

IsObject, IsUnknownСм. ниже "Другие отличия".

Open, Lock, Unlock Явное и неявное блокирование файлов не поддерживается в UNIX. Эта особенность приводит к следующему. Под UNIX LotusScript допускает открытие, копирование и т.д. файлов уже открытых для чтения. Таким образом, оператор Name работает под UNIX по-особому. В операторе Open единственным допустимым статусом блокировки является Shared. Попытка использования статусов Lock , Un lock , Lock Read , Lock Wr i t e и Lock ReadWr i te а также операторов Lock и UnLock приводит к возникновению ошибки времени исполнения.

SendKeys Не поддерживается. Приводит к ошибке времени исполнения.

SetFileAttr Игнорируются следующие атрибуты файла: ATTR HIDDEN, ATTR ARCHIVE, ATTR_VOLUME.

Shell Игнорируется аргумент, определяющий стиль окна.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

354

Page 355: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Отличия файловой системы

LotusScript учитывает все аспекты безопасности файловой системы UNIX. Данные отличия отражаются на операторах K i l l , Open , RmDi r .

В UNIX не используются буквенные обозначения устройств - все устройства располагаются в корневой директории. Если указатель пути содержит букву устройства, может произойти ошибка. Ошибка компиляции, если скрипт, содержащий такую конструкцию, подключается директивой %lnc lude и ошибка времени исполнения в остальных случаях. С другой стороны, UNIX допускает использование символа ":" в имени файла. Поэтому использование конструкции вида D i r$( "a : " ) возможно и означает поиск в текущей директории файла с именем а : .

UNIX использует символ "/" в качестве разделителя каталогов, в отличие от платформ DOS/Windows, использующих символ LotusScript поддерживает использование обоих символов, но со следующими ограничениями:

• строковый литерал : если символ "/" используется в строковом литерале, являющемся путем

к файлу, полученный после компиляции скрипта код не сможет выполняться на платформах

отличных от UNIX.UNIX допускает более широкое использование символов в указателях пути к данным. Так, например, в

UNIX можно использовать более одной точки в указателе пути. В противовес указателям пути в именах файлов LotusScript не поддерживает использование символа так как на других платформах он всегда является разделителем имен каталогов в пути.

В качестве признака конца строки UNIX использует в символ "перевода строки" (linefeed) (ASCII-код 10). Другие платформы для этой цели используют другие символы. Так, например, в Macintosh признак конца строки это символ "возврата каретки", а на платформе Windows - последовательность двух символов. Поэтому файлы, создаваемые с помощью одного и того же скрипта на разных платформах могут отличаться по размеру. Эта особенность отражается на функциях F i leLen, Len, LenB, LenBP.

Другие отличия

Использование спецификатора A l ias с порядковым номером С-функции в операторе Dec lare , невозможно в UNIX, т.к. в UNIX нет понятия номеров экспортируемых библиотекой функций.

Там где допустимо использование масок в строке указателя пути LotusScript поддерживает использование регулярных выражений UNIX в дополнение к символам "*" и "?". В то же время использование

регулярных выражений делает скрипт зависящим от платформы.

В операторе Like могут использоваться только регулярные выражения LotusScript, но не регулярные выражения UNIX-среды.

В LotusScript на платформе UNIX нет поддержки OLE. Это отражается на функциях LotusScript. Так, функции CreateOb jec t и Ge tOb jec t приводят к ошибке времени исполнения, функция IsOb jec t работает только для внутренних объектов и объектов продукта, а функция IsUnknown всегда возвращает False, т.к. для выражения типа Variant под UNIX нет возможности получить значение V_UNKNOWN.

1.11.3 Macintosh

Отличия и особенности использования элементов языка

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

355

Page 356: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Элемент языка Реакция системы на использование элемента в скрипте

ChDir Функция может использоваться с указанием имени устройства в стиле Macintosh, например, "Hard dr i ve : fo lder1 : fo lder2 : " . Указание устройства в стиле DOS, например, "С : \ " недопустимо.

ChDrive Приводит к ошибке времени исполнения, если аргумент не является пустой строкой (""), определяющей устройство по умолчанию. Для смены устройства используется оператор ChDir.

Command Аргументы командной строки обычно не используются в Macintosh. С другой стороны, если используемый продукт Lotus допускаем использование аргументов командной строки, их значения успешно возвращаются функцией Command.

CurDir Приводит к ошибке времени исполнения, если аргумент указан, но не является пустой строкой (""), определяя устройство по умолчанию.

CurDrive Всегда возвращает пустую строку, т.к. в Macintosh не используется буквенное обозначение устройств.

Declare Соглашение о вызове Pascal не поддерживается.

Date, Date$ Time, Time$ По соображениям безопасности и устойчивости системы в Macintosh только супервизор может изменять системные дату и время. Соответственно, при работе под именем супервизора данные функции изменяют общесистемные дату и время. При работе же под другим непривилегированным именем данные функции вызывают ошибку времени исполнения.

Dir Игнорируются дополнительные значения аргумента атрибутов ATTRJHIDDEN, ATTR_SYSTEM, ATTR_VOLUME. Для указания каталога не могут использоваться конструкции "." и "..". Для маски "*.*" возвращаются все файлы, а не только те, что имеют в имени ".", а также файлы с именем вида "*.", но не файлы без расширения.

Environ Всегда возвращает пустую строку. Ошибка времени исполнения происходит только при указании номера, превышающего предельно допустимый.

FileLen Файлы, состоящие из нескольких строк в Macintosh короче, чем в DOS, т.к. в Macintosh признак конца строки состоит из единственного символа, а не двух.

GetFileAttr Следующие атрибуты фалов не возвращаются: ATTR ARCHIVE, ATTR_VOLUME, ATTR_SYSTEM.

Len, LenB Строка, прочитанная из файла и содержащая признак конца строки, короче, чем на платформе DOS. Причина в том, что в Macintosh признак конца строки состоит из единственного символа, а не двух как в DOS.

Lock Открытые файлы доступны другим приложениям (могут открываться, копироваться и т.п.).

UnLock Открытые файлы доступны другим приложениям (могут открываться, копироваться и т.п.).

Open Открытые файлы доступны другим приложениям (могут открываться, копироваться и т.п.).

SendKeys Не поддерживается. Приводит к ошибке времени исполнения.

SetFileAttr Попытка установки атрибутов ATTR_ARCHIVE или ATTR_SYSTEM приводит к ошибке "Permission Denied".

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

356

Page 357: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Отличия файловой системы

Указатели пути понимаются в стиле Macintosh, если только у них не используется символ который на платформе Macintosh для указания пути не используется. Если указатель пути содержит то этот указатель понимается в стиле DOS.

Буквенные обозначения имен устройств в Macintosh не используются - все устройства располагаются в корневой директории. Если указатель пути содержит букву устройства, может произойти ошибка. Ошибка компиляции, если скрипт, содержащий такую конструкцию, подключается директивой %lnc lude и ошибка времени исполнения в остальных случаях.

Имена файлов не ограничиваются, как в DOS, 8-и символьными именами и 3-х символьными расширениями.

В Macintosh не сохраняется информация о текущем каталоге для каждого устройства, как это делается в DOS. Есть понятие единственного текущего каталога. Для обозначения имен устройств могут использоваться строки до 27 символов длиной. Все эти особенности отражаются на работе функций ChDi r ,

ChDr ive и CurDi r

В Macintosh для указания каталога не могут быть использованы конструкции "." и "..". Это ограничение затрагивает функцию D i r .

Системные атрибуты "Volume", "Archive" и "System" не используются в Macintosh. Это ограничение затрагивает функции D i r , GetF i leA t t r и Se tF i leAt t r .

Признаком конца строки в Macintosh служит символ "возврата каретки" (ASCII-код 13). Другие платформы для этой цели используют другие символы. Так, например, в UNIX признак конца строки это символ "перевода строки", а на платформе Windows - последовательность двух символов. Поэтому файлы, создаваемые с помощью одного и того же скрипта на разных платформах могут отличаться по размеру. Эта особенность отражается на функциях F i leLen, Len, LenB, LenBP.

Для файлов, открытых на чтение, Macintosh допускает операции (копирование, открытие и т.п.) другому приложению. Файл, открытый на запись из LotusScript, блокируется, и другие приложения не могут его открыть или копировать, но могут перемещать или переименовывать. Операторы Lock и UnLock работают только для общих ресурсов; блокируемый файл должен располагаться на файл-сервере, либо в локальном общем каталоге (позиция "Sharing Setup" в контрольной панели). Все эти особенности затрагивают операторы Open , Lock , UnLock .

Прочие отличия_

Использование спецификатора A l ias с порядковым номером С-функции в операторе Dec lare , невозможно в Macintosh.

В Macintosh нет понятия системных переменных окружения. Эта особенность затрагивает функцию Environ.

1.11.4 AS/400

Отличия и особенности использования элементов языка

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

357

Page 358: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

Отличия файловой системы

Элемент языка Реакция системы на использование элемента в скрипте

ActivateApp Не поддерживается. Приводит к ошибке времени исполнения.

ChDir Ошибка времени исполнения возникает, если LotusScript не может интерпретировать аргумент ChDir, например, если в аргументе содержится буква, определяющая устройство.

ChDrive Приводит к ошибке времени исполнения, если аргумент не является пустой строкой (""), определяющей устройство по умолчанию.

CreateObject Не поддерживается. Приводит к ошибке времени исполнения.

CurDir, CurDir$ Приводит к ошибке времени исполнения, если аргумент не является пустой строкой (""), определяющей устройство по умолчанию.

CurDrive, CurDrive$ Всегда возвращает пустую строку, т.к. в AS/400 нет понятия устройств.

Date, Date$ Изменение системной даты из LotusScript в AS/400 не поддерживается. Приводит к ошибке времени исполнения.

Declare Не поддерживаются соглашения о вызове Pasca l . Все внешние функции должны использовать соглашение о вызове CDECL. При передаче аргументов, не являющихся указателями, вы обязаны использовать _Sys tem.

Dir, Dir$ Игнорируются дополнительные значения аргумента атрибутов. Эти функции ведут себя так, как если бы атрибут у всех файлов был Normal. Для маски "*.*" возвращаются все файлы, а не только те, что имеют в имени ".", а также файлы с именем вида "*.", но не файлы без расширения.

FileLen, Len, LenB, LenBP, LOF

Признак конца строки в AS/400 состоит не из двух символов, как на платформе DOS/Windows, а из одного - символа "перевода строки" (linefeed). Поэтому значения, возвращаемые данными функциями, в AS/400 меньше, чем в Windows.

GetFileAttr Приводит к ошибке времени исполнения, если буква, обозначающая устройство, включена в аргумент. Следующие атрибуты фалов не возвращаются: ATTR HIDDEN, ATTR ARCHIVE, ATTR VOLUME, ATTR_SYSTEM.

GetObject He поддерживается. Приводит к ошибке времени исполнения.

SendKeys Не поддерживается. Приводит к ошибке времени исполнения.

SetFileAttr Игнорируются следующие атрибуты файла: ATTR HIDDEN, ATTR ARCHIVE, ATTR_VOLUME.

Shell Игнорируется аргумент, определяющий стиль окна.

Open, Lock, Unlock Явно или косвенно блокировка файла не поддерживается. Это означает следующее:1. В AS/400 LotusScript позволяет пользователю делать операции (такие, как копия или открытие) над файлом, который уже открыт для чтения. Таким образом, Name работает по-другому с AS/400.2. В Open можно указать только Shared для блокировки. Lock Read, Lock Write и Lock Read Write вызовут ошибку времени исполнения.3. Lock и Unlock вызовут ошибку времени исполнения.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

358

Page 359: itpmr.ruitpmr.ru/docs/1-277_LotusScript_Lotus_Domino_R8.doc  · Web viewЕ.В. Поляков А,,В. Ходырев. Язык программирования LotusScript в Lotus

В AS/400 не используется буквенное обозначение устройств. Поэтому, если в указатели пути содержится буква устройства, может произойти ошибка.

AS/400 использует символ "/" в качестве разделителя каталогов, в отличие от платформ DOS/Windows, использующих символ LotusScript поддерживает использование обоих символов, но со следующими ограничениями:

• если скрипт, использующий строковый литерал в качестве указателя пути, скомпилирован на

платформе, отличной от AS/400 или UNIX, т.е. на платформе, использующей обратный слэшдля разделения каталогов в указателе пути, не будет работать на AS/400.

• В отличие от указателей пути, LotusScript не может использовать имена файлов, содержащие

обратный слэш потому что этот символ всегда является разделителем каталогов на других

платформах.

Прочие отличия

Использование спецификатора A l ias с порядковым номером С-функции в операторе Dec lare , невозможно на AS/400.

Там где допустимо использование масок в строке указателя пути LotusScript поддерживает использование регулярных выражений UNIX в дополнение к символам "*" и "?". В то же время использование регулярных выражений делает скрипт зависящим от платформы.

На платформе AS/400 нет поддержки OLE. Это отражается на функциях LotusScript. Так, функции CreateOb jec t и Ge tOb jec t приводят к ошибке времени исполнения, функция IsOb jec t работает только для внутренних объектов и объектов продукта, а функция IsUnknown всегда возвращает False, т.к. для выражения типа Variant под UNIX нет возможности получить значение VJJNKNOWN.

При передаче указателей в качестве аргументов С-функции следует иметь в виду, что на платформе AS/400 указатели занимают не 4, а 16 байт.

©InterTrust Со. Тел. (495) 9567928 http://www.intertrust.ru

359