Come accennato nella sezione precedente, QOLEOBJECT implementa un controllore di automazione. Questo componente funzione in modo simile a VB (no, VB non ha un componente QOLEOBJECT), tranne che per alcuni aspetti che sono implementati in modo diverso o non ancora supportati. Vediamo alcuni esempi confrontando i due metodi:
' Bontrambi gli esempi utilizzano MS WORD
' in VB
DIM Obj AS OBJECT
Set Obj = CreateObject('Word.Basic')
' or just DIM Obj AS Word.Basic
Obj.AppShow
' in Rapid-Q
DIM Obj AS QOLEOBJECT
Obj.CreateObject('Word.Basic')
Obj.AppShow
Notate che Typecheck è OFF per OBJECT and QOLEOBJECT, così quando viene chiamato Obj.AppShow in realtà si chiama il metodo AppShow in MS WORD. Notate anche che Rapid-Q supporta il metodo Invoke. Questo serve ad eliminare alcune ambiguità, ed anche per fornire un'alternativa. Cosa succede se MS Word possiede un metodo che si chiama CreateObject? In Rapid-Q ciò provoca dei problemi in quanto CreateObject è un metodo valido di QOLEOBJECT, così il metodo che sarà chiamato sarà quello di QOLEOBJECT, non quello di MS WORD. L'alternativa è l'utilizzo del metodo Invoke. ' in Rapid-Q
DIM Obj AS QOLEOBJECT
Obj.CreateObject('Word.Basic')
Obj.Invoke('CreateObject') ' Call CreateObject method in MS WORD
Ovviamente questo esempio non funziona, MS WORD non ha un metodo CreateObject, ma rende l'idea. Analogamente si possono definire e verificare proprietà: ' in Rapid-Q
DIM Obj AS QOLEOBJECT
Obj.CreateObject('Gif89.Gif89.1')
Obj.AutoStart = 1
Obj.Invoke('AutoStart') = 1 ' anche questo funziona
Cosa non supporta Rapid-Q? Diversi tipi di dati e matrici non sono ancora supportati, come pure alcuni eventi. Inoltre, non è disponibile il metodo 'set': ' in VB
DIM ADOCommand AS ADODB.Command
DIM ADOConnection AS ADODB.Connection
set ADOCommand.ActiveConnection = ADOConnection
La riga in rosso non è ancora disponibile in Rapid-Q. Nella sezione Appendice, sotto QOLEOBJECT, troverete il metodo InvokeCopy che ha la stessa funzione, ma al momento non è totalmente operativo .
15.3 QOLECONTAINER
QOLECONTAINER è fondamentalmente un contenitore che può contenere componenti ActiveX o documenti Active. Questo componente è molto simile a QOLEOBJECT, ed anche in questo caso Typecheck è Off, così potete automatizzarlo come fareste con un server. Userete spesso il metodo Invoke, in quanto QOLECONTAINER non possiede molte proprietà e metodi. Un modo per evitare questo problema consiste nell'assegnare il metodo Container di QOLEOBJECT. Questo crea un riferimento all'oggetto, e permette di utilizzare QOLEOBJECT per automatizzare il controllo. Per chi non li conoscesse bene, i controlli ActiveX sono controlli visuali riutilizzabili molto utilizzati in VB. Le limitazioni sono evidenti, Rapid-Q non supporta eventi, librerie ed altre cose già menzionate. '-- Un breve esempio
DIM Form AS QFORM
DIM Obj AS QOLECONTAINER
Obj.Parent = Form
Obj.CreateObject('gif89.gif89.1')
Siccome un controllo ActiveX è un componente visibile, noterete che QOLECONTAINER richiede una proprietà parent. Bisogna anche prestare attenzione al fatto che il componente ActiveX potrebbe aggiornare il componente prima che il form sia visualizzato, il che darebbe come risultato Can't focus a disabled or invisible window. QOLECONTAINER possiede una proprietà AutoShow che può essere valorizzata con Falso, nel senso che il controllo ActiveX non deve essere visualizzato quando viene creato. Potete usare il metodo Show di QOLECONTAINER per visualizzare il controllo in qualunque momento dopo aver creato l'oggetto. C'è un altro metodo per evitare il messaggio di errore, vi rimando all'appendice alla sezione QOLECONTAINER per un esempio completo.