Differences between #Com_Owner, #Com_Ancestor and #Com_Self

Date:18 November 2002
Product/Release:Visual LANSA V9.1 and above
Abstract:Differences between #Com_Owner, #Com_Ancestor and #Com_Self
Submitted By:LANSA Technical Support
Last Review:November 2010

#Com_Owner, #Com_Ancestor and #Com_Self

The generic name #Com_Owner can be used to refer to the current component. In the context of inheritance there are two other generic names you can use for components: #Com_Ancestor and #Com_Self.

#Com_Ancestor is a generic reference to the ancestor of the current component and #Com_Self is a generic reference to the currently executing component.

#Com_Owner and #Com_Self

To see in what way #Com_Owner and #Com_Self differ, create two reusable parts with this code:

Button 3 - This button reusable part contains a method MethodOne which displays a message saying Hello. The message is displayed when this button (Button3, in other words #Com_Owner) is clicked.

FUNCTION options(*DIRECT)
BEGIN_COM role(*EXTENDS #PRIM_PHBN) CAPTION('Button 3') HEIGHT(24) WIDTH(185)
MTHROUTINE name(MethodOne)
USE builtin(MESSAGE_BOX_SHOW) with_args(OK OK INFO '' 'Hello') to_get(#STD_OBJ)
ENDROUTINE

EVTROUTINE handling(#COM_OWNER.Click)
INVOKE method(#com_owner.methodone)
ENDROUTINE
END_COM 

Button 4 - This button reusable part inherits from Button3 and redefines MethodOne so that the message says Bye.

FUNCTION options(*DIRECT)
BEGIN_COM role(*EXTENDS #BUTTON3) CAPTION('Button 4') HEIGHT(26) WIDTH(176)
MTHROUTINE name(MethodOne) options(*redefine)
USE builtin(MESSAGE_BOX_SHOW) with_args(OK OK INFO '' 'Bye') to_get(#STD_OBJ)
ENDROUTINE
END_COM

Add these buttons to a form and compile and execute the form. Click on both buttons. They both display a message saying ‘Hello':

Buttons 2 & 4

Hello Message

In other words the redefined method which would display the message ‘Bye' is not used for Button 4 because the Click event defined in Button 3 invokes the method in the component where it is defined (#Com_Owner):

INVOKE method(#com_owner.methodone)

Next change the invoke command in the Click event of Button 3 to use #Com_Self instead of #Com_Owner so that the Click event invokes the method in the component where the event is executed:

INVOKE method(#com_self.methodone)

Compile Button 3 and execute your form again. This time when you click on Button 4, the redefined method is used and the message ‘Bye' is displayed:

Bye Message

#Com_Ancestor

If you want to invoke a method in an ancestor component, you can refer to it by qualifying the name of the method using the generic name #com_ancestor.

For example, to continue with the above example, you can invoke the MethodOne method in Button 3 from the redefined MethodOne in Button 4 like this:

MTHROUTINE name(MethodOne) options(*redefine)
INVOKE method(#com_ancestor.methodone)
USE builtin(MESSAGE_BOX_SHOW) with_args(OK OK INFO '' 'Bye') to_get(#STD_OBJ)
ENDROUTINE

Compile Button 4 and run your test form. When you click on Button 4 first the MethodOne from the ancestor Button 3 is invoked:

Hello Message

And then when you click OK, the Message_Box_Show builtin showing the text ‘Bye' defined in Button 4 is displayed:

Bye Message