Lotus Script: взгляд изнутри

Darkhan

Green Team
14.12.2012
99
2
BIT
0
Непонятно назначение цепочки... Если преследуется цель, чтобы события выполнялись автоматом (QuerySave->PostSave), то в свете предварительной привязки в методе register - события вызовутся согласно "нативной" задумке, или нет?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
Скажем... подформа встроена в несколько документов и выполняет общий для них код, но при это у каждой формы еще свои события прописаны. Если использовать данную либу конфликты элементов/объектов будут?
надопонимать, что каждый "инстанс" либы (т.е. Use) - это набор индивидуальных элементов, отсюда два следствия:
-подформу тестил - она получает теже объекты (от материнской формы) - т.е. (по коду)- просто ничего не увяжет (там защита от повторного объекта)
-если надо обработку в подформу - просто заюзать ChainAction (для чего его и "создавал")

ChainAction надо дописывать а в Action (в классах) прогонять по цепочке

Добавлено:
Непонятно назначение цепочки
вполне очевидно ;) - для подключения доп. обработчиков - буде на то есть необходимость
в базовом случае это не используется (как щас написано)
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
517
lmike
когда узнал что библа идет под каждую форму я сразу снял все вопросы ;)
Я ж говорю, вчера усталый был)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
основной посыл - весь код из форм вынести в либу/ы
цепочка - для кастомизации доп. (например делегирование доп. фич) и для вынесения доп. обработчиков в сабформы (просто доп. классы инстанцируются и подкл.)
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
517
я про то что дизайн кэшируется. Скажем я изменил код кнопки на форме и у пользователю надо переоткрыть базу для этого или клиент.
А вот если я изменяю код библиотечной функции, которая в этой кнопке вызывается, то пользователю достаточно переоткрыть форму.
Что касается перекомпиляции... Если класс это библиотеки изменить может же понадобиться перекомпиляция и формы тоже?

p.s.о чем я думаю... что я пишу... срочно в отпуск...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
при изменениях шаблона и обновлении из него - переоткрыть БД прридется
при изменении кода в ф-ции класса - перекомпилять не надо
при изменении стр-ры класса - возможно да
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"версия с цепочкой (простой)"</div></div><div class="sp-body"><div class="sp-content">
Код:
Option Public
Option Declare
Use "ErrorHandling"
Private Const ERR_BASE=1024
Const UNPROPER_CHAIN=ERR_BASE+1,CS_UNPROPER_CHAIN={Действие не соответствует типу в цепочке}
Const CS_ERR_UIDOC={не установлен объект NotesUIDocument}
Const CS_QUERYOPEN={QUERYOPEN}
Const CS_CALLER_SB={вызывающая ф-ция д.б.:}
Const ACT_TYPES={}	
Private wks As NotesUIWorkspace
Private ses As NotesSession
Private source As NotesUIDocument

Dim formObj As FormBase
Private gContinue As Boolean

%REM
Class FormBase
Description: InitObjectsUI нобходимо переопределить
%END REM
Class FormBase As ErrorHandler
Private actList List As ActionObject
%REM
Sub New
Description: Comments for Sub
%END REM
Sub New

End Sub
%REM
Function Regiter
Description: Comments for Function
%END REM
Function Register(act As ActionObject) As Boolean
On Error GoTo ErrH
If Not act Is Nothing Then
Dim s As String
s=act.Name
Dim obj As ActionObject
If Not IsElement(actList(s)) Then
Set actList(s)=act
Set obj=act
Else
Set obj=actList(s)
End If
Dim res As ActionObject
Set res=obj.ChainAction(act)
Call obj.Register()
End If
Quit:
Exit Function
ErrH:
Error ERR_BASE, RaiseError
Resume Quit
End Function
%REM
Sub InitObjectsUI
Description: ф-ция для примера, нужно переписывать для своей реализации
%END REM
Function InitObjectsUI(uidoc As NotesUIDocument, xMode As Integer, xIsnewdoc, Xcontinue)
On Error GoTo ErrH
'устанавливаем глобальную переменную (не д.б. Nothing)
Set source=uidoc
Dim act_QO As TemplQueryOpen, _
act_PO As TemplPostOpen, _
act_QS As TemplQuerySave
Set act_QO=New TemplQueryopen()
Set act_PO=New TemplPostOpen()
Set act_QS=New TemplQuerySave()
Call Me.Register(act_QO)
Call Me.Register(act_PO)
Dim tmp As New TemplQueryRecalc()
Call Me.Register(tmp)
Call Me.Register(act_QS)
Call act_QO.Action(uidoc, xMode, xIsnewdoc, Xcontinue)
Quit:
Exit Function
ErrH:
Error ERR_BASE, RaiseError
Resume Quit
End Function
End Class

%REM
Class ActionObject
Description: Comments for Class
%END REM
Class ActionObject As ErrorHandler
Private actName As String
Private actObj As Variant
Private actNext As ActionObject
Private isRegistred As Boolean

Sub New(obj, xName As String)
Me.actName=xName
Set Me.actObj=obj
End Sub

Public Property Get Name As String
Me.Name=actName
End Property
%REM
Property Get Object
Description: Comments for Property Get
%END REM
Public Property Get Object As Variant
Set Me.Object=actObj
End Property

%REM
Function ChainAction
Description: определяет цепочку обработки однотипных событий
%END REM
Public Function ChainAction(nxt As ActionObject) As ActionObject
On Error GoTo ErrH
If nxt Is Nothing Then _
Print {actNext is Nothing}:Exit Function
If UCase(Me.actName) <> UCase(nxt.Name) Then _
Error UNPROPER_CHAIN,CS_UNPROPER_CHAIN &actName &{<>} &nxt.Name
If nxt Is Me.actNext Or nxt Is Me Then _
Print {existing action incl to chain}:Set ChainAction=actNext:Exit Function
If Not actNext Is Nothing Then
Set ChainAction=actNext.ChainAction(nxt)
Else	
Set actNext=nxt
Set ChainAction=actNext
Print {next action:} &typeName(actNext)
End If
Quit:
Exit Function
ErrH:
Error ERR_BASE, Me.RaiseError
End Function
%REM
Sub Register
Description: Comments for Sub
%END REM
Sub Register

End Sub
End Class

%REM
Class FromAction
Description: Comments for Class
%END REM
Class FormAction As ActionObject
Sub New(uidoc As NotesUIDocument, xName As String), ActionObject(uidoc, xName)
If uidoc Is Nothing Then Error ERR_BASE, CS_ERR_UIDOC
Set source=uidoc
End Sub
End Class

%REM
Class ActionPostOpen
Description: Comments for Class
%END REM
Private Class TemplPostOpen As FormAction
Sub New(), FormAction(source, {PostOpen})
'		Set source=uidoc
End Sub
Sub Action(uidoc As NotesUIDocument)
Print {Action:} &Me.actName
End Sub

Sub Register
On Error GoTo ErrH
If Not Me.IsRegistred Then
On Event PostOpen From source Call Action
Me.isRegistred=True
End If
Quit:
Exit Sub
ErrH:
Error ERR_BASE, RaiseError
Resume Quit
End Sub
End Class

Private Class TemplQueryopen As FormAction
Sub New(), FormAction(source, {Queryopen})
End Sub

Sub Action(uidoc As NotesUIDocument, xMode As Integer, xIsnewdoc, xContinue)
Print {Action:} &Me.actName
Dim nxt As TemplQueryopen
'class casting
Set nxt=Me.actNext
If Not nxt Is Nothing Then _
Call nxt.Action(uidoc,xMode,xIsnewdoc,xContinue)
'		Call uidoc.Document.Computewithform(False, False)
'		Print {Form:} &uidoc.Document.Form(0)
'		xcontinue=False
End Sub

Sub Register
On Error GoTo ErrH
If Me.IsRegistred Then Exit Sub
On Event QueryOpen From source Call Action
Me.isRegistred=true
Quit:
Exit Sub
ErrH:
Error ERR_BASE, RaiseError
Resume Quit
End Sub
End Class
%REM
Class QuerySave
Description: Comments for Class
%END REM
Private Class TemplQuerySave As FormAction
Sub New(), FormAction(source, {QuerySave})
End Sub
Sub Action(uidoc As NotesUIDocument, xContinue)
Print {Action:} &Me.actName
Dim nxt
'class casting
Set nxt=Me.actNext
If Not nxt Is Nothing Then _
Call nxt.Action(uidoc,xContinue)
xContinue=False
End Sub

Sub Register
On Error GoTo ErrH
If Not Me.IsRegistred Then
On Event QuerySave From source Call Action
Me.isRegistred=True
End If
Quit:
Exit Sub
ErrH:
Error ERR_BASE, RaiseError
Resume Quit
End Sub
End Class

%REM
Class TemplQueryRecalc
Description: Comments for Class
%END REM
Private Class TemplQueryRecalc As FormAction
Sub New(), FormAction(source, {QueryRecalc})
End Sub
Sub Action(uidoc As NotesUIDocument, Continue)
Print {Action:} &Me.actName
Continue=False
End Sub

Sub Register
On Error GoTo ErrH
If Not Me.IsRegistred Then
On Event QueryRecalc From source Call Action
Me.isRegistred=True
End If
Quit:
Exit Sub
ErrH:
Error ERR_BASE, RaiseError
Resume Quit
End Sub
End Class

%REM
Class TemplPostSave
Description: Comments for Class
%END REM
Private Class TemplPostSave As FormAction
Sub New(), FormAction(source, {PostSave})
'		Set source=uidoc
End Sub
Sub Action(uidoc As NotesUIDocument)
Print {Action:} &Me.actName
End Sub

Sub Register
On Error GoTo ErrH
If Not Me.IsRegistred Then
On Event PostSave From source Call Action
Me.isRegistred=True
End If
Quit:
Exit Sub
ErrH:
Error ERR_BASE, RaiseError
Resume Quit
End Sub

End Class

%REM
Class TemplPostRecalc
Description: Comments for Class
%END REM
Private Class TemplPostRecalc As FormAction
Sub New(), FormAction(source, {PostRecalc})
'		Set source=uidoc
End Sub
Sub Action(uidoc As NotesUIDocument)
Print {Action:} &Me.actName
End Sub

Sub Register
On Error GoTo ErrH
If Not Me.IsRegistred Then
On Event PostRecalc From source Call Action
Me.isRegistred=True
End If
Quit:
Exit Sub
ErrH:
Error ERR_BASE, RaiseError
Resume Quit
End Sub

End Class

%REM
Class TemplQueryClose
Description: Comments for Class
%END REM
Private Class TemplQueryClose As FormAction
Sub New(), FormAction(source, {QueryClose})
End Sub
Sub Action(uidoc As NotesUIDocument, xContinue)
Print {Action:} &Me.actName
xContinue=False
End Sub

Sub Register
On Error GoTo ErrH
If Not Me.IsRegistred Then
On Event QueryClose From source Call Action
Me.isRegistred=True
End If
Quit:
Exit Sub
ErrH:
Error ERR_BASE, RaiseError
Resume Quit
End Sub
End Class
%REM
Class SubQuerySave
Description: Comments for Class
%END REM
Class SubQuerySave As FormAction
Sub New(), FormAction(source, {QuerySave})
End Sub
Sub Action(uidoc As NotesUIDocument, xContinue)
Print {Sub Action:} &Me.actName
xContinue=False
End Sub

Sub Register
On Error GoTo ErrH
If Not Me.IsRegistred Then
On Event QuerySave From source Call Action
Me.isRegistred=True
End If
Quit:
Exit Sub
ErrH:
Error ERR_BASE, RaiseError
Resume Quit
End Sub	
End Class
Sub Initialize
Set wks=New NotesUIWorkspace
Set ses=New NotesSession
Set formObj=New FormBase
gContinue=True
End Sub

%REM
Sub InitObjects
Description: Comments for Sub
%END REM
Sub InitObjects
On Error GoTo ErrH
Dim formObj As New FormBase
Dim act_QO As New TemplQueryopen()
Dim act_PO As New TemplPostOpen()
Call formObj.Register(act_QO)
Call formObj.Register(act_PO)
Quit:
Exit Sub
ErrH:
Error ERR_BASE, RaiseError()
Resume Quit
End Sub

%REM
Sub InitObjectsUI
Description: вызывать нужно из QueryOpen
%END REM
Sub InitObjectsUI(uidoc As NotesUIDocument, xMode As Integer, xIsnewdoc, Xcontinue)
On Error GoTo ErrH
If CStr(GetThreadInfo(LSI_THREAD_CALLPROC))<> CS_QUERYOPEN Then _
Error ERR_BASE, CS_CALLER_SB &CS_QUERYOPEN
If gContinue Then
Call formObj.InitObjectsUI(Uidoc, Xmode, Xisnewdoc, Xcontinue)
Else
xContinue=gcontinue
End if
Quit:
Exit Sub
ErrH:
gContinue=false
Error ERR_BASE, RaiseError()
Resume Quit
End Sub
для проверки вставил сабформу, в ней
Код:
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
On Error Goto ErrH	
Dim act_QS As New SubQuerySave()
Call formObj.Register(act_QS)
Goto Quit
ErrH:
Error 1024,RaiseError
Resume Quit
Quit:
End Sub
результат отрабатывает - цепочку QS, по коду формы
Код:
	  Print {Action:} &Me.actName
Dim nxt
'class casting
Set nxt=Me.actNext
If Not nxt Is Nothing Then _
Call nxt.Action(uidoc,xContinue)

Добавлено: т.о. получили возможность подключать обработку из сабформы к любой форме
разумеется - инстанс можно вынести в либу, тогда останется: Call formObj.Register(actSub_QS)
formObj - глобальный в либе (для формы)
основной момент - Use д.б. одинаковой! либы (в формах и сабформе)
 
  • Нравится
Реакции: alexas1

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
дополню - нотусятина 9.0
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
ещё момент - в сабформах мона воще в инит (наверняка) влепить код по цепочке (там уже есть uidoc)
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
517
Попытался объявить переменную с именем Access
Слово подсветилось, пишет, что есть такой Statement в help инфы нет, как пользоваться нет, google не особо помог.
Никто не натыкался?
 
30.06.2006
141
5
BIT
0
savl,

Это ключевое слово, которое используется для работы с файлами.
Посмотри в хелпе .

Список всех ключевых слов в LotusScript есть в теме хелпа .
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
517
точняк... никогда им не пользовался =)
а пункт Keywords я что-то у себя в хелпе пропустил, хотя помню, что он там был)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
Возвращаясь к старту топика - ТС давно не проявлялся на форуме, а изыскания были интересные...
Резьюм - достал дизигнер нотусевый, хочу кроссплатформенную ИДЕ для ЛС (в перспективе с дебугом - хотя, я давно им уже не пользовался)
ведь по логике:
цомпилятор в домине есть (в сервере например)
опт-коды есть
подсветка синтаксиса - вот в форуме даже есть :)
ДХЛ есть
чего не хватает для альтернативной ИДЕ кроме времени?
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
517
чего не хватает для альтернативной ИДЕ кроме времени?
Хм...
Для LS/Java/@ надо прикрутить подсказку... Не все же мы помним.
Редактор форм, вьюх... Вставка встроенных представлений
Если парсить XML в приемлимый вид, затем менять пару параметров, как в Scanez view... то да, это может прокатить...
Альтернатива xPage, которую можно править текстом...
Но все равно, камней там много, надо будет серьезно думать...
Самое простое - агенты, библиотеки.
[DOUBLEPOST=1425627445,1425627263][/DOUBLEPOST]Еще вопрос на чем реализовывать...
Ядро на у лотуса на С, есть API...
Честно, я бы не в сторону IDE лез, а кучу мелких приблуд для помощи в разарботке:
гибкое создание вьюх, сравнение дизайна, управление версией, обновления...
И все это уже существует, надо только собрать в одно целое и допилить.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
из-за угребищности нотусевого дизигнера я давно использую внешние ИДЕ для java
проблема возникает с бесшовным переносом
подсказки берутся их хелпа и документирования (как это и сделали щас)
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
348
По поводу "подсказок" я как-то уже давал ссылку Domino API Javadoc, подключается к любой Java IDE как обычный javadoc от любой библиотеки.

Что за проблема с "бесшовным переносом"?
[DOUBLEPOST=1426052991,1426052830][/DOUBLEPOST]
Никсоводы негодуют ... :)
Designer для Linux это хорошая тема, я бы обязательно себе поставил. Винда тогда вообще нужна не будет, т.к. только из-за него и держу.
 
Мы в соцсетях:

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