Skip to content

Delegation

The DataFlex Send, Set, and Get statements instruct an object to execute a method. We say that the object receives a message (or instruction) to execute a method. If the object does not have a definition for the method, then the message will be automatically passed to the object's parent. This is repeated until either the message is resolved or the message is passed to the outer-most parent and is still not resolved. When a message is unresolved in this way, an error is raised.

The process of passing an unresolved message on to the parent object is called delegation.

The following is an example of object design that takes advantage of message delegation.

Object oButtonPanel is a Panel
    Set Size to 50 70

    Procedure DoClose
        Send Info_Box "Goodbye!"
        Send Deactivate
    End_Procedure

    Object oButton1 is a Button
        Set Location To 10 10
        Set Label To "Button 1"

        Procedure OnClick
            Send Info_Box "I am button #1"
            Send DoClose
        End_Procedure
    End_Object

    Object oButton2 is a Button
        Set Location To 30 10
        Set Label To "Button 2"

        Procedure OnClick
            Send Info_Box "I am button #2"
            Send DoClose
        End_Procedure
    End_Object
End_Object

When clicked, both buttons send DoClose to the current object (themselves). However, neither button has a definition for the DoClose method; therefore, this message would be delegated and resolved by the parent object oButtonPanel.

Note that the objects in the above example define methods as part of the object definition rather than creating a subclass. This was done for simplicity and to demonstrate how delegation occurs more clearly.

Explicit Delegation

You can explicitly delegate a message to the current object's parent by executing a Delegate statement. An explicitly delegated message directly instructs the current object's parent to execute a method. If this method is not resolved in the parent, then the normal flow of message delegation will continue to the grand-parent object and so on.

All three method types can be explicitly delegated (Procedure, Procedure Set, and Function). The syntax for delegating a message is different for each type of method as outlined below:

Delegating Procedure Methods

Delegate Send {method-name} {Param1  ParamN}

Delegating Procedure Set Methods

Delegate Set {method-name} {Param1  ParamN} To {value1  valueN}

Delegating Function Methods

Delegate Get {method-name} {Param1  ParamN} To {receiving-variable}

You can see that the syntax for delegating a message is the same as the syntax for executing a method, except that the Delegate command is appended to the front of each statement. There is also no object reference when delegating a method. You are always delegating the message to the parent of the current object.

The following is an example of object design that takes advantage of explicit message delegation.

Object oPanel is a Panel
    Set Size to 50 70

    Object oButton1 is a Button
        Set Location To 10 10
        Set Label To "Button 1"

        Procedure OnClick
            Send Info_Box "I am button #1"
            Delegate Send Deactivate
        End_Procedure
    End_Object

    Object oButton2 is a Button
        Set Location To 30 10
        Set Label To "Button 2"

        Procedure OnClick
            Send Info_Box "I am button #2"
            Delegate Send Deactivate
        End_Procedure
    End_Object
End_Object

In the above example, the Delegate Send Deactivate statement ensures that it is the object oPanel that executes the Deactivate method. If this message was not delegated, then each button would try to deactivate itself when it was clicked rather than deactivate the whole panel since the Button class also understands the Deactivate method.

Refer to Methods in the Classes section for more information on calling methods.