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 lapplicazione, il grafico è visualizzato nel controllo OLE, inoltre MSGraph è aperto automaticamente in modo che sia possibile modificare i dati rappresentati nel grafico.
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 dellapplicazione sia il nome del file di dati, LINKITEM contiene il nome dellelemento 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 lesecuzione
Sub Check1_Click ()
Text1.LinkMode = NONE
Text1.LinkTopic = "Excel|Foglio1"
Text1.LinkItem = "R1C1"
Text1.LinkMode = LINK_AUTOMATIC
End Sub
Si può modificare LinkItem durante lesecuzione, basta utilizzare un contatore per sapere quante volte si fa clic nella Checkbox; in questo modo si evita linterruzione del collegamento con il server prima di passare ad un nuovo elemento.
Collegamento manuale client durante lesecuzione
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 lesecuzione
Dallapplicazione 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 dellapplicazione DDE. Se le applicazioni la devono usare come server, dovranno rivolgersi ad unapplicazione che ha come LinkTopic = source|form1.
Si può ora sviluppare unapplicazione client che legga limmagine 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, limmagine 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 lintera 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 simposti come server, al successivo clic sinseriscono dei rettangoli casuali. Si esegua lapplicazione 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 dellimmagine.
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 lapplicazione 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
Invia dati dal server al client.
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.
Cosa accade se laltra 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 lapplicazione fosse stata server gli errori di questo tipo avrebbero dovuto essere intercettati dalla form.
È 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)
È generato quando il collegamento è chiuso. Entrambi si verificano per lapplicazione 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 allutente di stabilire un collegamento tra la form ed unapplicazione esterna a sua scelta, in pratica non è possibile prevedere con quale applicazione sarà stabilito il collegamento. Quando lutente seleziona Modifica/Incolla collegamento, vuole incollare nellapplicazione, 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 delloggetto e dellelemento DDE: Applicazione|Oggetto!Elemento.
Si dà, ora, la possibilità allutente dimpostare 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 sinserisce DDEData$ negli Appunti, inoltre è possibile verificare il tipo di controllo attivo tramite TypeOf.
Creazione di controlli personalizzati
Il file dinizializzazione e registrazione di un controllo è init.c