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.
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
|