Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/94: Рейтинг темы: голосов - 94, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 09.12.2012
Сообщений: 101

Enumeration В Lotusscript

24.04.2013, 16:23. Показов 18714. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!
Продолжаю скромные попытки расширить возможности разработки на LS. На сей представляю на суд общественности прототип реализации enumeration.
P.S. идея была взята отсюда

.SpoilerTarget">Спойлер: Раскрывающийся Текст


LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
%REM
Library EnumerationLibrary
Created Apr 25, 2013 by Administrator Administrator
Description: Comments for Library
%END REM
Option Public
Option Declare
 
%REM
Type SafetyType
Description: Comments for Type
%END REM
Private Type SafetyType
foo As Boolean
End Type
 
Private safetyObject As SafetyType
 
%REM
Class EnumerationObject
Description: Comments for Class
%END REM
Public Class EnumerationObject
Private enumName As String
 
%REM
Sub New
Description: Comments for Sub
%END REM
Sub New(safetyType As SafetyType, enumName As String)
me.enumName = UCase(enumName)
End Sub
 
%REM
Function toString
Description: Comments for Function
%END REM
Public Function toString() As String
toString = me.enumName
End Function
 
End Class
%REM
Class Fruit
Description: Comments for Class
%END REM
Public Class Fruit
Private enumApple As EnumerationObject
Private enumPeach As EnumerationObject
Private enumOrange As EnumerationObject
 
%REM
Sub New
Description: Comments for Sub
%END REM
Sub New(safetyType As SafetyType)
 
End Sub
 
%REM
Property Get APPLE
Description: Comments for Property Get
%END REM
Property Get APPLE As EnumerationObject
If me.enumApple Is Nothyng Then
Set me.enumApple = New EnumerationObject(safetyObject, "Apple")
End If
Set APPLE = me.enumApple
End Property
 
%REM
Property Get PEACH
Description: Comments for Property Get
%END REM
Property Get PEACH As EnumerationObject
If me.enumPeach Is Nothyng Then
Set me.enumPeach = New EnumerationObject(safetyObject, "Peach")
End If
Set PEACH = me.enumPeach
End Property
 
%REM
Property Get ORANGE
Description: Comments for Property Get
%END REM
Property Get ORANGE As EnumerationObject
If me.enumOrange Is Nothyng Then
Set me.enumOrange = New EnumerationObject(safetyObject, "Orange")
End If
Set ORANGE = me.enumOrange
End Property
 
End Class
%REM
Class Fruit
Description: Comments for Class
%END REM
Public Function Fruit() As Fruit
Static sFruit as Fruit
If sFruit Is Nothyng Then
Set sFruit = New Fruit(safetyObject)
End If
Set Fruit = sFruit
End Function
Пример использования:

.SpoilerTarget">Спойлер: Раскрывающийся Текст


LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
%REM
Agent test
Created Apr 25, 2013 by Administrator Administrator
Description: Comments for Agent
%END REM
Option Public
Option Declare
Use "EnumerationLibrary"
Sub Initialize
Call translate(Fruit().ORANGE)
End Sub
 
Sub Terminate
 
End Sub
 
%REM
Sub translate
Description: Comments for Sub
%END REM
Private Sub translate(e As EnumerationObject)
If e Is Fruit().APPLE Then
MsgBox "Яблоко"
ElseIf e Is Fruit().PEACH Then
MsgBox "Персик"
ElseIf e Is Fruit().ORANGE Then
MsgBox "Апельсин"
End If
End Sub
Новая реализация enumeration, в которой следующие изменения:
1) Добавления абстрактных классов: "Контейнер элементов enum", "Элемент enum"
2) Элементы enum пересены в list
3) По замечанию Imike, инициализация всех элементов происходит в самом начале
4) Из предыдущего пункта следует, что теперь есть возможность итерировать по всем элементам enum

.SpoilerTarget">Спойлер: Раскрывающийся Текст


Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
%REM
Library EnumLibrary
Created Jun 20, 2013 by AdminKz
Description: Comments for Library
%END REM
Option Declare
%REM
Type SafetyType
Description: Comments for Type
%END REM
Private Type SafetyType
foo As Boolean
End Type
 
Private safetyType As SafetyType
Private Const ERROR_CALLING_ABSTRACT_METHOD = "ERROR_CALLING_ABSTRACT_METHOD"
%REM
Class AbstractEnum
Description: Абстрактный класс, для получения доступа к элементам enum
%END REM
Public Class AbstractEnum
Список элементов enum
Public entries List As AbstractEnumEntry
 
%REM
Sub New
Description: "Приватный" конструктор
%END REM
Sub New(safetyType As SafetyType)
End Sub
 
Sub Delete
Erase entries
End Sub
 
%REM
Function createEntry
Description: Абстрактный метод
%END REM
Private Function createEntry(enumName As String) As AbstractEnumEntry
Error 1, ERROR_CALLING_ABSTRACT_METHOD
End Function
 
%REM
Function getEntry
Description: Возвращает элемент enum по наименованию вызывающей функции
%END REM
Private Function getEntry() As AbstractEnumEntry
Dim enumName As String
enumName = LSI_Info(12)
 
If Not isElement(entries(enumName)) Then
Set entries(enumName) = createEntry(enumName)
End If
 
Set getEntry = entries(enumName)
End Function
 
End Class
%REM
Class AbstractEnumEntry
Description: Абстрактный класс элемента enum
%END REM
Public Class AbstractEnumEntry
Private enumName As String
 
%REM
Sub New
Description: "Приватный" конструктор
%END REM
Sub New(safetyType As SafetyType, enumName As String)
me.enumName = UCase(enumName)
End Sub
 
%REM
Function toString
Description: Наименование элемента enum
%END REM
Public Function toString() As String
toString = me.enumName
End Function
 
End Class
%REM
Class ColumnTypeEntry
Description: Comments for Class
%END REM
Public Class ColumnTypeEntry As AbstractEnumEntry
 
%REM
Sub New
Description: "Приватный" конструктор
%END REM
Sub New(safetyType As SafetyType, enumName As String)
End Sub
 
End Class
%REM
Class ColumnType
Description: Comments for Class
%END REM
Public Class ColumnType As AbstractEnum
 
%REM
Sub New
Description: "Приватный" конструктор
Инициализация всех элементов enum
%END REM
Sub New(safetyType As SafetyType)
Call ICON()
Call CHECKBOX()
End Sub
 
%REM
Function createEntry
Description: Переопределенный метод, возвращающий конктретный тип элемента enum
%END REM
Private Function createEntry(enumName As String) As AbstractEnumEntry
Set createEntry = New ColumnTypeEntry(safetyType, enumName)
End Function
 
%REM
Function ICON
Description: Иконка
%END REM
Public Function ICON() As ColumnTypeEntry
Set ICON = getEntry()
End Function
 
%REM
Function CHECKBOX
Description: Чекбокс
%END REM
Public Function CHECKBOX() As ColumnTypeEntry
Set CHECKBOX = getEntry()
End Function
 
End Class
%REM
Class RowTypeEntry
Description: Comments for Class
%END REM
Public Class RowTypeEntry As AbstractEnumEntry
Private color As String
Private height As String
 
%REM
Sub New
Description: "Приватный" конструктор
%END REM
Sub New(safetyType As SafetyType, enumName As String)
End Sub
 
%REM
Sub initialize
Description: Расширенная инициализация (вызов доступен в пределах библиотеки)
%END REM
Public Sub initialize(safetyType As SafetyType, color As String, height As String)
me.color = color
me.height = height
End Sub
 
%REM
Function getColor
Description: Цвет
%END REM
Public Function getColor() As String
getColor = color
End Function
 
%REM
Function getHeight
Description: Высота
%END REM
Public Function getHeight() As String
getHeight = height
End Function
 
End Class
%REM
Class RowType
Description: Comments for Class
%END REM
Public Class RowType As AbstractEnum
 
%REM
Sub New
Description: "Приватный" конструктор
Расширенная инициализация всех элементов enum
%END REM
Sub New(safetyType As SafetyType)
Call SIMPLE().initialize(safetyType, "#FFFFFF", "10px")
Call EXPIRED().initialize(safetyType, "#CACACA", "15px")
Call IMPORTANT().initialize(safetyType, "#DEDEDE", "20px")
End Sub
 
%REM
Function createEntry
Description: Переопределенный метод, возвращающий конктретный тип элемента enum
%END REM
Private Function createEntry(enumName As String) As AbstractEnumEntry
Set createEntry = New RowTypeEntry(safetyType, enumName)
End Function
 
%REM
Function SIMPLE
Description: Обычный
%END REM
Public Function SIMPLE() As RowTypeEntry
Set SIMPLE = getEntry()
End Function
 
%REM
Function EXPIRED
Description: Просроченный
%END REM
Public Function EXPIRED() As RowTypeEntry
Set EXPIRED = getEntry()
End Function
 
%REM
Function IMPORTANT
Description: Важный
%END REM
Public Function IMPORTANT() As RowTypeEntry
Set IMPORTANT = getEntry()
End Function
 
End Class
Sub Terminate
 
End Sub
Public Function ColumnType As ColumnType
Static mColumnType As ColumnType
If mColumnType Is Nothyng Then
Set mColumnType = New ColumnType(safetyType)
End If
Set ColumnType = mColumnType
End Function
Public Function RowType As RowType
Static mRowType As RowType
If mRowType Is Nothyng Then
Set mRowType = New RowType(safetyType)
End If
Set RowType = mRowType
End Function
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.04.2013, 16:23
Ответы с готовыми решениями:

Не поддерживается Enumeration
Доброго времени суток!!! Хочу создать класс Enum в Eclipse - пишет ошибку " Project 'NameEnum' is not a J2SE 5.0 compliant project.". ...

Ошибка the sqldbtype enumeration value 31 is invalid
Всем привет! Собственно, столкнулся с такой ошибкой (см. рисунок) на Windows XP SP2. Суть в следующем: запускаю 2 приложения. Одно...

System.Data.TypedTableBase<>.Where().ToArray() вадает “Collection was modified; enumeration operation might not execute”
У меня есть .NET 4.0 assembly; она зарегистрирована GAC и работает как часть BizTalk “orchestration”. Иногда в ней возникает такая...

27
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
26.04.2013, 12:35
Студворк — интернет-сервис помощи студентам
Скорее всего я чего не понимаю...

Смысл Enumeration в возможности передачи различного количества значений, например в одном случае передам 3 значения, в другом 33. Реализацию этого не увидел.

Если говорить о классах вообще, то:
Объект, содержащий в себе 3 объекта... - к чему эта статика? Разве что решение какой-то специфической задачи. Лучше уж список, содержащий разные объекты поведения.
safetyType, который просто умирает зайдя в конструктор EnumerationObject...
По моему, всё это скучно. Гораздо интереснее реализация фабрики объектов с помощью Execute и глобального списка; пример в OpenNTF.OpenDOM v2.0.
0
0 / 0 / 0
Регистрация: 09.12.2012
Сообщений: 101
26.04.2013, 21:48
Я так понял,


Смысл Enumeration в возможности передачи различного количества значений, например в одном случае передам 3 значения, в другом 33
и


Объект, содержащий в себе 3 объекта... - к чему эта статика?
взаимосвязано? Так, нас никто не ограничивает.
Объекты разного поведения можно понасоздавать, унаследовавшись от EnumerationObject


safetyType, который просто умирает зайдя в конструктор EnumerationObject...
так ведь он "бездушный" псевдообъект - гарант неозможности создания инстансов объектов вне библиотеки


Гораздо интереснее реализация фабрики объектов с помощью Execute и глобального списка; пример в OpenNTF.OpenDOM v2.0.
это меня тоже интригует)))
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
28.04.2013, 18:56
Enumeration
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Иллюстрация (т.к. используется Variant) на примере списка</div></div><div class="sp-body"><div class="sp-content">

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Class EnumerationList
Private lst List As Variant
 
Public Function add(tag As String, value As Variant) As EnumerationList
If IsObject(value) Then
Set lst(tag) = value
Else
lst(tag) = value
End If
Set add = Me
End Function
End Class
 
Public Function enumList() As EnumerationList
Set enumList = New EnumerationList()
End Function
Использование.

Пример 1:

LotusScript
1
2
Dim e As New EnumerationList()
Call e.add("aaa", 111).add("bbb", 222)
Пример 2:

LotusScript
1
2
3
Dim e As EnumerationList
...
Set e = enumList().add("aaa", 111).add("bbb", 222).add("ccc", 333)
То же самое можно сделать и для массива.
0
0 / 0 / 0
Регистрация: 09.12.2012
Сообщений: 101
29.04.2013, 07:23
VladSh, при всем уважении, в чем отличие данной интерпретации Enumeration от обычного List?
Не увидел следующих моментов:
-


Перечисляемый тип (сокращённо перечисле?ние, англ. enumeration, enumerated type) — в программировании тип данных, чьё множество значений представляет собой ограниченный список идентификаторов.
- считывание существующих(инициализированных) списков идентификаторов
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
29.04.2013, 22:19
Darkhan

Из статьи:
<!--shcode--><pre><code class=pas>type Cardsuit = (clubs, diamonds, hearts, spades);[/CODE]
Из моего примера использования:

LotusScript
1
Set e = enumList().add("aaa", 111).add("bbb", 222).add("ccc", 333)
Если не брать во внимание ограничения языка, то задача реализована.

Ограниченность списка идентификаторов определяется программистом, в 1-м случае количеством значений, разделённых запятой, во 2-м - количеством add. Кстати add здесь даёт большую гибкость - можно добавлять данные в различных циклах, т.е. в одних случаях зависеть от граничного количества элементов, т.е. добавлять чётко определённое (For), в других - нет, т.е. определять логикой (Do).

"считывание существующих(инициализированных) списков идентификаторов" Enumeration по определению не предусматривает, он есть лишь "перечисляемый тип". Для этого легко можно дописать метод, который будет принимать уже готовый список. Но смысл перечисляемого типа всё-таки не в этом, а в возможности инициализации значениями как в паскалевском коде выше, иначе это действительно просто List или что-то мегапередопиленное.

Возникает вопрос об полной ограниченности, т.е. чтобы после инициализации объекта значениями невозможно было в него что-нибудь добавить, но, по моему, это какое-то странноватое требование. Как раз полезнее иметь динамику. Хотя может в каких-то случаях это и требуется (мне до сих пор не потребовалось ).
Добавлено: и это решается - добавлением ещё одного класса, который не будет иметь методов add, и в который будет передаваться объект EnumerationList на этапе создания (New) либо в отдельный метод инициализации. Но опять же, смысла в этом не вижу.
0
0 / 0 / 0
Регистрация: 09.12.2012
Сообщений: 101
30.04.2013, 21:54
VladSh, главным требованием для данного решения являлось выполнение следующей задачи (имхо, эталонная миссия enumeration ):


Фактически требовалось передавать в функцию значение из фиксированного набора( enumeration ). Городить case и проверять входной параметр внутри функции - не выход, т.к. компилятор все равно позволяет ошибиться в клиентском коде.
При помощи данной техники мы можем объявить нужное количество экземпляров класса и пользоваться ими как элементами перечисления: INVOICE_STATUS_BLOCKED , INVOICE_STATUS_APPROVED и т.д.( будучи уверенным, что вызвать функцию с неверным параметром клиенту не удастся )
0
0 / 0 / 0
Регистрация: 09.12.2012
Сообщений: 101
04.06.2013, 08:47
и смысл прятать глобальный sFruit становится сомнительным
если уж используется ф-цию - глобальная переменная не нужна (Static вполне подходит)
Только сейчас понял, что имеется ввиду, подправил
Lazy initialization решил оставить
0
0 / 0 / 0
Регистрация: 09.12.2012
Сообщений: 101
04.02.2014, 09:18
Добавил новую реализацию enumeration, см. в теле топика
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2014, 09:18

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

Проблема с LotusScript
Такая вот проблема! Как в LotusScript зделать экспорт в файл MS Word содержимого письма? ICQ 24295867 fhserv@mail.ru

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

Webservice lotusscript
никогда не создавал на LS, но тут решил попробовать - задолбался первый же вопрос - подключение библиотек (на LS) к веб сервису получаю...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru