Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы

advertisement
Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java
201
Процедура Property Set... End Property не должна по синтаксису иметь в имени^свойства
индексов.
Про цедур ы -сво йст ва мо гут быт ь переданы в ф ункцию то лько по значению, но не п о
ссылке.
2.5.4. Declare - оператор предварительного объявления процедуры
В LotusScript версий ниже 4.0 в некоторых случаях требовалось предварительно
обьявлять процедуру перед ее определением. Для LotusScript версий 4.0 и выше это уже не
шляется необходимостью. Однако для совместимости с более ранними приложениями
соответствующий оператор в языке остался. Его синтаксис может быть одним из следующих:
Declare [ опция_области_видимости ] Function имя_функции
\ (список_параметров ) ]
[As тип_данных_возвращаемого^значения ]
Declare \опция_области_видимости\ Sub имя_подпрограммы
\(список_параметров)]
Declare [ опция_области_видимости ] Property Get имя_свойства [
(список_параметров ) ] [As тип_данных_свойства ]
Declare [опция_области_видимости] Property Set имя_свойства
{(список_параметров ) ] [ As тип_данных_свойства ]
Все параметры имеют ту же смысловую нагрузку, что и при определении процедуры. В
LotusScript версий 4.0 и выше данный оператор компилятором воспринимается как
комментарий.
© InlerTmst Со. Тел. (095) 9567928
Язык LotusScript
202
2.6. Классы в LotusScript
Классы являются базовым понятием объектно-ориентированного проектирования. В
данном параграфе авторы попытались сосредоточить свое внимание на особенностях
реализации классов в LotusScript. Для более детального знакомства с технологией объектноориентированного проектирования можно порекомендовать книгу: Буч Г. Объектно ориентированное проектирование с примерами применения: Пер. с англ. - М: Конкорд 1992
-519с.
Классы представляют собой комбинированный тип данных, который включает в себя как
отдельные переменные, так и процедуры для их обработки. Классы, благодаря большей
функциональности чем просто процедуры, позволяют значительно сократить время
разработки путем повторного использования кода. Разработчикам предоставляется
возможность создания и распространения сторонним пользователям библиотек классов (при
этом, только авторы могут модифицировать данные библиотеки). Для создания библиотеки
описания классов компилируются и помещаются в файлы с расширением *.LSO. Включение
файла в нужное место происходит директивой Use.
Переменные и процедуры члены класса могут иметь области видимости как в пределах
класса (Private), так и вне класса (Public). Таким образом, достигается возможность
ограничения доступа к членам класса. Процедуры члены класса могут использоваться:
•
для инициализации переменных членов класса, при создании на основе описания класса
его экземпляра;
•
для доступа к переменным членам класса;
•
для освобождения памяти, занимаемой экземпляром класса, после того как приложение
уже не нуждается в данном объекте.
Базовым понятием объектно-ориентированного проектирования является наследование.
Наследование позволяет разработчикам определять новые классы "не с нуля", а на основе
ранее разработанных классов. Класс, создаваемый на основе другого класса, называют
производным классом (derived class), а класс, на основе которого производный класс
создается, базовым классом (base class).
Базовый класс определяет общие переменные и процедуры члены класса, которые в
дальнейшем могут использоваться для наследования другими классами. Описание
производного класса расширяет и возможно уточняет базовый класс, при этом производный
класс имеет прямой доступ ко всем членам базового класса, кроме деструктора базового
класса. Кроме того что в производный класс могут быть добавлены новые члены класса,
также существует возможность переопределения членов базового класса в производном
классе. При этом одноименный элемент базового класса не переопределяется.
Для определения описания класса используется оператор со следующим синтаксисом: |
опция_области_видимости ] Class имя_класса [ As имя_базового_класса ]
группа_операторов
End Class
где:
опция_области_видимости может быть либо Public, или Private. Опция Public дает
возможность использовать описание данного "класса и вне модуля, в котором он был
определен, до тех пор, пока модуль с его определением остается загруженным. Опция
InterTrust Co. Тел. (095) 9567928
Lotus Domino R. 5: @-формулы, LotusScript, «строенные классы LotusScript и Java
203
Private разрешает ссылаться на класс только в пределах модуля с его определением. По
умолчанию используется опция Private. Опцию_области_видимости типа Public
разрешается применять только на уровне модуля. Для производного класса его область
видимости должна совпадать с базовым классом;
• имя класса задает идентификатор, по которому возможно будет создать экземпляр
класса с данным описанием. Запрещается в качестве имя_класса использовать
идентификатор Object;
• As имя базового класса - необязательная конструкция, использующаяся для
определения производного класса. Соответственно имя_базового класса задает имя
базового класса;
• Группа операторов задает тело класса, и состоит из операторов объявления и
определения членов класса. Члены класса, как уже упоминалось, могут состоять из
переменных, пользовательских процедур (функции, подпрограммы и свойства), а так же
двух специализированных подпрограмм: конструктора класса с именем New, и
деструктора класса с именем Delete. Константы не могут выступать в качестве членов
класса.
•
.
Оператор Class ... End Class можно использовать только на уровне модуля.
Соответственно запрещается определять описание класса на уровне процедуры или внутри
другого класса.
В Lotus Script процедуры-функции и процедуры-подпрограммы члены класса называют
методами.
При объявлении членов класса должны соблюдаться следующие правила:
• при объявлении переменных членов класса разрешается использовать только опции
области видимости типа Public или Private. Соответственно запрещается использовать
опции Dim и Static. По умолчанию используется опция Private (т.е. доступна только в
пределах данного класса). Объявление каждой переменной члена класса должно
начинаться с новой строки (т.о. запрещается давать объявление переменных в виде
списка, элементы которого разделяются запятыми);
класс может включать экземпляр самого себя, как член класса. Однако, в этом случае в
объявлении переменной, ссылающейся на этот класс, запрещается использовать
ключевое слово New, т.к. описание класса не является объектом (только описание), и
поэтому не может создавать другие объекты;
при объявлении процедур членов класса так же разрешается использовать только опции
области видимости типа Public или Private. Соответственно запрещается использовать
опцию Static;
процедуры члены класса с именами New и Delete разрешается использовать только в
контексте конструктора и деструктора класса соответственно;
и ден тифи ка торы пр оц е дур чл ено в кла сса мог ут с овпа да ть с л юбы ми
зарезервированными ключевыми словами LotusScript, имена переменных членов класса
также могут совпадать с зарезервированными ключевыми словами, за исключением:
Public, Private, Static, Sub, Function, Property, Get, Set, New, Delete, и Rein. Авторы
рекомендуют не применять данное правило на практике, хотя бы из соображений
"читабельности" скрипта.
Для ссылки на члены класса используется следующий синтаксис:
имя_экземпляра_ класса . имя_члена_класса
© InterTrust Со. Тел. (095) 9567928
Язык LotusScript
204
имя_члена_класса определяет соответственно либо переменную, либо процедуру
входящие в состав класса, а имя_экземпляра_класса - идентификатор-ссылка на объект
созданного на основании описания класса.
Для ссылки на текущий класс в процедурах членах класса может использоваться
ключевое слово Me (аналогично ключевому слову this в языке C++) со следующей
синтаксисом:
Me. имя_члена_класса .
Например, Me.Color ссылается на переменную Color текущего класса. В случае, когда
имя переменной члена класса совпадает"с ключевыми словами LotusScript, то использована
Me перед именем переменной необходимо.
Методы производного класса могут быть переопределены ("перезагружены") в
отношению к одноименным методам базового класса. Заголовок переопределяемого метода
производном классе, в этом случае, должен в точности совпадать с заголовком одноименного
метода в базовом классе. Под заголовком здесь понимается имя метода со списком его
формальных параметров, которые должны однозначно совпадать с переопределяемы]
методом базового класса.
Для ссылки на член базового класса в контексте производного класса используете
следующий синтаксис:
имя_базового_класса.имя_члена_класса
Для одновременной работы с несколькими членами класса можно использовать оператор
With ... End With (будет рассмотрен позднее в настоящем параграфе).
Для создания экземпляра класса (также называемого объектом) используют ключевое
слово New совместно с оператором Dim, или Set. Данными операторами также определяете
переменная, которая будет использоваться для организации ссылки на данный экземпляр
класса.
После объявления переменной типа ссылки на класс (без ключевого слова Ne\\
LotusScript инициализирует значение данной переменной как Nothing. Для сравнен!
значения переменной с Nothing используется оператор выполнения операции Is. Например,
(doc Is Nothing) Then ... End If. Так как переменные типа Variant так же могут содержа'
значения типа ссылки на экземпляр класса, то в этом случае для такой проверки необходимо
использовать функция IsObject (будет рассмотрена позднее в настоящем параграфе).
Для принудительного удаления экземпляра класса можно использовать оператор Dele
(так же будет рассмотрен позднее в настоящем параграфе).
Пример 1. Определяется класс MyPoint, который соответствует вектору в 2-х мерном пространен и
две процедуры MySum - векторная сумма, MyScal - скалярное произведение этих векторов.
Class MyPoint
Public x As Double
'координата вектора по X Public у As
Double
'координата вектора по Y Public Function MySum( A
As MyPoint, В As MyPoint ) As MyPoint Set MySum == New MyPoint
MySum.x = A.x + B.x MySum, у = А. у + В. у 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
© InterTrust Co. Тел. (095) 9567928
Lotus Domino R. 5: @-формулы, Lotus^ ,pt, встроенные классы Lotus Script и Java
205
Point1.x=2
Point1.y=3
Point2.x=-1
Point2.y=4
Set Point3 = Pointl.MySum( Pointl, Point2 )
Print Point3.x
'выводит 1
Print Point3, у
'выводит 7
Print Pointl.MyScal( Pointl, Point2 )
'выводит 10
'пример 2. Модифицированный пример 1 с использованием в описании класса ключевого слова
Class Point
Public x As Double 'координата вектора по
Pub li c у As D ou b le ' ко орд ин ат а в е кто ра по
Public Function MySum ( A As MyPoint ) As MyPoint.
Set MySum = New MyPoint
MySum.x =A. x + Me.x
X
Y
MySum.у = А.у + Me.у End Function Public Function
MyScal( A As MyPoint ) As Double
MyScal = A . x * Me.x + А.у * Me.у End
End Function
End Class
Dim Pointl as New MyPoint, Point2 as New MyPoint
Dim Point3 as New MyPoint
Point1.x=2
Point1.y=3
Point2.x=-1
Point2.y=4
Point3 = Pointl.MySum ( Point2 )
Print Points.x
'выводит 1
Print Point3. у
'выводит 7
Pointl. MyScal( Point2 )
'выводит 10
2.6.1. Конструктор и деструктор класса
ь
При создании описания класса разработчик имеет возможность определить две
специализированные подпрограммы, которые будут принудительно выполняться при
создании экземпляра класса, и при его удалении из памяти. Данные процедуры называются
конструктор и деструктор класса, и имеют соответственно имена New и Delete. У класса
может быть только один конструктор и деструктор. Для них определена неизменяемая
область видимости типа Public.
Синтаксис конструктора класса
подпрограмм в LotusScript, и имеет вид:
несколько
отличается
от
обычного
с интаксиса
Sub New [ ( список_параметров ) ]
[ , имя базового ^класса ( f список параметров_базового_класса ] ) ]
[группа_операторов]
где:
' список_параметров и группа _операторов имеют значение и синтаксис аналогичный
обычному определению подпрограммы (стр. 195);
InterTrust Co. Тел. (095) 9567928
206
Язык LotusScript
конструкции имя_базового_класса и список_параметров_базового_класса требуются
только для производных классов, в случае, когда конструктор базового класса содержит
список аргументов, отличный от списка аргументов определяемого производного класса. При
этом имя_базового_Ю1асса должно в точности совпадать с именем базового класса из
конструкции
As
имя_базового_класса
в
описании
текущего
класса.
Список_параметров_базового_класса должен представлять собой список фактических (а
не формальных описаний) параметров для конструктора базового класса. В этом случае
сначала выполняется конструктор базового, а затем производного класса. Если базовый для
текущего класса также является производным, то операция поднимается на уровень вверх.
Самым первым в этой цепочке будет выполняться конструктор класса самого верхнего
уровня, затем управление будет постепенно спускаться вниз до текущего класса. Если список
аргументов конструктора базового класса совпадает или является подмножеством списка
аргументов определяемого конструктора производного класса, то в конструкции [ ,
имя_базового _класса ( [ список параметров базового ^класса ] ) ] нет необходимости.
Для деструктора класса имеются следующие ограничения по отношению к обычным
подпрограммам:
•
•
•
деструктор не должен иметь списка параметров;
нельзя самостоятельно вызвать деструктор операторами вызова подпрограмм;
иерархия выполнения деструкторов для производного класса аналогична порядку
выполнения конструкторов с точностью до наоборот; сперва выполняется деструктор
производного класса, затем его прямой предок, и так до самого верхнего уровня.
Следует так же отметить, что деструктор класса используется не для непосредственного
удаления объекта (это делает сам Lotus Script), а для выполнения необходимых, с точки
зрения разработчика, действий перед удалением объекта. В остальном и конструктор, и
деструктор подчиняются общим правилам синтаксиса для процедур-подпрограмм.
Пример 1. Модифицированный пример из предыдущего параграфа с использованием конструктора
и деструктора класса. Обратите внимание, что в функции MySum изменился оператор первоначальной
инициализации возвращаемого значения (при вызове конструктора добавились параметры), в
противном случае (их отсутствие) выдается ошибка на стадии компиляции.
Class MyPoint
Public x As Double 'координата вектора по X
Public у As Double 'координата вектора по Y
Public Function MySum( A As MyPoint ) As MyPoint
Set MySum =• New MyPoint ( 0,0 )
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
—,
Sub New ( xl As Double, yl As Double; )
x - xl
У ^ yl
End Sub Sub
Delete
Print "Объект с координатами по Х=" &
" Y=" & Str( у ) & " будет удален" End
Sub End Class
© InterTrust Co. Тел. (095) 956
Lotus Domino R. 5; @-формулы, LotusScript, встроенные классы LotusScript и Java
Dim Pointl as MyPoint
Set Pointl. = New MyPoint (
Print Point 1 . x
'выводит
Print Pointl, у
'выводит
Delete Pointl
'выводит
207
2,3 )
' "" '
2
'
3
"
Объект с координатами по Х=2 Y=3 будет удален
Пример 2. Модифицированный пример 1. Добавился новый класс ColorPoint, являющийся
производным от MyPoint. Конструктор и деструктор класса ColorPoint, вызывает конструктор и
деструктор MyPoint соответственно.
Class MyPoint
Public x As Double
'координата вектора по X
Public у As Double
'координата вектора по Y
Public Function MySum ( A As MyPoint ) As MyPoint
Set MySum - New MyPoint( 0 , 0 )
MySum.x = A.x + Me.x
MySum.у = A.y + Me.y
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 = xl
у = yl
-
. : - . .
•••
:
:'
-
:
.
•
••
S
•.
:.-.
-
.
Print "Вызов конструктора для MyPoint"
. •
End Sub
,
.
Sub Delete
,
.
Print "Объект MyPoint с координатами по Х=" & Str( x )
" Y=" & Str ( у ) & " будет удален" End
Sub
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 с координатами по Х=" & 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
J
'выводит Объект ColorPoint с координатами по Х=2 Y=3 и 'Color =
Красный будет удален 'выводит Объект MyPoint с координатами по
Х=2 Y~3 будет удален
В приведенном примере мы принудительно, с помощью оператора Delete (не путать с
деструктором класса) удалили экземпляр класса с именем Pointl. LotusScript сам бы удалил
данный объект, после того как необходимость в нем бы отпала. Оператор Delete удаляет
© InterTrust Co. Тел. (095) 9567928
208
Язык LotusScript
объект даже в случае, если еще имеются переменные, ссылающиеся на удаляемый объект. После
выполнения оператора эти ссылки приобретают значение Nothing. Оператор имеет следующий
синтаксис:
Delete идентификатор_ссылки_на_объект
Применение оператора вызывает соответствующий деструктор класса (если он имеется). Для
объектов, являющихся производными классами, после вызова собственного деструктора
последовательно вызываются деструкторы классов-предков, начиная с прямого предка текущего
класса до самого верхнего уровня.
Для встроенных классов результат применения оператора 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. Попытки присваивание старой ссылке другого значения - результата не приносили.
Ниже приводится пример скрипта, который можно использовать, например, в акции формы для
физического удаления текущего документа, открытого в рабочем пространстве.
Пример. Демонстрирует применение оператора 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.Current Document
Set. doc = uidoc. Document
Unid = doc.UniversallD
Set db = doc.ParentDatabase
Call uidoc.close
Delete doc
'без этого оператора скрипт не работает
Set docl = db.GetDocumentByUNID( Unid )
fig = docl.Remove( True )
LotusScript автоматически управляет процессом очистки памяти, занимаемой объектами, от
"мусора". При создании объекта LotusScript генерирует внутреннюю переменную-счетчик, значение
которой есть число ссылок на данный объект (сразу после создания объекта она равна 1). При
установлении новый ссылки на объект - переменная-счетчик увеличивается на
© InterTrust Co. Тел. (095) 9567928
Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java
209
единицу. Когда переменная-ссылка выходит за границы свой области видимости, то переменнаясчетчик уменьшает свое значение на 1. Значение 0 у переменной-счетчика служит сигналом
LotusScript для удаления ассоциированного с ней объекта из памяти.
2.6.2. Получение доступа и работа с членами класса
Все члены класса (как переменные, так и процедуры) могут иметь область видимости либо
Public, либо Private. Первая опция позволяет ссылаться на члены класса и вне его контекста, вторая соответственно запрещает. Но умолчанию для переменных членов класса назначена опция области
видимости Private, а для процедур - Public. Данное правило считается хорошим стилем в объектноориентированном проектировании. Таким образом. только процедуры класса могут манипулировать
с переменными членами класса, вне контекста класса данные переменные не видны, и не могут быть
"испорчены" другими процедурами. Такой механизм в объектно-ориентированном проектировании
называется инкапсуляцией данных.
П р и м е р . П е р е п и ш е м п р и м е р и з п р е д ы д у щ е г о п а р а г р а ф а та к, ч то б ы с о б л ю д а л и с ь п р а в и л а инкапсуляции
данных.
Class MyPoint
•-•••.;t, . - • - .
•-..-. -.. - . • - •• ••
• • • , .: .•>•:,•. • .л -. . .••/.-.v.-i ... • :,
х As Double
, ,.
'координата вектора по X ,, . . ..
- ,. ...
.-:.
у As Double
'координата вектора по У .. . - ; -.
.
, , .,.-Function GetX As Double
GetX - Me.x
End Function
Function GetY As Double
,
- . .
...
GetY = Me.у End Function Sub
SetX( xl As Double )
Me . x = x 1
:
End Sub
'
'
:
Sub Sety( yl As Double )
''
Me. у = yl
" .•
'• • •
:«
Knd Sub
'
'
•,.,-....-..Function MySum( A As MyPoint ) As MyPoint
:
Dim x As New MyPoint( 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( xl. As Double, yl As Double ) Me.x =
xl Me.у = у1 End Sub Sub Delete
Print "Объект с координатами по Х-=" & Str( Me. x )
" Y=" & Str( Me.у ) & " будет удален" End Sub rrid Class
Dim Pointl as MyPoint, Point;2 as MyPoint, Points as MyPoint ••ft- poi:itl =
New MyPoint ( 2, 3 )
:. Pointl. GetX
'выводит 2
i'rint Pointl. GetY
'выводит 3
Call Pointl.SetX ( -1 )
• Pointl.GetX
'выводит -1
© InterTrust Co. Тел. (095) 9567928
Язык LotusScript
210
Set Point2 = New MyPoint( 2 , 4 )
• .
.
Set Point3 = Pointl .MySum ( Point.2 )
Print Point3.GetX
'выводит 1
Print Points.GetY
'выводит 7
Print Pointl .MyScal ( Point;2 )
'выводит 10
Для групповых операций с членами класса вне его контекста может использоваться
оператор With ... End With. Он имеет следующий синтаксис:
With ссылка_па_объект
\группа_операторов]
End With
где:
*
•
ссылка_на_объект представляет собой выражение^ значение которого есть ссылка на
объект. Например, это может быть вызов функции, которая возвращает значение Variant,
содержащее ссылку на объект;
группа_операторов любые допустимые операторы LotusScript. В рамках этих
операторов доступ к членам объекта, на который ссылается ссылка_на_объект может
осуществляться в следующей нотации:
. имя члена объекта
Допускается использование вложенных операторов With ... End With. Максимальная
глубина, вложения 16. Не допускается вход в группу ^операторов по оператору безусловного
перехода. Присваивание ссылке_на_объект другого значения в группе_операторов не
влечет за собой смены объекта, к которому применяются операторы в нотации
.имя_члена_объекта. Иными словами, для такой нотации до конца оператора With объект
остается в памяти в состоянии до переприсваивания ссылки на него. По выходу из оператора
With объект, соответствующий старой ссылке, будет утерян. Для операторов в нотации
имя_объекта.имя_ч.члена_объекта действия в теле оператора будут применяться к
соответствующим объектам (см. пример). Авторы не рекомендуют применять на практике
эти механизмы, хотя бы из соображений "читабельности" скрипта.
Пример. Демонстрирует применение оператора With ,., End With.
Class MyPoint
Public x As Double , 'координата вектора по X
Public у As Double 'координата вектора по У
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 Points as New MyPoint With Pointl .x = 2 .y = 3
Print "X=" & Str( . x ) & " Y=" & Str( . у )
'выводит Х=2 Y=3
© InterTrust Co. Тел. (095) 9567928
Lotus Domino R, 5: @гформулы, LotusScript, встроенные классы LotusScript и Java
211
End With With
Point 2
.x = -1
.y = 4
Print "X=" & Strf . x } & " Y--=" & Str( . у )
'выводит Х=-1 Y=4
Set Point3 = .MySum( Pointl }
Print .MyScal( Pointl )
'выводит 10
2nd With
Print "X=" & Str (Point2.x ) & " Y=" & Str( Point2.y )
'выводит Х=-1 Y=4 •<ith Point3
Print .x
'выводит 1
Print .у
'выводит 7
Set Point3 = Point2
'дальнейшие Операторы будут выполняться для нотации:
' .имя_члена_класса для объекта ( 1 , 7 )
1
имя_объекта.имя_члена_класса для соответствующего объекта
Print "Х=" & Str(Point3.x ) & " Y=" & Str( Point3.y )
'выводит X=-l Y=4
Print "X=" & Str(.x ) & " Y-=" & Str ( „y )
'выводит Х=1 Y=7
Print .MyScal ( Pointl )
'выводит 23
Print Points.MyScal ( Pointl )
'выводит 10 ;/.i
With
int. "X=" & Str (Point3. x ) & " Y=" & Str( Points, у )
.'.ыводит X=-l Y=4
2.6.3. Механизмы наследования классов
Как уже упоминалось, с помощью механизмов наследования разработчики могут
определять новые классы на основе ранее разработанных базовых классов. Такая
необходимость обычно возникает либо когда требуется добавить в существующий класс
недостающие переменные члены класса, или добавить/изменить методы класса. При этом
производный класс имеет прямой доступ ко всем членам базового класса (как к Public, так и к
Private) кроме деструктора базового класса.
Для переопределения ("перезагрузки") метода производного класса необходимо, чтобы
заголовок переопределяемого метода в производном классе в точности совпадал с
заголовком одноименного метода в базовом классе. Под заголовком здесь понимается имя
метода со списком его формальных параметров, которые должны однозначно совпадать с
переопределяемым методом базового класса.
Иногда бывает необходимо при перезагрузке метода в производном классе сначала
вызвать одноименный метод базового класса. В этом случае применяется двухточечная нотация:
имя__базового_класса .. имя_члена__класса,
Пример. Демонстрирует механизмы наследования. Класс NewPoint является производным от
MyPoint. В производном классе метод MySum перезагружается полностью, а метод MyScal
предварительно вызывает одноименный метод базового класса.
-: MyPoint
'
Public x As Double .... . 'координата вектора по X
Public у As Double 'координата вектора по Y
Sub MySum( A As Variant,PL As Variant)
z1.x = A.x + Me.x
zi.y = A.y + Me.у End
Sub
© InterTrust Co. Ten. (095) 9567928
212
Язык LotusScript
Function MyScal ( A As Variant ) As Double
My Seal = A.x * Me . x + А. у * Me . у
End Inunction
Sub New( xl As Double, Me. x - yl As Double )
x1 Me.у = yl En d Sub End
Class
Class NewPoint As MyPoint P ub l ic
'координата вектора по Z
z As Do ub l e
Su b MySu mf A A s Var ian t, zl
As Varia nt) z1. x = A.x + Me.x z l .у =
А . у + M e. у z1.z = A.z + Me . z End Sub
Function MyScai( A As Variant )
As Double
Me . z
M y Sc a i = M yP oi n t . .M yS c al ( Find
A ) -f A. z
Function
zl As Double )
Su b New( xl As Doub le, yl As Doubl e
MyPoint( xl, yl )
Me . z =•• zl End
Sub End Class
Di m Poin tl As MyPoi nt, Point 2 As V arian t
Di m Poin ts As Varia nt
Dim ZPointl As NewPoint, ZPoint.2 As Variant
D i m Z Po in t S As Va ri an t
S e t P oi nt l = N e w My Po i nt ( 2 , 3 )
S e t P oi nt 2 = N e w My Po i nt ( - 1, 4 )
S e t P oi nt s = N e w My Po i nt ( 0 , 0 )
C a ll Po in t l . My S um ( Po i nt 2 , Po i nt s )
Print Point3.x
'выводит 1
Print Point3. у
'выводит 7
Print Pointl .MyScal ( Point.2 )
'выводит 10
S e t Z Po in t l = N ew N ew P oi n t ( 2 , 3 , 4 )
Set ZPoint:2 = New NewPoint ( -1, 4, 2 )
S e t Z Po in t S = N ew N ew P oi n t ( О , О , О )
C a ll ZP oi n tl .M y Su m( Z P oi n t2 , Z Po in t S )
Print ZPointS.x
'выводит 1
Print Z Point. 3. у
.
'выводит 7
Print ZPoint3.z
'выводит 6
Print ZPointl.MyScal( ZPointz )
'выводит 18
j
Как было уже видно из примеров настоящего параграфа, в качестве параметров методов
класса могут выступать ссылки на экземпляры класса. В случае применения механизма
наследования разрешается вместо ссылки на базовой класс передавать ссылку на
производный класс, если формальный параметр был объявлен как объект базового класса.
Обратное не верно. Запрещается передавать ссылку на базовый класс, если формальный
параметр был объявлен как объект производного класса.
Аналогичное правило справедливо и для переменных ссылок на экземпляры классов.
Переменной, содержащей ссылку на базовый класс, можно присвоить значение переменной,
содержащей ссылку на производный класс. Но запрещается переменной, содержащей
ссылку на производный класс, присваивать значение переменной, содержащей ссылку на
базовый класс.
© InterTrust Co. Тел. (095) 95679
Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 213
2.6.4. Работа с переменными ссылками на объекты
Переменные ссылки на объект используются для создания на основе описания класса
его экземпляра (объекта), работе с компонентами объекта, и удалении объекта. Поведение
таких переменных аналогично поведению переменных других типов. Отличие заключается
в том, что значение таких переменных есть не сам объект, а 4-х байтовый указатель на
место, по которому объект хранится в памяти компьютера.
LotusScript позволяет просто объявить переменную типа ссылки на объект без создания
непосредственно объекта. Для данной операции используют следующий синтаксис:
Dim ссылка_на_объект As имя_класса
После выполнения такого оператора произойдет инициализация переменной
ссылка_на_объект значением Nothing.
Для создания экземпляра класса на основе его описания, как уже упоминалось,
необходимо использовать ключевое слово New совместно с оператором Dim, или Set. Оба
оператора кроме создания объекта выполняют еще и операцию присваивания переменной
ссылки на этот объект. Для оператора Dim в этом случае используется следующий синтаксис:
Dim ссылка_на_объект As New имя_класса
[(список_аргументов_конструктора )]
Данный синтаксис нельзя использовать для объявления и создания массива или списка
переменных типа ссылок на объекты. В этом случае (и не только) применяют оператор Set.
Оператор Set имеет три синтаксические формы:
Set ссылка_на_объект — New имя_класса
[(список_аргументов_конструктора)]
Set ссылка на объект! = ссылка на объект2
Set ссылка_на_объект — Bind [ ил1я_класса_продукта ] ( имя_объекта )
Первая синтаксическая форма создает объект по описанию с именем имя_класса, и
присваивает ссылке_на_объект значение указателя на этот объект. Переменная
ссылка_на_объект может иметь тип ссылки на конкретный объект, тип Variant, или другой
тип, ссылающегося на объект (например, элементами массива или списка, а также
определяемые пользователем типы данных).
Второй тип синтаксиса копирует значение существующего указателя на объект из
переменной ссылка_на_объект2 в переменную ссылке_на_объект1. При этом копирования
самого объекта не происходит. Переменная ссылка_на_объект! может иметь тип ссылки на
одноименный или производный объект, на который ссылается ссылка_на_объект2, а
также тип Variant, или другой тип, ссылающегося на объект (например, элементами
массива или списка, а также определяемые пользователем типы данных).
Ссылка_на_объект2 может содержать значение Nothing, быть ссылкой на одноименный,
производный или базовый класс по отношению к ссылке_на_объект!.
Третья синтаксическая форма используется для "связывания" переменной с указанным
объектом, например, встроенным объектом продукта конкретной реализации LotusScript.
Такая связь существует либо до тех пора пока переменная ссылка па_объект не вышла за
пределы свой области видимости, либо пока ей не присвоили другого значения, либо до тех
пор, пока объект с именем имя_объекта еще существует.
Язык LotusScript
214
Имя_класса продукта необязательный параметр, который определяет имя
встроенного
класса
для
объекта
с
именем
имя_объекта.
Если
имя_класса_продукта опущено, то считается, что объект с именем имя объекта
есть экземпляр того же самого класса, на который ссылается переменная
ссылка_на объект. В случае, когда переменная ссылка_па_объект имеет тип
Variant - указание имени_класса_продукта необходимо.
Имя_объекта должно быть строковым выражением, значение которого
представляет им я, и возможно путь к классу имя_кл асса__прод укта в
вид е "имя_окна_приложения\имя_объекта" Конкретная синтаксическая форма этого
параметра зависит от реализации LotusScript.
ЗАМЕЧАНИЕ: форма оператора Set с ключевым словом Bind не должна
использоваться для "связывания" переменных с объектами Lotus Notes\Domino, т.к.
последний делает это неявно.
Пример. Демонстрирует работу с переменными ссылками на объекты.
Class MyPoint
Public x As Double
'координата вектора по X
Public у As Double
•
'координата вектора по Y
Sub New( xl As Double, yl As Double
}
Me.x = x1
- i
Me. у = yl
End
Sub End
Class
Dim Pointl As New MyPoint ( 1, 3 ),Point:2 As
Variant Dim Points As MyPoint,Point4 As Variant
Dim Points( 1 To 3 } As MyPoint
'объявляется массив ссылок
Dim i As Integer
Set Point 2 = Pointl
'копируется значение ссылки Pointl в переменную
Point2 For i = 1 To 3
Set Point5 ( i ) = New MyPoint ( i/42 , i'\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 mismatch1
(смешение типов данных).
Оператор IsA определяет на какой конкретный" класс ссылается переменная
ссылка ни объект, и имеет следующий синтаксис:
•
Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java
215
ссылка_на_объект Is А имя_объекта
где:
ссылка_на_объект представляют собой выражение, значение которого есть ссылка на
объект, а 1шя_объема строковое выражение, значение которого соответствует имени класса
видимого в текущей области видимости. Оператор возвращает значение True, если
переменная ссылка_на_объект ссылается на объект с именем имя_объекта. В противном
случае возвращаемое значение есть False, Тип данных переменной ссылки_1ш__объект такой
же, как и у оператора Is.
,
. .. ... .......
... .-, v .,
.....
.-,.-,
По аналогии с оператором Is для IsA в случае, когда ссылка_на_объект имеет тип
Variant и значение отличное от ссылки на объект, то выдается сообщение об ошибке "Variant
does not contain an object" (переменная типа Variant не содержит ссылку на объект). Для
избежания ошибок такого типа рекомендуется применять функцию IsObject.
Функция IsObject проверяет, является значение выражения ссылкой на некоторый объект,
и имеет следующий синтаксис:
•
•
г
Is0bject( выражение )
выражение - любое допустимое выражение LotusScript. Функция возвращает значение
True, если значение выражения есть или ссылка на некоторый объект, или Nothing. В
противном случае возвращаемое значение есть False.
ЗАМЕЧАНИЕ: функция не поддерживается на операционных платформах OS/2, Unix и
Macintosh.
Пример. Демонстрирует применение операторов Is, IsA и функции IsObject.
Class MyPoint
Public x As Double
'координата вектора по X
Public у As Double
'координата вектора no 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
Print Pointl Is Points Set
'выводит False
Point2 = Pointl Print Pointl Is
Point2 Print Pointl Is Nothing 'выводит True
Print Point3 Is Nothing Print
'выводит False
Pointl IsA "Point" Print Points 'выводит True
IsA "MyPoint1 Print IsObject (
'выводит False
Point2 ) Print IsObject ( Points 1 выводит True
) Print IsObject ( Point 4 ) • •
'выводит True
'выводит True
'выводит False
.
.
.
.
-
.
Язык LotusScript
216
2.7. Определяемые пользователем типы данных
Подобно классам, пользовательские типы данных представляют собой комбинированный
тип данных, который может состоять из переменных различных типов. Однако в отличие от
классов, типы данных, определяемые пользователем, не содержат процедур для обработки
этих данных. Не применимы к пользовательским типам данных и механизмы наследования.
LotusScript разрешает оперировать только с компонентами пользовательского типа, а не с
типом целиком. И наконец последнее отличие состоит в том, что переменные, ссылающиеся
на класс, содержат в себе только указатель на область памяти, занимаемую классом, в то
время как переменная, определяемого пользователем типа данных, хранит в себе реальное
значение всех составляющих указанного типа данных.
i
В BASIC-подобных языках механизм определяемых пользователем типов данных часто
используется при работе с СУБД, операциях файлового ввода/вывода и печати. Указанный
механизм позволяет группировать вместе разнотипные (но обычно связанные между собой)
данные в одной переменной. Для объявления нового, определяемого пользователем типа
данных используется следующий синтаксис:
[ опция_области_видимости ] Туре имя_типа_данных
объявление_переменных
End Туре
•
•
^
-..
* опцш^области^видимости может быть либо Public, или Private. Опция Public дает
возможность использовать тип данных и вне модуля, в котором он был определен, до тех
пор пока модуль с его определением остается загруженным в память компьютера. Опция
Private разрешает использовать тип данных только в пределах модуля с его
определением. По умолчанию используется опция Private. Опцию_области_видимости
типа Public разрешается применять только на уровне модуля;
* тип_данных задает идентификатор, по которому возможно будет создать реальную
переменную с составляющими согласно данного описания, Запрещается в качестве
типа_даипых использовать идентификатор Object;
* объявление_переменных содержат операторы явного объявления входящих в данный
тип_данных переменных. Типы данных этих переменных могут быть любого
скалярного типа. Variant, массивов фиксированной длины, и других объявляемых
пользователем типов данных (за исключением текущего пользовательского типа данных).
Переменные, объявленные как Variant, могут в дальнейшем содержать значения любого
скалярного типа, массивов динамических или фиксированной длины, и ссылки на
объекты. Объявление_переменных не должно содержать определение констант.
Реальное объявление составляющих переменных типа данных должно идти без указания
опции области видимости (LotusScript автоматически присваивает им опцию типа Public).
Объявление каждой переменной члена класса типа данных начинаться с новой строки
(т.о. запрещается давать объявление переменных в виде списка, элементы которого
разделяются запятыми). Имена переменных членов пользовательского типа данных могут
совпадать с зарезервированными ключевыми словами, за исключением: Rem. Авторы
рекомендуют не применять данное правило па практике, хотя бы из соображени й
"читабельности" скрипта.
© Inter Trust Co. Тел. (095) 9567
Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java
217
Если в пользовательский тип данных входит как компонент другой определяемый пользователем тип данных,
то последний должен быть объявлен раньше, чем текущий тип данных, В противном случае на шаге компиляции
генерируется сообщение об ошибке: "Reference appears before declaration" (ссылка появилась перед объявлением).
Для экземпляра пользовательского типа данных, содержащего переменные Variant, имеющие значения не
скалярных типов данных (массивы, списки и объекты), должны соблюдаться следующие правила:
• запрещается присваивать содержимое типа, в составляющих которого имеются
динамические массивы или списки, другому экземпляру типа;
• запрещается записывать содержимое типа, в составляющих которого имеются
динамические массивы, списки или объекты, в файл с использованием оператора Put;
• разрешается присваивать содержимое типа, в составляющих которого имеются объекты,
другому экземпляру типа. LotusScript автоматически увеличит на единицу счетчик числа
ссылок на объект.
При объявлении переменной с типом соответствующим пользовательскому типу данных происходит
инициализация переменных членов экземпляра типа. Начальные значения, входящих в тип переменных, аналогичны
одиночным переменным того же типа (числовые -О, Variant - Empty, и т.д.). Если в пользовательский тип данных
входит другой определяемый пользователем тип, то процесс инициализации повторяется и для него.
Для операций со значениями членов пользовательского типа данных применяют следующий синтаксис:
имя_экземпляра_типа, имя_члена_типа
В данном контексте допускается любое число пробелов и табуляций и справа, и слева от символа точки. Если
значение члена типа есть массив, то разрешается указывать индексы в имени_члена_типа.
Для оптимизации пространства, занимаемого экземпляром пользовательского типа данных, рекомендуется
при создании описания типа данных составляющие размешать в порядке убывания их размера в байтах. Т.е.
самые большие в самом верху описания, а наименьшие внизу. При равенстве размеров порядок безразличен.
Пример. Демонстрирует применение пользовательских типов данных.
Type Department
Name As String *
Town As String * End Type Type People
Fio As String * 32
Job As String * 16
s
Salary As Currency
Dept As Department Jnd Type
Dim Deptl As Department, Pepll As People Dim FileNum As Integer
•;i^!um% = Free File
"C:\People.txt" For Random As FileNum% Len^Len( Pepll ) Deptl.Name = "Отдел
продаж" Ceptl.Town = "Москва" Pepll. Fio = "Иванов И. И . "
© InterTrust Co. Тел. (095) 9567928
Язык LotusScript
218
Pepll.Job = "Продавец"
Pepll.Salary = 1234.56
Pepll.Dept = Deptl Put
#F.ileNum°6, 1, Pepll
Deptl.Name = "Администрация"
Deptl. Town =- "Лондон"
Pepll.Fio = "Джон Смит"
Pepll.Job = "Президент"
Pepll.Salary = 9999.99
Pepll.Dept = Deptl Put
#FileNum%, 2, Pepll Seek
'перемещаем указатель на начало файла
fileNum°6, 1 Do While Not
'цикл пока в файле есть записи
Eof( fileNum% ) Get
'считываем запись, указатель файла
#fileNum%, , Pepll
'позиционируется на следующую запись
Pepll
.
Job, Pepll. Salary', ' Pepl1.Dept.Town
Print Pepll.Fio,
'печатаем необходимые показатели записи
Pepll.Dept.Name,
FileNum%
© Inter Trust Co. Тел. (095) 9567928
Lotus Domino R. 5: (w-формулы, LotusScript, встроенные классы LotusScript и Java
219
2.8. Встроенные операторы и функции LotusScript
2.8.1. Числовые и тригонометрические функции 2.8.1.1.
Числовые функции
Функция Abs (абсолютное значение)
Abs (numExpr)
:
numExpr - числовое выражение.
;
- /__
' *' ~"
*" . '
Возвращаемое значение: абсолютное значение выражения numExpr. Тип данных возвращаемого
значения тот же, что и у выражения numExpr, если только выражение numExpr не имеет тип Variant.
Если тип numExpr Variant, то действуют следующие правила:
• Если значением выражения numExpr является строка, то LotusScript преобразует ее в
число, типа Double.
(_.
* Если значение выражения numExpr строка и не может быть преобразовано в число, то
результатом выполнения оператора Abs будет возникновение ошибки с кодом 13 - «Туре
mismatch».
« Если выражение numExpr имеет значение NULL, то и результат функции Abs тоже NULL
Пример. Вычисление абсолютных значений.
выводит
выводит
выводит
выводит
12
12
12
'
INTEGER
Dim someV As Variant someV = "123"
Print Abs (someV) someV - Null
' выводит 123
' int Abs(someV) someV = "qwerty" Print
Abs(someV)
' выводит Null
(^,.—
Функция Ехр
Exp ( numExpr )
с
' Ошибка
«Tyjoe mismatch»
I
Вычисляет значение е в степени, равной значению числового выражения numExpr. Если значение выражения
numExpr превышает 709,78, то возникает ошибка переполнения (ошибка с кодом 6 - «Overflow»). Тип
возвращаемого значения - Double. Exp - функция, обратная
функции Log.
Пример.
Prints 2.71828182845905
Prints 7.38905609893065
Ошибка «Overflow»
© Inter Trust Co. Тел. (095) 95679
220
Функция Fix (выделить целую часть)
Fix ( numExpr)
Возвращает значение целой части числового выражения numExpr. Тип
возвращаемого значения определяется типом выражения numExpr.
Следующая таблица определяет тип возвращаемого значения в зависимости от типа значения
выражения numExpr.
Возвращаемое значение
numExpr
Null
Null
Variant, содержащее строку, определяющую число
Double
Variant, содержащее строку, не определяющую
число
Возникает ошибка
Variant, содержащее значение дата-время
Часть, определяющая дату
Для неотрицательного значения выражения
numExpr, функция Fix возвращает
ближайшее целое число, меньшее или равное значению выражения. Для отрицательного
значения выражения numExpr функция Fix возвращает ближайшее целое значение, большее
или равное значению аргумента. Другими словами, берется целая часть модуля числа и
: .......................................................................
дополняется знаком. " >;"•
Результаты выполнения функций Fix и hit различаются между собой. Значение, возвращаемое
функцией Int, всегда меньше или равно аргументу.
Пример. Использование функций Fix и Int.
Dim xF As Integer,
Dim xT As integer,
xF% = .Fix( - 9 8 . 8 )
yF% - Fix( 9 8 . 2)
xT% = Int(-98. 8 )
yT% = Int ( 9 8 . 2)
Print xF%; yF%
1
выводит:
1
-98 98
Print xT%; yT%
' выводит:
' -99 98
yF As Integer
yT As Integer
-•
.
Функция Fraction (выделить дробную часть)
Fraction ( numExpr )
Возвращает дробную часть числового выражения numExpr.
Тип данных значения, возвращаемого функцией Fraction, соответствует типу данных числового
выражения numExpr.
Следующая таблица определяет тип возвращаемого значения в зависимости от тип а значения
выражения numExpr.
© InterTrust Co. Тел. (095) 9567928
Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java
221
Возвращаемое значение
numExpr
Значение типа Integer
0 (нет дробной части)
Null
Null
Variant, содержащее строку, определяющую число
Double
Variant, содержащее строку, не определяющую
число
Возникает ошибка
Variant, содержащее значение дата-время
Часть, определяющая время
Пример. Вывод дробной части числа PI
Print Fraction (PI)
Dim someV As Variant
someV = 123.456
Print Fraction (someV)
someV = "123, 456"
Print Fraction(someV),
'
выводит:
' выводит:
.141592653589793
.456
Typename(Fraction(someV))
' выводит: . 4 5 6
DOUBLE
Print Fraction(Now)
' выводит: 1 9 : 3 2 : 0 5
someV = "qwerty" • int Fraction(someV)
' Ошибка
«Type mismatch»
Функция Hex (преобразовать в 16-ричный вид)
Hex[S] (numExpr)
Возвращает шестнадцатиричное представления числового выражения numExpr в виде
строки. Если значением numExpr является число с дробной частью, то это число округляется до
ближайшего целого значения перед преобразованием в 16-ричную форму. Значение,
возвращаемое функцией Hex, имеет тип Variant, содержащий строку (Variant DataType 8).
Значение, возвращаемое функцией Нех$ имеет тип String. Возвращаемое значение может
содержать только символы 0-9иА-Еи его максимальная длина - 8 символов.
Если значение выражения numExpr не является значением типа Integer или Long, то
LotusScript пытается преобразовать это значение к типу Long. При невозможности выполнить
преобразование типа LotusScript выдает ошибку с кодом 6 - «Overflow».
Пример 1. Преобразование типа аргумента из типа Double в тип Long.
' выводит "F"
' выводит "F" '••'" -'••''•• -.•>-•:'••-•• •- - ••••
Пример 2. Округление знамения аргумента типа Double, приведение типа аргумента к типу Long
(значение, равное 14.841, округляется до 15.0, преобразуется в 15).
' выводит "F"
. :... i •.. :.: '• } • - • . • •
' выводит "F"
; • »- -,_.-.-..-• . • . . -
Пример 3. Переполнение
. ..
;
ошибка
;"
" - .- .- ..:,,...-.'
. '
:
.•
:
.
, ,.:
• • . . - .
«Overflow»
© InterTrust Со. Тел. (095) 9567928
Язык LotusScript
222
Функция Int (ближайшее целое)
Int ( numExpr)
Возвращает ближайшее целое значение числового выражения numExpr, меньшее или
равное его исходному значению. Тип данных выражения numExpr определяет тип данных
значения, возвращаемого функцией. Если аргумент не является числовым:
Возвращаемое
значение
numExpr
Null
Null
Variant. содержащее строку, интерпретируемую, как число
Double
Variant, содержащее строку, не интерпретируемую, как
число
Ошибка «Type mismatch»
Значение, возвращаемое функцией Int, всегда меньше или равно значению выражение;:
numExpr. Для отрицательного аргумента результаты функции Fix и Int отличаются (Fix
просто отбрасывает дробную часть в значении выражения numExpr).
Пример. См. пример использования функции Fix.
Функция Log (натуральный логарифм)
Log ( numExpr )
Возвращает значение натурального логарифма числа, являющегося значением выражения
numExpr. numExpr - положительное, числовое выражение. Функция Log возвращает значение
типа Double.
Пример. Логарифм по основанию, отличному от натурального
' Функция вычисления логарифма числа по основанию 10
Function LoglO (inVal As Single) As Single
LoglO = Log(inVall)- / Log ( 1 0 )
End Function
Print LoglO(lO)
.-.
.
' Выводит: 1
Print LoglO(100)
- .'
' Выводит: 2
Print LoglO (1 / 100)
... -'.
. ' Выводит: -2
Print LoglO( 1 )
' Выводит: О
Оператор Randomize (инициализация генератора случайных чисел)
Randomize [ numExpr ]
.
Выполняет начальную установку (инициализацию) генератора случайных чисел перед
его вызовом (функция Rnd). Параметр numExpr - числовое выражение. Если оно пропущено,
используется значение, возвращаемое функцией Timer.
Данная функция обязательно должна быть вызвана перед первыми вызовами функции
Rnd.
Генератор случайных чисел LotusScript на самом деле является генератором
псевдослучайных последовательностей. Если генератор инициализируется каждый раз одним
и тем же числом, то результатом последовательного вызова функции Rnd является одна и та
же последовательность чисел. Для того, чтобы последовательности были разные необходимо
© InterTrust Со. Тел. (095) 9567928
Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 223
либо самостоятельно позаботиться о «случайности» инициализирующего числа, либо
вызывать функцию Randomize без аргумента и, тем самым, использовать значение
системного таймера.
Функция Rnd (генерация случайного числа)
,
Rnd[ ( numExpr ) ]
,
*"* * ' ' " "
Генерирует значение случайной величины, равномерно распределенной в интервале от О
до 1. Параметр numExpr - числовое выражение. Возвращаемое функцией значение является
числом типа Single.
'
•
.....
: ,..-,-..
,
Следующая таблица демонстрирует действие функции Rnd, в зависимости от знака
выражения numExpr.
Знак numExpr
Действие Rnd
Положительный
Возвращает следующее случайное число из генерируемой
последовательности .
Нуль ( 0 )
Возвращает последнее сгенерированное случайное число.
Отрицательный
Генератор случайных чисел повторно инициализируется
значением numExpr, Rnd возвращает первое число из
соответствующей последовательности случайных чисел.
Для начальной установки данных для оператора генерации случайных чисел Rnd
используется оператор Randomize. Для вызова оператора Rnd без аргументов можно
использовать одну из двух форм записи: Rnd или Rnd( ).
Пример 1. Генерация случайных чисел с использованием и без использования оператора
Randomize перед вызовом оператора Rnd.
,_.,.,
Randomize -I
*
Print Rnd ( ) ; Rnd () ; Rnd ( ) ; Rnd ( ) ; Rnd (}
. '
'
" '" '
' ,•,.;-..,••
1 Выводит:
; -"''!"
,8870306
,6543303
,3679346
,3214847
1, 6877 68E--02
Randomize -1
Print Rnd(O)
•
•'••'•'
' Выводит: ,8886549
- - • • ; ; • ' :' '- v- • ' ;' -^'*'-i •' ^-•-• •:- • '"•" •
Print Rnd () ; Rnd () ; Rnd () ; Rnd () ; Rnd { )
'Выводит: ,8870306
,6543303
,3679346
,3214847
1,687768E-02
Print
Rnd(-l)
' Выводит: ,8886549
Print Rnd ( - 2 ) ; Rnd(O)
1 Выводит: ,7773098
,7773098
•
-,
:
.-
.
:, . - . - - - .
,
;•
v
- - :.
•-..,-•-•
.-•.;:•
••-
C
-
•.. .,; . •: •.-,-, -.-.
•• • -•...,,•..::.-••:---..••
. - , , . . .,--..-:' - . . • . ; : . . .
Пример 2. Альтенатива обычному генератору случайных чисел. Левая половина уникального
идентификатора документа Notes (UNID) является случайным числом. Опыт показывает, что
одинаково равномерно распределены все части первой половины UNID - и все 16 символов, и первые
8, и вторые 8, и вторые 4 и т.д. Далее приводятся графики с распределениями случайных чисел,
полученных с помощью функции RndQ и из UNID. Как видно из графиков, составляющие уникального
идентификатора документа являются достойной альтернативой стандартному генератору случайных
чисел.
В примере измерены 10000 исходов, полученных следующими способами:
' Случайное число от 0 до 255 как результат
value = Round (Rnd*255, 0)
' Случайное число от 0 до 255 из 1-го байта
value - Abs(Val("&H"+Left$(doc.UniversallD,
функции Rnd()
(первые 2 символа)
2)))
UNID
© InterTrust Co. Тел. (095) 9567928
Язык LotusScript
224
Графики - диаграммы Excel 97. Огибающие - линии тренда (скользящее среднее).
Распредел ение сл учайных чисел (функция Rnd)
i
Распределение случайных чисел, полученных вызовом Rnd()
Распределение случайных чисел - первого байта (первые два символа) уникального
идентификатора документа
Функция Round (округлить число)
Round ( numExpr , places )
Округляет число до указанного количества десятичных цифр после запятой. Первый
параметр numExpr - округляемое число - числовое выражение. Второй параметр places числовое выражение, определяющее количество значащих цифр в числе после округления.
Если значение этого выражения не является целым числом, то оно преобразуется в целое
число. Функция Round возвращает значение типа Double.
:
Если первый незначащий разряд исходного числа равен 5, и все следующие за ним
разряды числа равны 0, то последний значащий разряд округляется до ближайшего четного
значения. Если places - отрицательное число, то исходное число округляется до числа,
1;
представляемыми цифрами слева от десятичной точки. •
/
Пример 1. Округление до одной цифры после десятичной точки,
Print Round ( 4 . 23, 1) ••••.'•••":• -•• • ? . • > . . • ' • • ' Выводит 4 . 2
Print Round( 4 . 35, 1)
.
.
' Выводит 4 . 4
Print Round ( 4 . 4 5,
1)
.,.,. '
© InterTrust Co. Тел. (095) 9567928
'.
' Выводит 4 . 4
Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java
225
Пример 2. Округление до целого значения,
' Выводит 200
Print Round (15 3 . 3 3 , - 2 )
Функция Sgn (Знак числа)
Sgn ( numExpr )
Определяет знак числа, заданного числовым выражением numExpr. Если numExpr
меньше 0, возвращает -1, равно 0 - возвращает 0, больше 0 - возвращает 1.
Пример, Использование функции Sgn для определения знака числа.
-: As Integer,
Sqn(-45)
!;г :.:'•; •.
Sun( 1 2 )
•
у*
'. Sgn(x% + у%)
у As Integer
- • •
' .
,
'
Выводит -1
--
,•••...-.
•
' Выводит 1
' Выводит О
Функция Sqr (квадратный корень)
.
.....
.
.....
:........
Sqr ( numExpr)
Возвращает значение квадратного корня, извлеченного из значения неотрицательного
числового выражения numExpr. Возвращаемое значение имеет тип Double. Если numExpr
отрицательно, происходит выдается ошибка с кодом 5 - «Illegal function call».
Пример. Извлечение квадратного корня из числа 169.
Г.-.v 'root As Double
'•• = Sqr (1 69)
root#
•
' Выводит 13
Функция Val (преобразовать строку в число)
Val (stringExpr)
Возвращает числовое значение строки. Параметр stringExpr - строковое выражение,
которое LotusScript может преобразовать в числовое значение. Это выражение может
содержать следующие символы:
•
•
•
•
•
цифры ( 0 1 2 3 4 5 6 7 8 9 ) ;
., - .
шестнадцатеричные цифры (a b с d e f А В С D E F);
знак числа (+ -);
десятичную точку (.);
экспоненциальные символы (E, e, D, d);
•
^
(
;
• префикс числа, не являющегося десятичным числом (&В, &О, &Н);
• символы - суффиксы типа (% & ! # @)
*
?
/
Возвращаемое значение имеет тип Double.
Функция Val игнорирует пробелы, символы табуляции, возврата каретки и перевода
строки. Преобразование производится, начиная с первого символа и заканчивается на первом
символе, не входящем в приведенный список.
Для строки, не допускающей интерпретации как число, функция возвращает 0.
© InterTrust Co. Тел. (095) 9567928
226
Пример.
Dim hexVal As Double, streetNum As Double
'Присвоение шестнадцатиричного числа FF (десятичное 255),
hexVall = Val("&HFF")
streetNum# - Val("
106 Main St.")
Print hexVal#; streetNum#
' Выводит: 255 106
Print Val("ql2w")
.
' Выводит: О
2.8.1.2. Тригонометрические функции
Следующая таблица представляет набор тригонометрических функций LotusScript.
Функция
Синтаксис
Примечание
Арккосинус
ACos ( numExpr )
Возвращает значение угла выраженное в радианах.
Арксинус
ASin ( numExpr )
Возвращает значение угла выраженное в радианах
Арктангенс
ATn ( numExpr )
Возвращает значение угла выраженное в радианах
Арктангенс2
ATn2( numExprX,
numExprY )
Возвращает значение угла выраженное в радианах,
образованного осью абсцисс и прямой, проходящей
через заданную координатами точку и точку начала
координат в декартовой плоскости
Косинус
Cos (angle )
Значение косинуса угла, имеющее тип Double
Синус
Sin ( angle )
Значение синуса угла, имеющее тип Double
Тангенс
Tan ( angle )
Значение тангенса угла, имеющее тип Double
При вычислении тригонометрических функций значения угла задаются и вычисляются в
радианах. Функции не производят преобразование значений градусной меры угла в радианы.
Но подобное преобразование всегда может быть выполнено с помощью встроенной
константы — PI: <угол в градусах> = <угол в радианах> * 1 80 / PI
Примеры.
Dim rad As Double, degrees As
rad# = ACos(O)
degrees^ = rad# * (180 /PI)
Print' rad#; degrees*
Double
' получает значение PI/2
' получает значение 90
' Выводит 1.5707963267949
Dim quadl#, quad2#, quad3#, quad4#
quad1# = ATn2 (1,1)
quad2# = ATn2(-l, 1)
quad3# = ATn2(-l, -1)
quad4# - ATn2
Print quadl#
Print quad2#
Print quad3#
Print quad4#
(1, -1)
* (180 / PI)
* (180 /PI)
* (180 / PI)
* (180 / PI)
© InterTrust Co, Тел. (095) 9567928
r.
-
/
(
Выводит
Выводит
Выводит
Выводит
45
135
-135
-45
90
Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java
227
2.8.2. Функции преобразования типов данных
Функция CCur
CCur(expr)
Возвращает значение, преобразованное к денежному типу данных (Currency). Параметр
ехрг - числовое выражение или строковое выражение, которое может быть преобразовано в
число.
Возвращаемый результат: числовое значение выражения ехрг с 4-мя десятичными
знаками после десятичной точки, представляющее денежное значение.
Если ехрr является строковым выражением, то функция CCur предварительно
преобразует строку в число. Если значение строкового выражения ехрr не преобразуется в
число, либо значение слишком велико для типа данных Currency, то функция возвращает
ошибку (код 13 - «Type mismatch» и код 6 - «Overflow» соответственно).
Пример. Преобразование к типу Currency значения произведения переменных bulkPrice# типа
Double и unitsSold% типа Integer. Преобразование к типу Currency значения переменной labelPrice$,
имеющей тип String.
Dim bulkPrice As Double
Dim labelPrice As String
'
Dim unitsSold As Integer
Dim paymentDue As Currency
bulkPrice# = 11.400556
.
unitsSold% = 57
paymentDue@ = CCur (bulkPrice# * unitsSold%)
Print paymentDue@
,
labelPrice$ = "12, 99"
payment Due@ = CCur (labelPrice$ ) * unitsSold%
Print paymentDue@
labelPrice$ = "12. 99"
paymentDue@ = CCur (labelPrice$) * unitsSold%
,
:
,,
-
•
' Выводит 649.8317
' Выводит 7 4 0 . 4 3
' Ошибка «Type mismatch»
CDat (expr)
,j
Для числового или строкового выражения ехрг функция возвращает его значе ние,
преобразованное в формат даты-времени. Параметр ехрг может быть любым из следующих
выражений:
• числовое выражение;
• строковое выражение, допускающее преобразование к числовому; ^
• строковое выражение, допускающее преобразование к дате-времени.
Возвращаемое значение является значением даты/времени в формате LotusScript. Тип
возвращаемого значения - Variant, содержащее дату/время (Variant DataType 7). Если целая
часть значения выражение выходит за пределы диапазона от -657434 до 2958465, функция
CDat выдает ошибку.
CDat(O) и CDat(Empty) возвращают полночь 30-го декабря 30 1899 года. При выводе этот
результат представляется как «0:00:00» (в предыдущих версиях выводилось как 30.12.1899).
LotusScript хранит дату как 8-байтные значения с плавающей точкой. Целая часть
представляет порядковый номер дня начиная от 1 -го января 100 года н.э.. Допустимый
© InterTrust Co. Тел. (095) 9567928
Язык LotusScript
228
диапазон значений для целой части: от -657434 до 2958465. Таким образом, максимально
возможной датой в LotusScript является 31 декабря 9999 года н.э. Дробная часть значения
отвечает за представление времени. Отсутствие дробной части - полночь.
В зависимости от значения выражения ехрr используются следующие
преобразования в значение дата-время:
правила
• если ехрг - числовое выражение, то LotusScript преобразует целую часть в дату, а
дробную - в формат времени, возвращая значение дата/время;
^
* если ехрг — строковое выражение, то LotusScript пытается выполнить преобразование из
предположения, что строка задает либо "человеческое" представление даты/времени
(преобразование производится сразу), либо допускает преобразование в число (тогда к
дате/времени преобразуется число, полученное после преобразования строки);
« если ехрг - строковое выражение, но преобразование значения выражения к числу или
дате/времени невозможно - выдается ошибка (код 13 — «Type mismatch»).
Пример. Преобразование числа 36275.3289 и строки "April 25, 1999" в значение дата-время
формате LotusScript.
Dim dateV As Variant
' Преобразование числа в дату/время
dateV = Cdat(36275.3289)
' Форматирование даты и времени
Print Format?(dateV, "Medium Date"), Format$(dateV, "Medium Time")
1 Выводит 25-Apr-95
07:53 AM
' (Отличается от национальных настроек V результат отвечает устройству функции форматирования)
' Преобразование даты обратно в число
Print Cdbl(dateV)
Выводит 36275.3289
' Преобразование текстового представления в дату Print
Cdat("April 25, 1999")
' Выводит 25.04.99
Print Cdat(-l), Cdat(O), Cdat(l)
29.12.1899
0:00:00
1
Выводит
' Ошибка «Type mismatch»
Функция CDbl
CDbl ( expr)
'
Возвращает значение .выражения ехрг, приведенное к типу Double. Параметр ехрг • числовое
выражение или строковое выражение, которое может быть преобразовано в число.
Если выражение ехрг является строковым выражением, то LotusScript преобразует его i число,
включая и дробную часть. Если преобразование строки в число невозможно ш| значение ехрг
превышает допустимый для данных типа Double диапазон значений) происходит ошибка («Type
mismatch» или «Overflow» соответственно). При преобразовании строки функция CDbl отличается от
функции Val. Val исследует строку слева направо дот пор, пока не встретит недопустимый
символ, и возвращает число, полученное «правильной» части строки. CDbl требует
«правильности» строки целиком.
© InterTrust Co. Тел. (095) 9567928
Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java
229
CDbl(Empty) возвращает О.
Пример. Преобразование суммы двух значений типа Single в значение типа Double.
' Преобр. суммы 2-х значений типа Single в значение типа Double
Dim x As Single, y As Single
Dim result As Double
__,
x! = 11.06E23
' , . . ' .
у! = 6.02Е23
result! = Cdbl(x! + y ! ) .
c~
Print result*
' Выводит 1.70800003057064E+24
Print Cdbl(Empty)
' Выводит О
Print Val("lq2")
' Выводит 1
"
Print Cdbl("lq2")
' Ошибка «Type mismatch»
<
ч
/
Функция CInt
Clnt(expr)
Возвращает числовое значение выражения ехрг, приведенное к типу Integer округлением до
ближайшего целого значения. Параметр ехрг - числовое выражение или строковое выражение,
которое LotusScript может преобразовать в число.
Если выражение ехрг является строковым выражением, то функция CInt возвращает число,
соответствующее значению строки, преобразованному в число, округленное до ближайшего целого
значения. Если преобразование строкового значения выражения ехрг в число невозможно, то
происходит ошибка («Type mismatch»). Если значение выражения ехр выходит за пределы допустимых
значений диапазона для типа Integer, происходит ошибка («Overflow»).
Функция Clnt(Empty) возвращает 0.
Пример 1. Преобразование значение х типа Currency в значение типа Integer.
'Выводит
13
Пример 2. Отличие от функции Fix
г
См. пример к функции Fix на стр. 220
Функция CLng
CLng(ехрг)
Возвращает значение выражения ехрг, преобразованное к типу Long округлением до ближайшего
целого значения. Параметр ехрг - числовое или строковое выражение, которое
LotusScript может преобразовать в число.
Если выражение ехрг является строковым выражением, то функция CLng возвращает число,
представленное строкой, округленное до ближайшего целого. Если преобразование строки в число
невозможно или значение выражения выходит за пределы типа Long, происходит ошибка («Type
mismatch» или «Overflow» соответственно).
Функция CLng(Empty) возвращает 0.
' '
Пример. Преобразование значение типа Double в значение типа Long
Dim x As Double
:•;» = 123456789.400556
Print CLng(x#)
'В ыво дит
1 23456789
''
© InterTrust Co. Тел. (095) 9567928
Язык LotusScript
230
Функция CSng
CSng (expr)
Возвращает значение выражения ехрг, приведенное к типу Single. Параметр ехр: числовое или
строковое выражение, которое может быть преобразовано в число.
Если выражение ехрг является строковым выражением, то функция CSng возврат число,
представляемое этой строкой, включая и дробную часть. Если преобразование строк, в число
невозможно или значение выражения ехрг выходит за пределы значений данных™ Single, происходит
ошибка («Type mismatch» или «Overflow» соответственно).
Функция CSng(Empty) возвращает 0.
Пример. Преобразование значение типа Double в значение типа Single.
Dim x As Double
x# = 1.708000030570G4E+24
Print CSng(x#)
'Выводит 1.708Е+24
Функция CStr CStr (
expr )
Возвращает значение выражения expr, преобразованное к типу String, expr - может С строковым,
числовым выражением или выражением типа дата/время.
Функция CStr(Empty) возвращает пустую строку ("").
Пример. Числовые значения х% = 1 и у% = 2 суммируются, и результат преобразуются к String.
«Сложение» строк - конкатенация строк.
Integer
Print CStr(x% + y%)
Print CStr(x%) + CStr(y%)
' Выводит 3
'
' Выводит 12
Функция CVar
CVar (expr)
Возвращает значение выражения ехрг, приведенное к типу Variant.
Пример. Функция Abs оперирует с числовыми аргументами или аргументами типа Variant Строковое
значение преобразуется значение типа Variant. Использование функции Abs для строкового типа вызывает ошибку.
Dim gNum As String
qNum$ - "-1"
Print Abs(CVar(gNum$))
Print Abs(qNum$)
' Выводит 1 (абсолютное значение -1)
' Ошибка «Type mismatch»
Функция DataType
DataType ( expr)
Возвращает числовой код типа значения выражения ехрr. Следующая таблица определят; возможные
типы возвращаемых значений.
© InterTrust Co. Тел. (095) 9567928
Тип значения
Возвращаемое
значение
Константа
Примечание
Только для Variant
Только для Variant
0
1
Empty
Null
V Empty
'V_Null
2
Integer
V_INTEGER
3
4
Long
Single
V_LONG
V_SINGLE
5
Double
V_DOUBLE
6
Currency
V_CURRENCY
7
8
9
V DATE
V STRING
V DISPATCH
Только для Variant
10
11
Date/Time
String
OLE-объект или значение ссылки,
равное Nothing
OLE - ошибка
Boolean
V ERROR
V BOOLEAN
Только для Variant
Только для Variant
12
Variant (список или массив)
V_VARIANT
13
IUNKNOWN (значение OLE)
V_IUN KNOWN
34
V_LSOBJ
35
Объект определенного
пользователем класса
Созданный объект
2048
8192
Список
Фиксированный массив
8704
Динамический массив
с~
Только для Variant
Только для Variant
V_PRODOBJ
Файл LSCONST.LSS содержит определения констант, представленные в таблице. Чтобы использовать
символьные константы, а не числовые значения, необходимо, используя директиву %lnclude, подключить файл
LSCONST.LSS.
Если аргумент для функции DataType является списком или массивом, возвращается значение, равное сумме
двух значений: первое значение представляет тип массива или списка, второе - тип данных элементов массива или
списка. Например, для фиксированного массива типа Integer это значение равно 8194 (8192+2), а для списка
типа Variant это значение равно 2060 (2048+12).
Пример
Dim item(5) As Variant. Объявляем фиксированный массив Variant
Dim itemWeight As Single
Dim itemName As String
itemWeight! = 2.7182
jtem,Name$ = "Банан"
i t e m ( 1 ) = itemWeight!
item(2) = itemName$
Print Datatype (item (1))
Выводит 4
© InterTrust Co. Тел. (095) 9567928
Язык LotusScript
Print Datatype(item(2)) '
Выводит 8
Print Datatype(item(3)) ‘Выводит О(элементы Variant, массива инициализированы
значением EMPTY)
232
Dim but As Button Объект класса продукта
Print Datatype(but) Выводит 35
Set but2 = cells
Print Datatype(but2) Выводит 35
Dim areas (3) As Button
Массив объектов Button
Print Datatype(areas) '
Выводит 8227 (8192 + 35)
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
PrintDatatype(misc)' Выводит 2.060 (2048 + 12)
Функция TypeName
TypeName ( expr )
Возвращает строку, определяющую тип выражения expr. определяется согласно следующей
таблице.
Возвращаемое значение
Значение expr
Empty
Возвращаемое значение
"Empty"
Примечание
Только
Variant
Null
"Null"
Integer
"INTEGER"
Long
"LONG"
Single
"SINGLE"
Currency
"CURRENCY"
Date
"DATE"
Только
Variant
Только
Variant
String
"STRING"
Nothing
"OBJECT"
OLE object
"OBJECT"
OLE error
"ERROR"
Boolean
"BOOLEAN"
Только
Variant
Только
Variant
Только
Variant
© InterTrust Co. Тел. (095) 9567928
Download