Getting information about a class’s scripts
This section has code fragments illustrating how to get script
information from a ClassDefinition object called cd_windef.
For examples of assigning a value to cd_windef, see Getting a class definition
object.
List of scripts
The ScriptList array holds ScriptDefinition objects for all the
functions and events defined for a class. If a function is overloaded,
it will appear in the array more than once with different argument
lists. If a function or event has code at more than one level in the
hierarchy, it will appear in the array for each coded version.
This example loops through the ScriptList array and builds a list
of script names. All objects have a few standard functions, such as
ClassName and PostEvent, because all objects are inherited from
PowerObject:
|
1 2 3 4 5 6 7 8 9 10 |
string s, lineend integer li ScriptDefinition sd lineend = "~r~n" FOR li = 1 to UpperBound(cd_windef.ScriptList) sd = cd_windef.ScriptList[li] s = s + sd.Name + " " + lineend NEXT mle_1.Text = s |
This example amplifies on the previous one and accesses various
properties in the ScriptDefinition object. It reports whether the script
is a function or event, whether it is scripted locally, what its return
datatype and arguments are, and how the arguments are passed:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
string s, lineend integer li, lis, li_bound ScriptDefinition sd lineend = "~r~n" FOR li = 1 to UpperBound(cd_windef.ScriptList) sd = cd_windef.ScriptList[li] s = s + sd.Name + " " CHOOSE CASE sd.Kind CASE ScriptEvent! // Events have three relevant properties // regarding where code is defined s = s + "Event, " IF sd.IsScripted = TRUE then s = s + "scripted, " END If IF sd.IsLocallyScripted = TRUE THEN s = s + "local, " END IF IF sd.IsLocallyDefined = TRUE THEN s = s + "local def," END IF CASE ScriptFunction! // Functions have one relevant property // regarding where code is defined s = s + "Function, " IF sd.IsLocallyScripted = TRUE THEN s = s + "local, " END IF END CHOOSE s = s + "returns " + & sd.ReturnType.DataTypeOf + "; " s = s + "Args: " li_bound = UpperBound(sd.ArgumentList) IF li_bound = 0 THEN s = s + "None" FOR lis = 1 to li_bound CHOOSE CASE sd.ArgumentList[lis]. & CallingConvention CASE ByReferenceArgument! s = s + "REF " CASE ByValueArgument! s = s + "VAL " CASE ReadOnlyArgument! s = s + "READONLY " CASE ELSE s = s + "BUILTIN " END CHOOSE s = s + sd.ArgumentList[lis].Name + ", " NEXT s = s + lineend NEXT mle_1.text = s |
Where the code is in the inheritance
hierarchy
You can check the IsLocallyScripted property to find out whether a
script has code at the class’s own level in the inheritance hierarchy.
By walking back up the inheritance hierarchy using the Ancestor
property, you can find out where the code is for a script.
This example looks at the scripts for the class associated with
the ClassDefinition cd_windef, and if a script’s code is defined at this
level, the script’s name is added to a drop-down list. It also saves the
script’s position in the ScriptList array in the instance variable
ii_localscript_idx. The DropDownListBox is not sorted, so the positions
in the list and the array stay in sync:
|
1 2 3 4 5 6 7 8 9 10 11 |
integer li_pos, li FOR li = 1 to UpperBound(cd_windef.ScriptList) IF cd_windef.ScriptList[li].IsLocallyScripted & = TRUE THEN li_pos = ddlb_localscripts.AddItem( & cd_windef.ScriptList[li].Name) ii_localscript_idx[li_pos] = li END IF NEXT |
Matching function
signatures
When a class has overloaded functions, you can call
FindMatchingFunction to find out what function is called for a
particular argument list.
For an example, see FindMatchingFunction in the PowerScript
Reference.