WaBis

walter.bislins.ch

VbxObj: VBX-Funktionen

Die Funktionen des VBX-Objektes erlauben das Abfragen, ob globale Funktionen oder Member-Funktionen eines Objektes implementiert sind und ermöglichen den Aufruf dieser Funktionen per Funktionsname als String. Dasselbe gilt für das Abfragen von Objekt-Properties und den Zugriff darauf.
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

ProcExists

if VBX.ProcExists( aProcName ) then
aProcName: string
Name einer globalen Funktion (sub oder function) deren Existenz geprüft werden soll.

Gibt true zurück, wenn eine globale Funktion (sub oder function) mit dem Name aProcName existiert.

Anwendung

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

EvalGlobal

x = VBX.EvalGlobal( aExpression )
aExpression: string
Ein beliebiger VbScript-Ausdruck, der ausgeführt werden soll.

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.

MemberProcExists, MemberProcExistsI

if VBX.MemberProcExists( aObject, aProcName ) then
if VBX.MemberProcExistsI( aObject, aProcName ) then
aObject: object
Objekt, für welches die Existenz der Member-Funktion aProcName geprüft werden soll.
aProcName: string
Name der zu prüfenden Funktion (sub).

Gibt true zurück, wenn in aObject die Member-Funktion aProcName implementiert ist.

Implementation

Die Member-Funktion muss für MemberProcExists exakt wiefolgt definiert sein:

sub ProcName( bExec, aParams )

bzw. für MemberProcExistsI

sub ProcName( bExec, aIndex, aParams )
bExec: bool
wenn false darf die Funktion nichts ausführen!
aIndex: int
Irgendein Index-Wert, welcher die Funktion benötigt.
aParams: array of any
Funktions-Argumente.

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

Exec, ExecI, Eval

VBX.Exec aObject, aProcName, aParams
VBX.ExecI aObject, aProcName, aIndex, aParams
x = VBX.Eval( aObject, aProcName, aParams )
aObject: object
Objekt, dessen Member-Funktion (sub) aProcName ausgeführt werden soll.
aProcName: string
Name der auszuführenden Member-Funktion (sub).
aIndex: int
Irgendein Index-Wert, welcher die Funktion benötigt.
aParams: array of any
Argumente, die der Member-Funktion übergeben werden sollen.

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 )
bExec: bool
wenn false darf die Funktion nichts ausführen (Beschreibung siehe Implementation von MemberProcExists, MemberProcExistsI)!
aIndex: int
Irgendein Index-Wert, welcher die Funktion benötigt.
aParams: array of any
Funktions-Argumente.
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

HasProperty

if VBX.HasProperty( aObject, aPropertyName ) then
aObject: object
Objekt, für welches die Existenz des Properties aPropertyName abgefragt werden soll.
aPropertyName: string
Name des Properties, dessen Existenz abgefragt werden soll.

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

GetValue, GetObject

x = VBX.GetValue( aObject, aPropertyName )
set obj = VBX.GetObject( aObject, aPropertyName )
aObject: object
Objekt, dessen Property aPropertyName abgefragt werden soll.
aPropertyName: string
Name des abzufragenden Properties.

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 )

SetValue, SetObject

VBX.SetValue aObject, aPropertyName, aValue
VBX.SetObject aObject, aPropertyName, aValueObj
aObject: object
Objekt, dessen Property aPropertyName verändert werden soll.
aPropertyName: string
Name des zu ändernden Properties.
aValue: any, but not object
aValueObject: object

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 )

SetValues

VBX.SetValues aObject, aParams
aObject: object
Objekt, dessen Properties geändert werden sollen.
aParams: array
Array mit Paaren von Property-Name (string) und Wert.

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 )

Weitere Infos zur Seite
Erzeugt Dienstag, 17. August 2010
von wabis
Zum Seitenanfang
Geändert Samstag, 18. Juli 2015
von wabis