Hi,
ich habe mich gerade mit dem LotusScript-Befehl Execute() beschäftigt. Den hatte ich noch nie verwendet. So wie ich das verstehe kann man halt dynamisch Code erzeugen und ausführen. Könnte praktisch sein.
Dann habe ich mal geschaut, wo HCL den nutzt. Z.B. im v12-Mailtemplate, irgendwo bei den Signaturen. Dort nutzt HCL das aber für statischen Code.
D.h. sie setzen eine Variable 'script', die dann ausgeführt wird:
script = |Dim wksp As New NotesUIWorkspace
Dim uiDoc As NotesUIDocument
Set uiDoc = wksp.CurrentDocument
If Not(lcase(uiDoc.Currentfield) = "body") Then
Call uiDoc.GotoField("Body")
End If
[...]
|
[...]
Execute(script)
[...]
Warum macht man das? Man könnte doch auch einfach an dieser Stelle den Code direkt ausführen, da er ja immer identisch ist. HCL nutzt diese Technik - immer mit statischem Code - an mehreren Stellen. Nur, was erreicht man damit im Gegensatz zum direkt eingefügtem, "echten" Code?
Die statischen Skripte kann ich auch nicht verstehen, aber Execute kann zum Beispiel genutzt werden, um dynamisch Skript Bibliotheken zu laden.
Beispiel Code (der funktioniert nicht, nur um das Prinzip zu zeigen):
Dim lib as Variant
If Typ = "A" Then
script = {Use "Lib-Typ-A"
Set lib = New Lib-Typ()}
Elseif Typ = "B" Then
script = {Use "Lib-Typ-B"
set lib = New Lib-Typ()}
Else
script = {Use "Lib-Typ-Sonstige"
set lib = New Lib-Typ()}
End If
Execute script
Call lib.macheWas()
Je nach Inhalt der Variable Typ wird eine andere Skript Bibliothek geladen und das Objekt lib als Klasse Lib-Typ initialisiert. Nach dem Execute ist die Variant Variable lib mit der Klasse Lib-Typ initialisiert und die Methoden/Eigenschaften können verwendet werden.
Zweite Möglichkeit, die ich selber bereits mehrfach verwendet habe: ich habe Standard Skript Bibliotheken, die durch Kunden erweitert werden können. Die Kunden können direkt die Skript Bibliothek ändern, dann gibt es ein Problem beim nächsten Update. Oder der Kunde schreibt seinen Skript Code im Designer und testet das. Sobald der Code funktioniert, per Copy&Paste in ein Notes Dokument einfügen. In meiner Skript Bibliothek lese ich den Code aus dem Notes Dokument aus und nutze Execute, um den Kunden Code auszuführen.
Dadurch kann ich jederzeit ein Update meiner Standard Skript Bibliothek machen, ohne die Funktionen des Kunden zu überschreiben.
Weiterer Vorteil: die Skript Bibliotheken müssen nicht mehr neu kompiliert werden nach jedem Update
Ich verwende das in der N4Y Toolbar, um dynamisch eine globale Variable mit der richtigen Klasse zu initialisieren. Daruch kann ich immer weitere Funktionen hinzufügen und muss über den jeweiligen Symbolleisten- Button nur den Klassennamen mitgeben:
actionClass = g_ctx.ses.Getenvironmentstring("N4Y_Toolbar_Action_Name")
Call g_ctx.ses.Setenvironmentvar("N4Y_Toolbar_Action_Name", "")
classBuilder = |
Use "N4Y.ToolbarActionLib"
Sub Initialize
Set g_toolbarAction = New TA_| & actionClass & |
End Sub
|
On Error Goto ErrorExecute
Execute classBuilder
On Error Goto ErrorRoutine
Und der ErrorHandler fängt gleich noch ab, wenn es die Klasse gar nicht gibt und gibt eine entsprechende Meldung aus