OLE

Occorre il custom control MSOLE2.VBX per collegare o incorporare oggetti in fase di creazione. Per esempio, nella form inserire OLE dalla Toolbox, è visualizzata la casella di riepilogo Insert Object selezionare quindi il tipo di oggetto, MSGraph. Visual BASIC apre un grafico in cui si possono inserire i dati desiderati, alla fine si esce con File/aggiorna. Quando si esegue l’applicazione, il grafico è visualizzato nel controllo OLE, inoltre MSGraph è aperto automaticamente in modo che sia possibile modificare i dati rappresentati nel grafico.

 


 

DDE

Il DDE funziona tramite gli Appunti; esistono due modi di aprire un collegamento client:

automatico, i dati sono aggiornati automaticamente nel client ogni volta che subiscono delle modifiche nel server;

manuale, i dati sono aggiornati solo su richiesta del client.

Se si volessero leggere i dati di Excel (server), ci si dovrebbe configurare come client; in Visual BASIC ci sono tre controlli che possono fungere da client, ovvero ricevere dati DDE, le Texbox, le Picturebox e le Label.

Invece, solamente le form possono fungere da server ed inviare dati DDE: non possono essere manuali o automatici.

 

Collegamento client in fase di creazione

In fase di disegno si possono stabilire solo collegamenti automatici e non manuali. Per esempio, copiare del testo da Word (server) tramite Modifica/Copia quindi si selezioni Text1 (client) e si scelga Edit/Paste link.

Le informazioni relative a questo collegamento sono memorizzate nelle proprietà di Text1: LINKMODE, LINKTOPIC contiene sia il nome dell’applicazione sia il nome del file di dati, LINKITEM contiene il nome dell’elemento particolare, per Excel R1C1, LINKTIMEOUT specifica il periodo di tempo, in decimi di secondo, entro il quale deve essere stabilito il collegamento DDE.

 

Collegamento server in fase di creazione

Da una Textbox selezionare Edit/Copy, da Word Modifica/Incolla collegamento. Da notare che Text1.LinkMode = 0, ma Form1.LinkMode = 1 (server), Form1.LinkTopic = Form1 (applicazione DDE).

 

Collegamento automatico client durante l’esecuzione

Sub Check1_Click ()

Text1.LinkMode = NONE

Text1.LinkTopic = "Excel|Foglio1"

Text1.LinkItem = "R1C1"

Text1.LinkMode = LINK_AUTOMATIC

End Sub

Si può modificare LinkItem durante l’esecuzione, basta utilizzare un contatore per sapere quante volte si fa clic nella Checkbox; in questo modo si evita l’interruzione del collegamento con il server prima di passare ad un nuovo elemento.

 

Collegamento manuale client durante l’esecuzione

Sub Check1_Click ()

Text1.LinkMode = NONE

Text1.LinkTopic = "Excel|Foglio1"

Text1.LinkItem = "R1C1"

Text1.LinkMode = LINK_MANUAL

End Sub

Sub Form_Click ()

Text1.LinkRequest

End Sub

Si prelevano i dati semplicemente facendo clic nella form.

 

Collegamento server durante l’esecuzione

Dall’applicazione Paintbrush Modifica/Copia, da Visual BASIC si crei una Picturebox con AUTOREDRAW = TRUE e si faccia Edit/Paste. Clic su form1

 

Sub Form_Click ()

Static first

first = first + 1

If first = 1 Then

LinkTopic = "Figure"

LinkMode = LINK_SOURCE

Else

x1 = Picture1.ScaleWidth * Rnd

y1 = Picture1.ScaleHeight * Rnd

x2 = Picture1.ScaleWidth * Rnd

y2 = Picture1.ScaleHeight * Rnd

Picture1.Line (x1,y1) - (x2,y2), , B

End If

End Sub

Quando si assegna il nome al file source.exe, diventa anche il nome dell’applicazione DDE. Se le applicazioni la devono usare come server, dovranno rivolgersi ad un’applicazione che ha come LinkTopic = source|form1.

Si può ora sviluppare un’applicazione client che legga l’immagine in source.exe. Lanciare source.exe ed aprire un nuovo progetto con una Picturebox con AUTOREDRAW=TRUE e AUTOSIZE=TRUE quindi si fa clic nella form, l’immagine deve essere trasferita dal server al client.

 

Sub Form_Click ()

Picture1.LinkMode = NONE

Picture1.LinkTopic = "Source|Figura"

Picture1.LinkItem = "Picture1"

Picture1.LinkMode = LINK_AUTOMATIC

End Sub

Con un collegamento automatico il server invia al client l’intera immagine ogni volta che si è modificato anche un solo pixel. Visual BASIC risolve il problema inviando gli aggiornamenti solo quando il server lo richiede tramite LINKSEND.

Si supponga, per esempio, che al primo clic source.exe s’imposti come server, al successivo clic s’inseriscono dei rettangoli casuali. Si esegua l’applicazione client, si noterà che i rettangoli non appaiono nella Picturebox; si può correggere questo problema inserendo in source frm un Commandbutton con codice:

 

Sub Command1_Click ()

Picture1.LinkSend

End Sub

per inviare al client una versione aggiornata dell’immagine.

 

Il metodo LinkPoke

Invia i dati dal client al server, solitamente i dati transitano dal server al client in modo automatico o manuale. Tuttavia con questo metodo è possibile invertire la direzione del flusso dei dati.

Modificare l’applicazione client in modo che al primo clic si stabilisca il collegamento, al secondo clic si disegni un cerchio modificando la figura inviata dal server. A questo punto ilcerchio è nel client e non nel server; tuttavia, si può, temporaneamente invertire la direzione del collegamento DDE con LinkPoke.

 

Sub Form_Click ()

Static first

first = first + 1

If first = 1 Then

Picture1.LinkMode = NONE

Picture1.LinkTopic = "Source|Figura"

Picture1.LinkItem = "Picture1"

Picture1.LinkMode = LINK_AUTOMATIC

Else

x = Picture1.ScaleWidth / 2

y = Picture1.ScaleHeight / 2

r = Picture1.Width / 5

Picture1.Circle (x, y), r

Picture1.LinkPoke

End If

End Sub

 

Il metodo LinkSend

Invia dati dal server al client.

 

Il metodo LinkExecute

Invia comandi ad un server DDE.

 

Sub Check1_Click ()

Text1.LinkMode = NONE

Text1.LinkTopic = "Excel|Foglio1"

Text1.LinkItem = "R1C1"

Text1.LinkMode = LINK_AUTOMATIC

Text1.LinkExecute "[file.apri(""c:\excel\foglio.xls""][bip][file.chiudi()][file.esci()]"

End Sub

Non tutte le applicazioni Windows che supportano il DDE possono accettare comandi in questo modo, ad esempio Word non è in grado di farlo.

 

Gestione degli errori DDE

Cosa accade se l’altra applicazione non è in esecuzione?

Si otterrebbe un messaggio di errore, che è catturabile per cui è possibile predisporre un sistema di gestione.

 

Sub Check1_Click ()

On Error GoTo pippo

Text1.LinkMode = NONE

Text1.LinkTopic = "Excel|Foglio1"

Text1.LinkItem = "R1C1"

Text1.LinkMode = LINK_AUTOMATIC

Text1.LinkExecute "[file.apri(""c:\excel\foglio.xls""][bip][file.chiudi()][file.esci()]"

Exit Sub

Pippo:

If Err = 28 Then

temp = Shell ("c:\excel\excel.exe")

Resume

Else

MsgBox "Errore numero" + Str$(Err)

Exit Sub

End If

End Sub

Quando si verifica un errore DDE è generato un evento LinkError, associato alle form, alle Textbox, alle Picturebox ed alle label. Per esempio, due errori DDE molto frequenti sono:

7, numero eccessivo di collegamenti;

11, memoria esaurita.

 

Sub Text1_LinkError (LinkError As Integer)

If LinkError = 7 Then

MsgBox "Troppi collegamenti DDE"

End If

If LinkError = 11 Then

MsgBox "Memoria esaurita per il DDE"

End If

End Sub

Si noti che se l’applicazione fosse stata server gli errori di questo tipo avrebbero dovuto essere intercettati dalla form.

 

L’evento LinkOpen

È generato quando è stabilito un collegamento, inoltre può rifiutarlo perchè il suo codice accetta come argomento Cancel impostato a True.

Sub Form_LinkOpen (Cancel As Integer)

 

L’evento LinkClose

È generato quando il collegamento è chiuso. Entrambi si verificano per l’applicazione server o per quella client.

 

Incolla collegamento nel codice (client) e copia nel codice (server)

Si supponga di avere una form con due Textbox e di voler permettere all’utente di stabilire un collegamento tra la form ed un’applicazione esterna a sua scelta, in pratica non è possibile prevedere con quale applicazione sarà stabilito il collegamento. Quando l’utente seleziona Modifica/Incolla collegamento, vuole incollare nell’applicazione, dati che si trovano negli Appunti: memorizzati in una zona riservata al DDE.

 

Sub PasteItem_Click ()

DDEData$ = Clipboard.GetText (CF_LINK)

Screen.ActiveControl.LinkMode = NONE

Screen.ActiveControl.LinkTopic = Left$ ((DDEData$, InStr (DDEData$,"!")-1)

Screen.ActiveControl.LinkItem=Right$(DDEData$,Len(DDEData$)-InStr(DDEData$,"!"))

Screen.ActiveControl.LinkMode = LINK_AUTOMATIC

End Sub

La costante CF_LINK indica che si vogliono prelevare dati DDE, quindi si deve sapere quale delle due Textbox possiede il focus. Successivamente si devono decifrare i nomi dell’oggetto e dell’elemento DDE: Applicazione|Oggetto!Elemento.

Si dà, ora, la possibilità all’utente d’impostare un collegamento server con una qualunque applicazione che supporti il DDE. Si devono caricare i dati DDE negli Appunti con Modifica/Copia.

 

Sub CopyItem_Click ()

Clipboard.Clear

DDEData$ = "Custom|Form1!" + Screen.ActiveControl.Tag

Clipboard.SetText DDEData$, CF_LINK

If TypeOf Screen.ActiveControl Is TextBox Then

Clipboard.SetText Screen.ActiveControl.Text

Enf If

If TypeOf Screen.ActiveControl Is Label Then

Clipboard.SetText Screen.ActiveControl.Caption

Enf If

If TypeOf Screen.ActiveControl Is PictureBox Then

Clipboard.SetText Screen.ActiveControl.Picture

Enf If

End Sub

Per prima cosa si cancellano gli Appunti, quindi si assembla la stringa DDEData$. Il problema è sapere quale Texbox fornisce i dati, Visual BASIC mette a disposizione la proprietà TAG che è una stringa per ciascun oggetto: Text1.Tag = Text1. A questo punto s’inserisce DDEData$ negli Appunti, inoltre è possibile verificare il tipo di controllo attivo tramite TypeOf.

 


 

Creazione di controlli personalizzati

Il file d’inizializzazione e registrazione di un controllo è init.c