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

Тема в разделе "Lotus - Программирование", создана пользователем Yakov, 1 июл 2009.

  1. Yakov

    Yakov Гость

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
  3. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    in-line инициализация строкового массива констант для передачи переметором R6+
    Код (Text):
    call SomeProc(split("Value0;Value1;Value2", ";"))
    вместо
    Код (Text):
    dim arr as variant
    redim arr (0 to 2)
    arr(0) = "Value0"
    arr(1) = "Value1"
    arr(2) = "Value2"
    call SomeProc(arr)
     
  4. Yakov

    Yakov Гость

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

    Andre Well-Known Member

    Регистрация:
    29 июл 2004
    Сообщения:
    108
    Симпатии:
    0
    Особенности использовании конструкции 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% случаев грузить этот код нет смысла. А вот подтянуть код по мере надобности, когда на эту кнопку нажали, да еще чтобы при повторном нажатии этот код заново не подгружался - вот такой фокус будет по теме ?
     
  6. Yakov

    Yakov Гость

     
  7. Andre

    Andre Well-Known Member

    Регистрация:
    29 июл 2004
    Сообщения:
    108
    Симпатии:
    0
    Ну что ж, просили - получайте ). Динамическая подгрузка кода. Идея взята из какой-то redbook от IBM.
    Расписывать что-да как - слишком много букв потрачу.
    А вот простой примерчик приложу . Имеющие глаза - да увидят, а остальные пройдут себе мимо ))
     

    Вложения:

  8. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Вот вариант без фабрики, но с параметром.
    Param д.б. EMPTY, если у класса конструктор без параметров.
    Код (Text):
    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
     
  9. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
  10. oshmianski

    oshmianski Гость

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    oshmianski
    Судя по тому, что дизайнер дает в подсказке только один вариант с параметрами
    Код (Text):
    @SetViewInfo( [SETVIEWFILTER]; filterString; colProgName; bIsCategory; bDoExact)
    предполагается, что 5-й аргумент - это, собственно, описанный в справке exactMatch.
    Получается, в зависимости от типа вьюшки (тут - календарь) он его учитывает, а 4-й (FALSE) игнорирует.
     
  12. Mihal

    Mihal Гость

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

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

    Yakov Гость

    To All.
    Формулы не надо, я до них еще не добрался. :)
     
  14. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    а смысл в такой конструкции?

    пусть пишут, пока помнят :) потом доберешься )
     
  15. Mihal

    Mihal Гость

    Вот! Самая убийственная конструкция на собаках! Есть легенда, которая гласит что эта конструкция берёт своё начало ещё с доскриптовых времён! То есть до эпохи исторического материализмя! РЕЛИКТ! На украинский переводил сам :) В связи с этим возможны дупла ;) Своё значение ставим вместо 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]

    Та пофигу :) Я должен излить!

    Саморазрушающийся в конструкторе объект :)
    Код (Text):
    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. Ну, ессно, в конструктор можно условие влепить, что б не всегда разрушалось.
     
  16. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Можно чуть проще.
    Код (Text):
    Class clsA
    Sub new
    Dim v As clsA
    Set v = Me 'важно
    Delete v
    End Sub
    End Class
    Только я от саморазрушающихся в конструкторе объектов отказался. Они иногда разрушают и Нотес заодно.
     
  17. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    а чем экзотично-то, можно и так :)
    t:=@Text(0.00;"F2");
    @Right(@Left(t;2);1)

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    в таких случаях ввожу свойствто IsValid as Boolean, а кто как проверят чо класс был создан нормально?
     
  19. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Морфей, не жадничай! заведи отдельный топ :)
     
  20. Mihal

    Mihal Гость

    Это не проще, а кривее! Такую важную вешчь как суицид надо в отдельный метод палюбому! :)
     
Загрузка...
Похожие Темы - Lotusscript редкие конструкции
  1. seoman2
    Ответов:
    9
    Просмотров:
    354
  2. stranik
    Ответов:
    8
    Просмотров:
    838
  3. erhe
    Ответов:
    22
    Просмотров:
    1.268
  4. lmike
    Ответов:
    4
    Просмотров:
    758
  5. JohnLemon
    Ответов:
    2
    Просмотров:
    853

Поделиться этой страницей