1. Уважаемые участники и гости, 19 октября codeby будет работать в режиме "Только чтение". Регистрация новых участников будет закрыта. 20 октября портал продолжит работу в прежнем режиме.

Dynamic Lotusscript

Тема в разделе "Библиотеки скриптов", создана пользователем morpheus, 7 авг 2007.

  1. morpheus

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

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    3.915
    Симпатии:
    1
    Функция Execute шикарная вещь при правильном применении.
    Вы только вчитайтесь в описание
    компиляции и запуска и выгрузки целых динамических библиотек
    Синтаксис:
    Execute ( text )
    где text - собственно и есть запускаеммый скрипт

    Код:
    Sub Initialize
    Dim strCode As String
    strCode = { MsgBox "Это динамическая библиотека" }
    Execute( strCode )
    End Sub
    попробуйте запустить этот код :)

    Ну чтож теперь попробуем более сложный код, в котором сдержиться более одной строки
    Код:
    Sub Initialize
    Dim strCode As String
    strCode = { 
    Dim strMessage as String
    strMessage = "Это динамическая библиотека"
    msgbox strMessage
    }
    Execute( strCode )
    End Sub
    Имейте в виду что символы перехода строки используються для разделения строк в переменной strCode
    Как видите оба примера делают одно и тоже - показывают окно с соощением "Это динамическая библиотека".

    Я думаю теперь суть функции Execute должна быть Вам ясна. Далее попытаемся продемонстрировать Вам возможность использования этой функции в приложениях

    Работа с динамическими классами
    В ниже приведённом примере некоторые переменные и процедуры загружены из другого модуля
    Код:
     Sub Initialize
    Dim strCode as String
    strCode = {
    Use "libArrayManager"
    Dim AM as ArrayManager
    Set AM = new ArrayManager()
    }
    Execute strCode
    End Sub
    Этот динамический код загружает библиотеку ArrayManager и экземпляр класса ArrayManager. Фишка в том что в 4й строке мы динамически подгружаем модуль. Таким образом в режиме runtime мы можем программно решать - подгружать модули или нет. Эта техника называеться Динамическая загрузка классов ( Dynamic Class Loading ). Этот метод хорошо использовать с точки зрения оптимизации - мы подгружаем только те модули которые будем использовать, ничего лишнего.
    Конечо же эта техника не новая. Я лично пользуюсь ею(поисковая система). Можете прочитать про эту технику тут

    Теперь я думаю пора привести более сложный пример
    Код:
    Declarations
    Dim strReturnVal as String
    Sub Initialize
    Dim strCode as String
    Dim strModule as String
    Dim strFunction as String
    Dim strParam as String
    
    strModule = "libUser"
    strFunction = "getCountry"
    strParam = "Orky Dorky"
    
    strCode = |
    Use | & strModule & |
    strReturnVal = | & strFunction & |(| & strParam & |)|
    Execute strCode
    Msgbox strReturnVal
    End Sub
    Теперь как Вы видите - все динамическое: подгружаеммый модуль, имя запускаеммой функции, параметр для функции. Прошу обратить внимание на две верхние строки. они позволяют нам обьединять переменные для статического и динамического кода. ВАЖНО это будет работать только с глобальными декларациями, имено потому strReturnVal задекларированно в самом верху!

    Канечно, приведённые выше примеры слишком просты, но я думаю суть фунции Execute у меня получилось Вам передать.

    от себя отмечу что интересным есть то что возвратит нам фунция Execute
    Return value
    как видите
    - код который идет за End
    - или 0, если в код не был включен End, или End ничего не вернул.

    Пример
    Код:
    Sub ComputeInterest
    Dim script As String, calc As String, retcode As Integer
    calc$ = InputBox("Compute loan interest (charge/loan)")
    script$ = _
    |Option Declare
    Sub Initialize
    Dim pct As Single  
    pct! = | & calc$ & | 
    If pct! < 0 Then
    End -2				  ' -2 is a status code.
    ElseIf pct! > 1 Then
    End -3				  ' -3 is a status code.
    End If
    MessageBox("Interest is " & Format(pct!,"percent"))
    End Sub|
    retcode% = Execute (script$)
    If retcode% = -2 Then
    MessageBox("You computed a negative interest rate!")
    ElseIf retcode% = -3 Then
    MessageBox("You computed an excessive interest rate!")
    End If
    End Sub
    Как видим в данном динамическом коде присутствуют End -2 и End -3. В зависимости от значения retcode наш MessageBox выведет нам одну из надписей про позитив или негатив



    Вольный перевод отсюда
     
  2. Mihal

    Mihal Гость

    Репутация:
    0
    Мало того, на Execute можно построить настраиваемое "слабое" взаимодействие между двумя базами. База А шлёт базе Б письмо с кодом, который надо выполнить в базе Б. В базе Б агент отлавливает пришедшее письмо и выполняет пришедший код. всё красиво, естественно и прозрачно.
     
  3. TIA

    TIA :-)
    Lotus team

    Репутация:
    0
    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    1
    ВАЖНО что, не просто глобальными, а Public-декларациями. Т.е. strReturnVal должен быть Public.
     
  4. savl

    savl Well-Known Member
    Команда форума Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.111
    Симпатии:
    157
    Как я ни бился End не возвращал мне значения, пришлось через внешнюю Public переменную.
    Код:
    res = Execute(scriptCode)
    res всегда был 0.
    Код:
    Sub Callme()
    if Stat != 0 then 
    End -1
    else
    End 3
    End if
    End Sub
    call CallMe()
     
Загрузка...
Похожие Темы - Dynamic Lotusscript
  1. motogarri
    Ответов:
    16
    Просмотров:
    913
  2. SvetlanaL
    Ответов:
    0
    Просмотров:
    266
  3. tumanovalex
    Ответов:
    1
    Просмотров:
    1.354
  4. NickProstoNick
    Ответов:
    1
    Просмотров:
    904
  5. irishman
    Ответов:
    42
    Просмотров:
    10.437

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