vblogo

Programmare con Microsoft Visual Basic 6

Google
nel sito web
Introduzione
Form
Control
Oggetti
Input
Menu
Array
Visualizzazione stampa
Report
File
Errori
Clipboard
DDE
OLE
Database
Sql
Download
Bibliografia

 

 

CHE COS'E' DDE - DATA DYNAMIC EXCHANGE

DDE é un meccanismo di Windows che permette di scambiare dati tra 2 applicazioni o di fare eseguire i comandi di un'applicazione lanciati da un'altra. A differenza della Clipboard non é un'area di transito per i dati, ma un vero e proprio collegamento tra 2 applicazioni indipendenti tra loro. Inoltre la comunicazione può avvenire in entrambi i sensi. Da Visual Basic é possibile copiare dati in Excel ed eseguire delle formattazioni delle celle 'lanciando' dei comandi da Visual Basic.

dde

LINK

Un link é un collegamento tra 2 applicazioni tramite DDE: all'inizio si stabilisce quale sia l'applicazione chiamante e quella ricevente; la prima é detta Source o Applicazione Sorgente, la seconda Destination o Applicazione Destinazione o Destinatario. S i instaura poi il collegamento dando inizio al al link che può essere di 3 tipi: link automatico link notifica link manuale Il primo si ha quando il source fornisce nuovi dati a destination ogni volta che cambiano; il secondo tipo di link quando il source notifica a destination che ci sono nuovi dati ma che li trasferirà solo a richiesta; il terzo tipo di link avviene quando il source fornisce dati solo quando il destinatario il richiede. Per iniziare un dialog con DDE bisogna eseguire una serie di operazioni distinte tra Source e Destination.

 

DESTINATION

Bisogna individuare quale oggetto riceverà i dati provenienti dal Source e solo 3 control sono in grado di farlo: TextBox, Label e Picture; negli esempi seguenti useremo il textbox Text1 come control per i link. Bisogna poi assegnare dei valori alle propri età link del control scelto. Queste proprietà sono: linkTopic, linkItem, linkTimeout, linkMode

LinkTopic

specifica il nome del source da cui si riceveranno dati che può essere Excel o un'altra applicazione VB. Esempio: assegna al foglio aperto Excel come source dei dati:

text1.linkTopic = "Excel|System"

Se invece il valore é:

text1.linkTopic = "Excel|FILE.XLS"

si indica il file FILE.XLS come source dei dati.

LinkItem

indica da quale punto del source si devono attingere i dati da copiare. Nel caso di Excel se scrivo:

text1.linkItem = "R10C8"

significa che verrà copiato in text1 il valore presente nella cella della riga 10 colonna 8. Questo valore può essere modificato durante il dialogo per poter leggere altri valori da Excel

LinkTimeOut

definisce il tempo massimo di attesa di un dato: se entro tale periodo non arriva nulla, viene generato l'evento text1_linkerror() . ll valore preimpostato é 5 secondi ed é modificabile.

LinkMode

é uno dei 3 modi di conversazione descritti in precedenza ed assume i valori:

0

quando non é impostata nessuna conversazione

1

per link automatico

2

manuale

3

notify

All'inizio va impostato sempre a zero. Esempio: imposta linkmode in manuale:

text1.linkMode = 2

Esempio: inizio di un collegamento tra Excel che fa da source e applicazione vb.

sub form1.load()
text1.linkMode = 0 link disattivato (per sicurezza)
text1.linkTopic = "Excel|System"
text1.linkItem = "R9C10" cella di riga 9 colonna 10
text1.linkTimeOut = 1000 attesa di 10 secondi
text1.linkMode = 1 link automatico: appena arriva un nuovo dato da excel, lo copia in text1
end sub

Esempio: inizio di un collegamento con un'applicazione VB che fa da source

sub form1.load()
text1.linkMode = 0 link disattivato (per sicurezza)
text1.linkTopic = "VBSource|Form1" collegamento con form1; vbsource é il nome dell'applicazione vb
text1.linkItem = "text2" copia i valori di text2 nel form1
text1.linkMode = 1 link automatico: appena arriva un nuovo dato da vb , lo copia in text1
end sub
 

SOURCE

Le proprietà link per il source si applicano quasi sempre ad un form e sono: linkMode linkTopic LinkMode ha 2 valori, 0 ed 1 che indicano rispettivamente nessun collegamento e collegamento in atto. LinkTopic può contenere qualsiasi valore, ma normalmente si indica il nome del form come già preimpostato da Visual Basic. Esempio: di inizio di collegame nto tra 2 applicazioni Visual Basic per il source, supponendo form1 come form che inizia il dialogo:

sub form1.load()
form1.linkTopic = "form1"
form1.linkMode = 1 link automatico
end sub
 
EVENTI DEL DDE

Anche i link hanno i loro eventi:

DDE_linkOpen

quando viene stabilito un collegamento

DDE _linkClose

quando viene chiuso un collegamento

DDE _linkError

in caso di errore in un collegamento

DDE _linkNotify

viene generato quando Destination ha linkMode = 3, cioé a LinkNotify, ed il Source ha disponibili dei nuovi dati

linkOpen (Cancel as integer) ha il parametro Cancel che serve, se impostato a True, a rifiutare il collegamento appena instaurato. Esempio: se la variabile errorDetected é true, la connessione viene chiusa.

sub form1_linkOpen(Cancel as integer)
if errorDetected then
cancel = True
end if
end sub

linkClose () viene attivato alla chiusura e quindi quando LinkMode = 0. Esempio: imposta errorDetected = False in fase chiusura di DDE

sub form1_linkClose()
errorDetected = false
end sub

linkError (LinkErr as Integer) succede quando un qualsiasi errore accade durante il collegamento DDE per permettere di trattare l'errore come avviene per l'error trap. LinkErr restituisce il codice dell'errore. Esempio: controllo dell'errore in link.

sub Text1_LinkError(linkErr as integer)
dim msg
select case linkErr
case 1
msg = "Dati in formato Errato"
case 11
msg = "Memoria esaurita"
case else
....
end select
msgbox msg
end sub

 

linkNotify () viene attivato quando un nuovo dato é disponibile: di solito viene mandata in esecuzione una routine che copia il nuovo dato in qualche control o variabile dell'applicazione. Esempio: aggiunge il nuovo valore in una listbox.

sub text1_linkNotify()
text1.linkRequest 'acquisisce il nuovo dati in text1
list1.additem text1.text
end sub
 

METODI E FUNZIONE DEL DDE

Un metodo é già stato visto dall'esempio in precedenza; si trattava di linkRequest.

linkRequest

si usa in destination quando linkMode = 2 o 3 (manuale o notify) e serve perricevere altri dati dal source

linkPoke

serve per invertire il flusso dei dati tra destination e source: manda in fatti i dati dal destination al source

linkExecute

permette al destination di eseguire un comando nel source

linkSend

si usa nel caso di linkMode = 1 (automatic) e nel caso di aggiornamento di una picture

Shell

manda in esecuzione un'applicazione

linkRequest

permette di aggiornare i dati quando richiesto. Esempio: quando viene premuto command1, viene aggiunto un nuovo item in list1 (codice per destination)

sub form_load()
text1.linkMode = 0
text1.linkTopic = "Excel|PROVA.XLS"
text1.linkItem = "R5C6"
text1.linkMode = 2
end sub
 
sub command1_click()
text1. linkRequest ' copia il valore della cella in text1
list1.additem text1.text
end sub
linkPoke

manda un valore nel source, come ad esempio una cella di Excel. Nell' esempio la cella é in riga 5 colonna 6 del file Prova.XLS. LinkPoke funziona per LinkMode = 2 (manuale) (codice per destination)

sub command1_click()
text1.linkMode = 0
text1.linkTopic = "Excel|PROVA.XLS"
text1.linkItem = "R5C6"
text1.linkMode = 2
text1.text = valore
text1.linkPoke ' copia il valore di text1 nella cella di Excel
text1.linkMode = 0 ' chiude il collegamento
end sub
linkExecute

esegue un comando nel source inviato da destination. Il comando deve essere riconosciuto da source. Esempio: linkExecute manda ad excel il comando di uscire senza salvare il contenuto. (codice per destination)

sub command1_click()
Text.LinkMode = 0
Text.LinkTopic = "Excel|System"
Text.LinkMode = 2
Text.LinkExecute= "[file.esci()]" ' chiudi excel senza salvataggio dati
end sub
linkSend

é un metodo poco usato serve nei casi in cui linkMode = 1 (automatic) e quando l'aggiornamento di un oggetto, una picture in genere, é troppo lento. Accade infatti che DDE ad ogni cambiamento di pixel di una picture del source, collegato con DDE ad un pi cture nel destination, genera degli aggiorrnamenti continui; con linksend invece l'aggiornamento avviene per tutti i pixel della picture ed una sola volta. Esempio: aggiornamento di picture2 quando picture1 é variato (codice per destination)

sub form_load() 'creazione del link tra picture1 e picture2
picture2.linkMode = 0
picture2.linkTopic = "VBSource|Form1"
picture2.linkItem = "picture1"
picture2.linkMode = 2
end sub
 
(codice per Source)
sub command1_click()
form1.picture1 .LinkSend 'aggiorna picture 2 in destination
end sub
shell

é un metodo che non appartiene di fatto al DDE ma é spesso usato in questo contesto. Esso manda in esecuzione una qualsiasi applicazione, restituendo un identificatore di task, cioé un numero con la quale Windows identifica l'applicazione che sta 'girando '. La sintassi completa é: taskid = shell(NomeApplicazione, stile) dove stile indica come aprire l'applicazione e cioé: normale e con il fuoco = 1 iconizzata e con il fuoco = 2 massima dimensione con il fuoco = 3 normal e senza fuoco = 4 iconizzata e senza fuoco = 7 Nell'esempio excel viene aperto e viene copiato nella celle della riga 1 colonna 1 il valore della clipboard

sub cmd1_click()
excel="Excel"
applId% = shell(excel)
Text.LinkMode = 0
Text.LinkTopic = "Excel|System"
Text.LinkMode = 2
Clipboard.Clear 'pulisco clipboard
Clipboard.SetText valore 'copio stringa in clipboard
Text.LinkExecute = "[SELEZIONA("R1C1")]"
Text.LinkExecute = "[MODIFICA.INCOLLA()]" 'copia clipboard in excel
end sub

 

DataRegion

Copyright @ 2007 Vince