Lotusscript: редкие конструкции

  • Автор темы Yakov
  • Дата начала
Y

Yakov

#1
Здравствуйте, коллеги.
Накидайте мне здесь, пожалуйста, хитрых, редких, необычных и разных экзотических конструкций на LotusScript таких, например, как Error 1 (без строкового описания), On Event ... Call, многомерные массивы, списки, содержащие массивы и прочее другое.
А я за это напишу к следующей неделе статью на тему LotusScript: взгляд изнутри или Все, что вы хотели знать о LotusScript, но стеснялись спросить.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#3
in-line инициализация строкового массива констант для передачи переметором R6+
Код:
call SomeProc(split("Value0;Value1;Value2", ";"))
вместо
Код:
dim arr as variant
redim arr (0 to 2)
arr(0) = "Value0"
arr(1) = "Value1"
arr(2) = "Value2"
call SomeProc(arr)
 
Y

Yakov

#4
Morpheus, Akupaka, хорошо, но не то, что мне нужно.
Ваши примеры используют типичные встроенные функции и приведение типов.
Сформулирую задачу по-другому.
Будем считать шаблон mailX.ntf типичной БД. Так вот, меня интересует нетипичный код.
К примеру, в mail.ntf не используется выражение Error errcode, а оно отличается от Error errorcode, errormessage. Или то же On Event. Используете таймер? Напишите мне.
Если вы используете в своей работе что-то, о чем в справке написано мелким шрифтом в конце страницы (или вообще на ее обороте), или вообще не написано, или вы используете это как-то хитро, сообщите мне. А я вам расскажу как это устроено.
Или если вдруг в ранних версиях (до 6.5) была какая-то функция или оператор, а потом ее не стало, но вы об этом знаете, напишите.
Или какой-нибудь хитрый объектный код типа вызова метода "дедушки".
 

Andre

Well-known member
29.07.2004
108
0
#5
Особенности использовании конструкции On Event.
Например On Event QuerySend From NotesUIDocument call MyQuerySend

Для того чтобы сработал перехват события необходимо или наличие какого либо кода или просто комментария в событии QuerySend или куда как более универсально - достаточно в Declaration Form (Subform, ...) ввести код или комментарии и все работает.
В сети примеры есть. Я обычно рисую строчку типа:
%REM
Magic Line. Do not remove !!!
%END REM

А еще есть помимо "подписки на перехват" события еще и отмена подписки на перехват события (и если не изменяет память - можно блокировать срабатывание события) при помощи конструкции On Event eventName From prodObject Remove [ handlerName ]
Например
On Event QuerySend From NotesUIDocument Remove MyQuerySend.

Такие нужны примеры ?

З.Ы. Еще есть занятная тема типа динамической подгрузки кода по мере надобности и этот подгруженный код живет до тех пор пока небудет уничтожен родитель.
Мутно написал, попробую на примере:
Имеем uiDocument. На нем есть кнопка - но нажимают ее редко, а на кнопке висит вызов функций из большой и тяжелой библиотеки. В 95% случаев грузить этот код нет смысла. А вот подтянуть код по мере надобности, когда на эту кнопку нажали, да еще чтобы при повторном нажатии этот код заново не подгружался - вот такой фокус будет по теме ?
 

Andre

Well-known member
29.07.2004
108
0
#7
Ну что ж, просили - получайте ). Динамическая подгрузка кода. Идея взята из какой-то redbook от IBM.
Расписывать что-да как - слишком много букв потрачу.
А вот простой примерчик приложу . Имеющие глаза - да увидят, а остальные пройдут себе мимо ))
 

Вложения

TIA

:-)
Lotus team
15.05.2009
790
3
#8
Вот вариант без фабрики, но с параметром.
Param д.б. EMPTY, если у класса конструктор без параметров.
Код:
Public tmpAFParam As Variant
Public tmpAFObj As Variant

Public Function AF_LoadObject (LSLibName As String, ClassName As String, Param As Variant) As Variant	
'Dim Key As String	
'Key = LSLibName + "%" + ClassName
On Error Goto ErrHnd
Dim ParamTypeName As String

Set tmpAFObj = Nothing
If Isempty(Param) Then
Execute { Use "}+LSLibName+{" : Set tmpAFObj = New }+ClassName
Else
ParamTypeName = Typename(Param)	
If Isobject(Param) Then
Set tmpAFParam = Param
Execute { Use "}+LSLibName+{" : Dim P as }+ParamTypeName +{ : Set P = tmpAFParam : Set tmpAFObj = New }+ClassName +{(P) }
Else
tmpAFParam = Param
Execute { Use "}+LSLibName+{" : Dim P as }+ParamTypeName +{ : P = tmpAFParam : Set tmpAFObj = New }+ClassName +{(P) }
End If		
End If		

Done:	
Set AF_LoadObject = tmpAFObj
Exit Function
ErrHnd:
'	Print "LoadObject Err:'" & Error$ & "' line:" & Erl
Resume Done	
End Function
 
O

oshmianski

#10
Yakov
недавно столкнулся. стандартный шаблон Resource Reservations, view ($Calendar), action "View by Room or Resource", @SetViewInfo([SetViewFilter];choice;"$23"; FALSE;1). расскажите мне про 5-й аргумент
 

hosm

* so what *
18.05.2009
2 442
6
#11
oshmianski
Судя по тому, что дизайнер дает в подсказке только один вариант с параметрами
Код:
@SetViewInfo( [SETVIEWFILTER]; filterString; colProgName; bIsCategory; bDoExact)
предполагается, что 5-й аргумент - это, собственно, описанный в справке exactMatch.
Получается, в зависимости от типа вьюшки (тут - календарь) он его учитывает, а 4-й (FALSE) игнорирует.
 
M

Mihal

#12
Здравствуйте, коллеги.
Накидайте мне здесь, пожалуйста, хитрых, редких, необычных и разных экзотических конструкций на LotusScript таких, например, как Error 1 (без строкового описания), On Event ... Call, многомерные массивы, списки, содержащие массивы и прочее другое.
А я за это напишу к следующей неделе статью на тему LotusScript: взгляд изнутри или Все, что вы хотели знать о LotusScript, но стеснялись спросить.
Часто использую массивы списков. Но если объявлять их не Variant - Lotus загибается и ругается нехорошими словами. Посему тут примеры слишком "неявными" получаются.

А к экзотическим конструкциям....
Определение разделителя десятичной дроби на собаках (барабанная дробь, Рома застыл в ожидании ;) ):
Del:=@Right(@Left(@Text(5/2);2);1)
:wacko:
 
M

Mihal

#15
Вот! Самая убийственная конструкция на собаках! Есть легенда, которая гласит что эта конструкция берёт своё начало ещё с доскриптовых времён! То есть до эпохи исторического материализмя! РЕЛИКТ! На украинский переводил сам :) В связи с этим возможны дупла ;) Своё значение ставим вместо Proba.

[codebox]_R1:="один" : "два" : "три" : "чотири" : "п'ять" : "шість" : "сімь" : "вісім" : "дев'ять";
_R1a:="одна" : "дві" : "три" : "чотири" : "п'ять" : "шість" : "сім" : "вісім" : "дев'ять";
_R10:="десять" : "двадцять" : "тридцять" : "сорок" : "пятдесят" : "шістдесят" : "сімдесят" : "вісімдесят" : "дев'яносто";
_R20:="десять" : "одиннадцять" : "дванадцять" : "тринадцять" : "чотирнадцять" : "п'ятнадцять" : "шістнадцять" :"сімнадцять" : "вісімнадцять" : "дев'ятнадцять";
_R100:="сто" : "двісті" : "триста" : "чотириста" : "п'ятсот" : "шестсот" : "сімсот" : "вісімсот" : "дев'ятсот";

DEFAULT Proba:=0;
_P := "00" + @Text(Proba; "F2");
_txtRES := @If(@Abs(Proba)<1; "нуль "; "");
_RB := "мільярд";
_RM := "мільйон";
_RT := "тисяч";
_ER := @TextToNumber(@MiddleBack(_P; 4; -1));
_DR := @TextToNumber(@MiddleBack(_P; 5; -1));
_SR := @TextToNumber(@MiddleBack(_P; 6; -1));

_ET := @TextToNumber(@MiddleBack(_P; 7; -1));
_DT := @TextToNumber(@MiddleBack(_P; 8; -1));
_ST := @TextToNumber(@MiddleBack(_P; 9; -1));

_EM := @TextToNumber(@MiddleBack(_P; 10; -1));
_DM := @TextToNumber(@MiddleBack(_P; 11; -1));
_SM := @TextToNumber(@MiddleBack(_P; 12; -1));

_EB := @TextToNumber(@MiddleBack(_P; 13; -1));
_DB := @TextToNumber(@MiddleBack(_P; 14; -1));
_SB := @TextToNumber(@MiddleBack(_P; 15; -1));
REM "----Миллиарды-------------------";
_SBT := @If(_SB = 0; ""; @Subset(@Subset(_R100; _SB); -1)) + " ";
_DBT := @If(_DB = 0; ""; _DB > 1; @Subset(@Subset(_R10; _DB); -1) + " "; @Subset(@Subset(_R20; _EB + 1); -1) + " ");
_EBT := @If(_EB = 0; ""; _DB = 1; ""; @Subset(@Subset(_R1; _EB); -1) + " ");
@Set("_txtRES"; @If(_SB+_DB+_EB=0; _txtRES; _SBT +_DBT +_EBT+_RB + @If(_DB!=1; @If(_EB = 1; ""; _EB>1 & _EB < 5; "а"; "ів");"ів")+" "));
REM "----Миллионы---------------------";
_SMT := @If(_SM = 0; ""; @Subset(@Subset(_R100; _SM); -1)) + " ";
_DMT := @If(_DM = 0; ""; _DM > 1; @Subset(@Subset(_R10; _DM); -1) + " "; @Subset(@Subset(_R20; _EM + 1); -1) + " ");
_EMT := @If(_EM = 0; ""; _DM = 1; ""; @Subset(@Subset(_R1; _EM); -1) + " ");
@Set("_txtRES"; _txtRES + @If(_SM+_DM+_EM=0; ""; _SMT +_DMT +_EMT+_RM + @If(_DM!=1; @If(_EM=1; ""; _EM>1 & _EM < 5; "и"; "ів");"ів")+" "));
REM "----Тысячи -----------------";
_STT := @If(_ST = 0; ""; @Subset(@Subset(_R100; _ST); -1)) + " ";
_DTT := @If(_DT = 0; ""; _DT > 1; @Subset(@Subset(_R10; _DT); -1) + " "; @Subset(@Subset(_R20; _ET + 1); -1) + " ");
_ETT := @If(_ET = 0; ""; _DT = 1; ""; @Subset(@Subset(_R1a; _ET); -1) + " ");
@Set("_txtRES"; _txtRES + @If(_ST+_DT+_ET=0; ""; _STT +_DTT +_ETT+_RT + @If(_DT!=1; @If(_ET = 1; "а"; _ET>1 & _ET < 5; "і";"");"")+" "));
REM "----еденицы--------------------------";
_SRT := @If(_SR = 0; ""; @Subset(@Subset(_R100; _SR); -1)) + " ";
_DRT := @If(_DR = 0; ""; _DR > 1; @Subset(@Subset(_R10; _DR); -1) + " "; @Subset(@Subset(_R20; _ER + 1); -1) + " ");
_ERT := @If(_ER = 0; ""; _DR = 1; ""; @Subset(@Subset(_R1; _ER); -1) + " ");
@Set("_txtRES"; _txtRES +_SRT +_DRT +_ERT);
@Set("_txtRES"; @Trim(_txtRES));
@UpperCase(@Left(_txtRES; 1)) + @RightBack(_txtRES; 1)[/codebox]

To All.
Формулы не надо, я до них еще не добрался. :)
Та пофигу :) Я должен излить!

Саморазрушающийся в конструкторе объект :)
Код:
Class MyClass
Sub new
Call destroy(Me)
End Sub

Sub delete

End Sub

Private Sub destroy(Me1 As MyClass)
Delete Me1
End Sub
End Class
Смысл в том, что Set myObject=New MyClass() возврашает Nothing. Ну, ессно, в конструктор можно условие влепить, что б не всегда разрушалось.
 

TIA

:-)
Lotus team
15.05.2009
790
3
#16
Саморазрушающийся в конструкторе объект smile.gif
Можно чуть проще.
Код:
Class clsA
Sub new 
Dim v As clsA
Set v = Me 'важно
Delete v
End Sub
End Class
Только я от саморазрушающихся в конструкторе объектов отказался. Они иногда разрушают и Нотес заодно.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 570
263
#17
А к экзотическим конструкциям....
Определение разделителя десятичной дроби на собаках (барабанная дробь, Рома застыл в ожидании ;) ):
Del:=@Right(@Left(@Text(5/2);2);1)
:)
а чем экзотично-то, можно и так :)
t:=@Text(0.00;"F2");
@Right(@Left(t;2);1)

либо @ReplaceSubstring(t;"0";"")
 

morpheus

скриптописец
07.08.2006
3 915
1
#18
Только я от саморазрушающихся в конструкторе объектов отказался. Они иногда разрушают и Нотес заодно.
в таких случаях ввожу свойствто IsValid as Boolean, а кто как проверят чо класс был создан нормально?
 
M

Mihal

#20
Можно чуть проще.
Код:
Class clsA
Sub new 
Dim v As clsA
Set v = Me 'важно
Delete v
End Sub
End Class
Только я от саморазрушающихся в конструкторе объектов отказался. Они иногда разрушают и Нотес заодно.
Это не проще, а кривее! Такую важную вешчь как суицид надо в отдельный метод палюбому! :)