Delegate
From Xojo Documentation
A Delegate data type is an object representing a specific method.
Notes
A Delegate data type is an object representing a specific method. It is a function pointer with a method signature.
Delegates decouple interface from implementation in a similar way to events or interfaces. This decoupling allows you to treat a method implementation as a variable that is changeable based on run-time conditions. They represent methods that are callable without knowledge of the target object. You can change the function the delegate points to on the fly.
A Delegate can be declared in either a module or a class. You use the Project → Add→ Delegate menu command or the (optional) Add Delegate button in the Code Editor to create a Delegate entry.
A delegate must have a name and can have optional parameters and a return type.
| Methods | |
|
| Constructors | |
|
Usage
For use in XojoScript code:
Delegate Sub name [(parameterList)]
or
Delegate Function name ([parameterList]) As type
| Part | Description |
|---|---|
| name | Required. The name of the delegate. |
| parameterList | Optional list of values representing parameters that are passed to the method when it is called. Multiple parameters are separated by commas. |
| type | Optional. The data type of the value returned by the function. |
Notes
A Delegate is a function pointer with a method signature. It has a single method, “Invoke” whose parameters and return value match the Delegate’s parameters and return type. The Invoke method calls the method the delegate instance represents.
| While delegates are objects, you cannot create a subclass of a delegate type. |
Creating a Delegate Value
Once you have added the Delegate as described above, create a variable or property of your delegate type. For example, if you named your Delegate MyDelegate, you would declare a variable or property with myProp As MyDelegate.
There are two ways to create values that can be stored in delegates:
Usually, AddressOf (and WeakAddressOf) are used, taking an existing method and returning a function pointer in form of a delegate.
The other way is to specify a function pointer address of type Ptr, passing it to a delegate constructor. Assuming that there's a Delegate declared as Sub SimpleProc(), this could work as follows:
Sample Code
Suppose you've added a Delegate named MethodCaller with no parameters or return type, and there is a checkbox MethodCheck that will determine which method to use.
If MethodCheck.Value Then
callMethod = AddressOf TestMethod
Else
callMethod = AddressOf AnotherMethod
End If
callMethod.Invoke
If you've defined your Delegate with parameters and a return type, the code might look like this instead:
See the Delegate.Invoke method for more examples.
A Delegate is a good way to allow one object to send the same message to various other objects. You can define a Register method that takes the Delegate as a parameter and adds it to an array of your Delegate type.
When you need to send a message, you can call each Delegate in the array in a loop.
For Each d As MessageDelegate In MessageDelegateArray
If d <> Nil Then
d.Invoke(msg)
End If
Next d
End Sub
You should also provide a method to Unregister a Delegate to remove it from the array.
See Also
Var, Static, Declare statements; -, +, *, /, <, <=, =, >=, >, <> VarType functions; AddHandler, Boolean, Byte, CFStringRef, Color, CString, Currency, Delegate, Double, Int16, Int32, Int64, Int8, Integer, OSType, PString, Ptr, Short, Single, String, UInt16, UInt32, UInt64, UInt8, Variant, WindowPtr, WString data types. IsNumeric, Mod, Str, Val, Vartype, functions.
