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

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

Yakov

Здравствуйте, коллеги.
Накидайте мне здесь, пожалуйста, хитрых, редких, необычных и разных экзотических конструкций на LotusScript таких, например, как Error 1 (без строкового описания), On Event ... Call, многомерные массивы, списки, содержащие массивы и прочее другое.
А я за это напишу к следующей неделе статью на тему LotusScript: взгляд изнутри или Все, что вы хотели знать о LotusScript, но стеснялись спросить.
 
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)
 
Morpheus, Akupaka, хорошо, но не то, что мне нужно.
Ваши примеры используют типичные встроенные функции и приведение типов.
Сформулирую задачу по-другому.
Будем считать шаблон mailX.ntf типичной БД. Так вот, меня интересует нетипичный код.
К примеру, в mail.ntf не используется выражение Error errcode, а оно отличается от Error errorcode, errormessage. Или то же On Event. Используете таймер? Напишите мне.
Если вы используете в своей работе что-то, о чем в справке написано мелким шрифтом в конце страницы (или вообще на ее обороте), или вообще не написано, или вы используете это как-то хитро, сообщите мне. А я вам расскажу как это устроено.
Или если вдруг в ранних версиях (до 6.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% случаев грузить этот код нет смысла. А вот подтянуть код по мере надобности, когда на эту кнопку нажали, да еще чтобы при повторном нажатии этот код заново не подгружался - вот такой фокус будет по теме ?
 
Ну что ж, просили - получайте ). Динамическая подгрузка кода. Идея взята из какой-то redbook от IBM.
Расписывать что-да как - слишком много букв потрачу.
А вот простой примерчик приложу . Имеющие глаза - да увидят, а остальные пройдут себе мимо ))
 

Вложения

Вот вариант без фабрики, но с параметром.
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
 
Yakov
недавно столкнулся. стандартный шаблон Resource Reservations, view ($Calendar), action "View by Room or Resource", @SetViewInfo([SetViewFilter];choice;"$23"; FALSE;1). расскажите мне про 5-й аргумент
 
oshmianski
Судя по тому, что дизайнер дает в подсказке только один вариант с параметрами
Код:
@SetViewInfo( [SETVIEWFILTER]; filterString; colProgName; bIsCategory; bDoExact)
предполагается, что 5-й аргумент - это, собственно, описанный в справке exactMatch.
Получается, в зависимости от типа вьюшки (тут - календарь) он его учитывает, а 4-й (FALSE) игнорирует.
 
Здравствуйте, коллеги.
Накидайте мне здесь, пожалуйста, хитрых, редких, необычных и разных экзотических конструкций на LotusScript таких, например, как Error 1 (без строкового описания), On Event ... Call, многомерные массивы, списки, содержащие массивы и прочее другое.
А я за это напишу к следующей неделе статью на тему LotusScript: взгляд изнутри или Все, что вы хотели знать о LotusScript, но стеснялись спросить.

Часто использую массивы списков. Но если объявлять их не Variant - Lotus загибается и ругается нехорошими словами. Посему тут примеры слишком "неявными" получаются.

А к экзотическим конструкциям....
Определение разделителя десятичной дроби на собаках (барабанная дробь, Рома застыл в ожидании ;) ):
Del:=@Right(@Left(@Text(5/2);2);1)
:wacko:
 
To All.
Формулы не надо, я до них еще не добрался. :)
 
Вот! Самая убийственная конструкция на собаках! Есть легенда, которая гласит что эта конструкция берёт своё начало ещё с доскриптовых времён! То есть до эпохи исторического материализмя! РЕЛИКТ! На украинский переводил сам :) В связи с этим возможны дупла ;) Своё значение ставим вместо 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. Ну, ессно, в конструктор можно условие влепить, что б не всегда разрушалось.
 
Саморазрушающийся в конструкторе объект smile.gif

Можно чуть проще.
Код:
Class clsA
Sub new 
Dim v As clsA
Set v = Me 'важно
Delete v
End Sub
End Class
Только я от саморазрушающихся в конструкторе объектов отказался. Они иногда разрушают и Нотес заодно.
 
А к экзотическим конструкциям....
Определение разделителя десятичной дроби на собаках (барабанная дробь, Рома застыл в ожидании ;) ):
Del:=@Right(@Left(@Text(5/2);2);1)
:)
а чем экзотично-то, можно и так :)
t:=@Text(0.00;"F2");
@Right(@Left(t;2);1)

либо @ReplaceSubstring(t;"0";"")
 
Только я от саморазрушающихся в конструкторе объектов отказался. Они иногда разрушают и Нотес заодно.
в таких случаях ввожу свойствто IsValid as Boolean, а кто как проверят чо класс был создан нормально?
 
Можно чуть проще.
Код:
Class clsA
Sub new 
Dim v As clsA
Set v = Me 'важно
Delete v
End Sub
End Class
Только я от саморазрушающихся в конструкторе объектов отказался. Они иногда разрушают и Нотес заодно.

Это не проще, а кривее! Такую важную вешчь как суицид надо в отдельный метод палюбому! :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!