Using COM/ActiveX in Lianja on Windows
Using COM/ActiveX with Lianja on Windows is quite straightforward.
You just use the CREATEOBJECT() built-in function in any of the supported scripting languages to create an object, and then use the ADDOBJECT() method on a Container to add COM/ActiveX components into your Apps.
COM/ActiveX is Windows specific so Apps that use this functionality will not run on Linux or Mac OS X
As with Visual FoxPro, you use the EVENTHANDLER() built-in function to connect the events emitted from the ActiveX control to a custom class which consumes these events in known methods corresponding to the names of the events that the particular ActiveX emits. This can be written in any of the supported scripting languages; Lianja/Visual FoxPro, Python, PHP or JavaScript.
Here is a simple example that embeds Internet Explorer into a "Form".
Example code
The code below will embed Internet Explorer into a Form. You can embed COM/ActiveX controls in any of the containers in the Lianja App Framework e.g. Form, Container, Control, or Page (Tab Page).
myform = createobject("form") myform.resize(800, 600) myform.addobject("ax", "{8856F961-340A-11D0-A96B-00C04FD705A2}") ax.anchor = 15 ax.navigate("http://www.lianja.com") myform.show()
Creating the COM/ActiveX component
You can specify the ActiveX control in several different formats.
The most efficient way is by using the registered component's UUID, e.g.
createObject("{8E27C92B-1264-101C-8A2F-040224009C02}")
The second fastest way is to use the registered control's class name (with or without version number), e.g.
createObject("MSCal.Calendar")
The slowest, but easiest way to use is to use the control's full name, e.g.
createObject("Calendar Control 9.0")
It is also possible to initialize the object from a file, e.g.
createObject("c:/files/file.doc")
If the component's UUID is used the following patterns can be used to initialize the control on a remote machine, to initialize a licensed control or to connect to a running object:
To initialize the control on a different machine use the following pattern:
createObject("DOMAIN/user:password@server/{8E27C92B-1264-101C-8A2F-040224009C02}")
To initialize a licensed control use the following pattern:
createObject("{8E27C92B-1264-101C-8A2F-040224009C02}:LicenseKey")
To connect to an already running object use the following pattern:
createObject("{8E27C92B-1264-101C-8A2F-040224009C02}&")
The first two patterns can be combined, e.g. to initialize a licensed control on a remote machine:
createObject("DOMAIN/user:password@server/{8E27C92B-1264-101C-8A2F-040224009C02}:LicenseKey")
Binding to events
Binding to events that are emitted from a COM/ActiveX component is simple. See below.
define class myeventhandler // handle the events you are interested in proc DownloadBegin() endproc proc DownloadComplete() endproc proc ProgressChange(currentvalue, maxvalue) endproc // The "Special" HandleEvent method can be used to trace events but be sure to remove it in production systems // as it incurs unnecessary performance overhead proc HandleEvent(name, arglist) endproc endclass ie = createObject("{8856F961-340A-11D0-A96B-00C04FD705A2}") myhandler = createObject("myeventhandler") eventHandler(ie, myhandler)
Notice how there is no need to use any special "implements" command as in VFP as Lianja will introspect the ActiveX component for you. Events that you do not have methods for are just ignored.
The "special" HandleEvent method can be used to catch all events. You determine what the name of the event is by looking at the name parameter.