ProcExists | Abfrage, ob eine bestimmte globale Funktion (sub oder function) existiert. |
EvalGlobal | Wie VbScript eval, jedoch ohne Zugriff auf Objekt-Properties und -Funktionen, wenn von innerhalb einer Member-Funktion gerufen. |
MemberProcExists, MemberProcExistsI | Abfrage, ob eine bestimmte Member-Funktion existiert (sub). |
Exec, ExecI, Eval | Aufruf einer bestimmten Member-Funktion (sub oder function), deren Name als String vorliegt. |
HasProperty | Abfrage, ob ein bestimmtes Objekt-Property definiert ist. |
GetValue, GetObject | Wert eines Objekt-Properties abfragen, dessen Name als String vorliegt. |
SetValue, SetObject | Wert eines Objekt-Properties setzen, dess Name als String vorliegt. |
SetValues | Mehrere Property-Werte eines Objektes auf einmal setzen. |
Der Zugriff auf obige Funktionen erfolgt über das globale Objekt VBX:
x = VBX.Function( Arguments ) VBX.Function Arguments
if VBX.ProcExists( aProcName ) then
Gibt true zurück, wenn eine globale Funktion (sub oder function) mit dem Name aProcName existiert.
Der Webmaster soll einer Wiki-App beliebige Designs verpassen können. Die Wiki-App ruft dazu an verschiedenen Stellen Layout-Funktionen (z.B. AppLayoutHeader), die der Webmaster zu implementieren hat. Die Layout-Funktionen erzeugen den HTML-Code des Frameworks (Rahmen) des Layout, während das Wiki die Wiki-Seite darin einbettet.
Das Wiki ruft also bestimmte globale Funktionen auf, um das Layout einer Seite zu erzeugen. Wenn eine solche Funktion nicht existiert, z.B. weil eine im Wiki eingebaute Standard-Funktion ausreichend ist, kann der Webmaster die entsprechende Funktion einfach weglassen. Damit beim Ausführen des Wiki keine Fehlermeldung des Compilers generiert wird, weil eine gerufene globale Funktion nicht implementiert ist, kann das Wiki die Funktion VBX.ProcExists rufen, um herauszufinden, ob die Funktion existiert oder nicht:
sub WikiRenderLayout() : if VBX.ProcExists("AppLayoutHeader") then AppLayoutHeader else WikiLayoutHeader end if : end sub
x = VBX.EvalGlobal( aExpression )
Die in VbScript eingebaute Funktion eval hat Zugriff auf Objekt-Properties, wenn sie innerhalb einer Member-Funktion aufgerufen wird. Soll ein Ausdruck aExpression jedoch nur Zugriff auf global definierte Objekte und Variablen haben, so muss die Funktion VBX.EvalGlobal verwendet werden.
Wenn aExpression ein ungültiger Ausdruck ist oder Syntax-Fehler enthält wird ein entsprechendes Exception generiert.
if VBX.MemberProcExists( aObject, aProcName ) then if VBX.MemberProcExistsI( aObject, aProcName ) then
Gibt true zurück, wenn in aObject die Member-Funktion aProcName implementiert ist.
Die Member-Funktion muss für MemberProcExists exakt wiefolgt definiert sein:
sub ProcName( bExec, aParams )
bzw. für MemberProcExistsI
sub ProcName( bExec, aIndex, aParams )
VbScript bietet keine Möglichkeit, die Existenz einer Member-Funktion abzufragen. Die einzige Möglichkeit herauszufinden ob eine Member-Funktion existiert besteht darin, diese aufzurufen. Wenn dabei ein Feher auftritt, kann nicht ermittelt werden, ob nun die Funktion nicht existiert, oder ob bei der Ausführung der Funktion ein Fehler aufgetreten ist.
Um dieses Problem zu lösen, wurde folgender Trick angewandt: Die Member-Funktion muss das Argument bExec haben. Wenn beim Aufruf der Member-Funktion bExec=false gesetzt ist, muss die Member-Funktion sofort abbrechen. Wenn bExec=true ist, wird die Member-Funktion normal ausgeführt.
Die Funktionen MemberProcExists rufen nun die Member-Funktion aProcName mit bExec=false auf. Wenn die Funktion nicht existiert, wird von VbScript ein Fehler erzeugt, der von MemberProcExists abgefangen wird. In diesem Fall gibt MemberProcExists false zurück. Wenn die Funktion aber existiert, gibt es keinen Fehler, da die Funktion nichts ausführt (bExec=false). Daher gibt in diesem Fall MemberProcExists true zurück.
Bei einem normalen Aufruf der Member-Funktion muss immer bExec=true übergeben werden!
class myClass : sub OnActionSave( bExec, aParams ) if not bExec then exit sub : end sub : end class dim myObj set myObj = new myClass if VBX.MemberProcExists( myObj, "OnActionSave" ) then myObj.OnActionSave true, Array() else ' Fehler: OnActionSave existiert nicht! end if
VBX.Exec aObject, aProcName, aParams VBX.ExecI aObject, aProcName, aIndex, aParams x = VBX.Eval( aObject, aProcName, aParams )
Ruft die Member-Funktion aProcName des Objektes aObject auf und übergibt ihr unter Anderem den Array aParams.
Die Member-Funktionen müssen für Exec, ExecI bzw. Eval exakt wiefolgt definiert sein:
sub ProcName( bExec, aParams ) sub ProcName( bExec, aIndex, aParams ) function ProcName( bExec, aParams )
dim myObj, action set myObj = new myClass action = "OnAction" & GetAction() if VBX.MemberProcExists( myObj, action ) then VBX.Exec myObj, action, Array() else ' Fehler: Member-Funktion action existiert nicht! end if
if VBX.HasProperty( aObject, aPropertyName ) then
Gibt true zurück, wenn aObject das Property aPropertyName enthält.
dim myObj, value set myObj = new myClass if VBX.HasProperty( myObj, "MyProp" ) then value = myObj.MyProp else value = "" end if
x = VBX.GetValue( aObject, aPropertyName ) set obj = VBX.GetObject( aObject, aPropertyName )
Abfragen eines Wertes eines Objekt-Properties, dessen Name als String aPropertyName vorliegt. Wenn der Property-Wert ein Objekt ist, muss GetObject verwendet werden, sonst GetValue.
Require: VBX.HasProperty( aObject, aPropertyName )
VBX.SetValue aObject, aPropertyName, aValue VBX.SetObject aObject, aPropertyName, aValueObj
Setzen des Wertes eines Objekt-Properties, dessen Name als String aPropertyName vorliegt. Wenn der Wert ein Objekt ist, muss SetObject verwendet werden, sonst SetValue.
Require: VBX.HasProperty( aObject, aPropertyName )
VBX.SetValues aObject, aParams
Ruft für jedes Name/Wert-Paar in aParams die Funktion SetValue.
class myClass dim Name dim Age : sub Init( aParams ) VBX.SetValues me, aParams end sub : end class dim myObj set myObj = new myClass myObj.Init Array( "Name", "Walter Bislin", "Age", 50 )