1
DDE
För att kommunicera mellan program i Windows kan man använda
sig av DDE – Dynamic Data Exchange. Det finns fyra typer av DDE:
|
|
|
|
|
Ger DDE kommandon åt ett annat program
|
|
|
Tittar efter data i ett annat program
|
|
|
”Trycker in data” i ett annat program
|
Vi kommer här att se mer på Request och Execute (Peek och
Poke tycker jag är ”oartiga”)
1.1
Gemensamt för alla DDE metoder
För att kunna använda DDE krävs samarbete av två program.
Ett program fungerar som klient och det andra som server. Eftersom man kan ha
flera DDE konversationer igång samtidigt kan ett program vara såväl klient som
server samtidigt. För en given DDE konversation gäller dock att programmet är
antingen eller. För att få igång en konversation krävs att klienten vet följande
om servern:
Application är det namn som programmet registrerat för DDE.
Detta måste inte vara detsamma som programnamnet. För enkelhets skull brukar
det dock vara samma som programnamnet.
Topic är ”ämnet” som dataöverföringen skall hantera. Ej alltid
helt dokumenterade.
Item är en specifik datamängd, t.ex. en cell i Excel
1.2
DDE med VB 5.0 som klient
Komponent Namn
Egenskaper
1. TextBox Text1
MultiLine: True
2. CommandButton Command1
Caption: Prova
Dessutom måste du ha igång Excel och ha värden i A1
t.o.m. A3 i arket Sheet1
1.2.1
DDE Request
Den vanligaste formen av DDE är utbyte av data. Det finns
tre former av Request. Nedan kommer namnan samt de begrepp som används i VB
5.0 (6.0 har jag inte tillgång till):
Verkligt namn i VB
1. Cold Manual
2. Warm Notify
3. Hot Automatic
1.2.1.1 Cold DDE Request (manual)
En cold Request går ut på att man tar kontakt, frågar efter
data och efter att ha fått datat (eller blivit vägrad) så avbryts förbindelsen.
Skriv in följande kod för knappen:
Private Sub Command1_Click()
Text1.LinkTopic = "Excel|Sheet1"
Text1.LinkItem = "R1C1"
Text1.LinkMode = vbLinkManual
Text1.LinkRequest
End Sub
Förklaringar:
Text1.LinkTopic = "Excel|Sheet1"
Ser till att textboxen skapar en DDE kanal mot:
Application: Excel
Topic: Sheet1
Text1.LinkItem = "R1C1"
Ser till att man sätter:
Item: R1C1
Text1.LinkMode = vbLinkManual
Säger att man skall ha en manuell länk (cold). Obervera att man inte
kan sätta denna egenskap före man har satt Applicatioin, Topic och Item
Text1.LinkRequest
Gör att själva förfrågningen görs.
1.2.1.2 Warm DDE Request (notify)
Private Sub Command1_Click()
Text1.LinkTopic = "Excel|Sheet1"
Text1.LinkItem = "R1C1"
Text1.LinkMode = vbLinkNotify
' Raden Text1.LinkRequest tas bort
End Sub
Skapa sedan följande händelseprocedur (välj Text1 och LinkNotify
i Listorna i VB:s editor)
Private Sub Text1_LinkNotify()
Text1.LinkRequest
End Sub
När vi nu klickar på knappen kommer Text1 att få några inställningar.
Det kommer dock inte att komma något värde i textboxen. Om vi hoppar till Excel
och skriver om värdet i A1 (R1C1) så kommer vårt program att meddelas om detta.
Då körs Text1_LinkNotify proceduren.
I denna säger vi att vi vill ha datat som Excel vill ge. (Vi kan även låta bli
om vi vill)
1.2.1.3 Hot DDE Request (automatic)
Private Sub Command1_Click()
Text1.LinkTopic = "Excel|Sheet1"
Text1.LinkItem = "R1C1"
Text1.LinkMode = vbLinkAutomatic
End Sub
Efter detta kommer textboxen att automatiskt uppdateras vid
behov och Text1_LinkNotify kommer inte att användas
(kan tas bort om man vill)
1.2.2
DDE med VBA (T.ex. Excel makro) som klient
I övriga VB versioner som t.ex. Excels VBA använd en annan
konstruktion för Request, oftast endast cold DDE:
Sub TestRequest()
Dim channel
Dim retArray
channel = DDEInitiate("application",
"Topic")
' kan ge en array tillbaka
retArray = DDERequest(channel, "Item")
' loopa igenom denna array
For I = 1 To UBound(retArray)
MsgBox retArray(I)
Next
' glöm inte att stänga DDE kanalen
DDETerminate (channel)
End Sub
Enklaste sättet att testa DDE är med Excel cellformler. Dessa
skrivs i formen:
=Application|Topic!Item
Vi får då en Hot DDE REquest (automatisk). Vill du
ha den manuell så kan man använda:
Edit, Links... Välj länken i dialogen
och ändra Update: till Manual
1.3
DDE med VB som Server
För att få en form i VB att fungera som DDE server så måste
den ha satt Application, Topic och Item. Dessa är
1.Application Namnet på projektet
(inte exe filens namn utan det som syns i Project explorern. )
2.Topic Ställs in i formens LinkTopic property.
Ändra samtidigt LinkMode till 1- Source
3.Item Namnet på en TextBox, Label
eller PictureBox
Detta kan testas genom att ställa in LinkTopic till
Form1 och LinkMode till Source för formen.
Starta ditt VB program och klicka på dess CommandButton
Hoppa sedan till Excel och skriv in följande formel i en cell,
men inte i A1:
=Project1|Form1!Text1
Skriv in någonting i cell A1. Detta kommer att föras över
med DDE till vårt VB projekt. Sedan kommer vår Excel formel att hämta detta
värde till cellen där den fanns. (En hemsk omväg för datat med det är ju bara
en demonstration)
1.4
Nedan kommer en förteckning över DDE topic och item i några vanliga
program:
|
Microsoft Access
|
|
Application
|
Topic
|
Item
|
Förklaring
|
|
MSAccess
|
System
|
SysItems
|
Lista över items som finns i System topic
|
| |
|
Formats
|
Klippbords format
|
| |
|
Status
|
”Busy” eller ”Ready”
|
| |
|
Topics
|
Alla öppna databaser
|
| |
Databas
(Namnet
på en databas.
T.ex. northwind om filen heter Northwind.mdb)
|
TableList
|
Lista över tabeller i databasen
|
| |
QueryList
|
Alla Query i databasen
|
| |
FormList
|
Alla formar
|
| |
ReportList
|
Rapporter
|
| |
|
MacroList
|
Makron
|
| |
|
ModuleList
|
Moduler
|
| |
databas; TABLE tabellnamn
databas; QUERY query
databas; SQL SELECT
* FROM...
T.ex.
mindb; TABLE minTabell
|
All
|
Allt data i tabellen inklusive fälltnamn
|
| |
Data
|
Posterna, men inte fältnamn
|
| |
NextRow
|
NästaPost.
|
| |
PrevRow
|
Föregående rad
|
| |
FirstRow
|
Första raden
|
| |
LastRow
|
Sista raden
|
| |
FieldCount
|
Antal poster
|
|
För mer info om MS Access som DDE Server se Q89586 i
MSKB
eller sök i Access hjälp efter DDE och sedan Using Microsoft
Access As a DDE Server
|
|
För DDE Execute kan man använda följande:
|
|
MSAccess
|
System
|
[OpenDatabase databas.mdb]
[OpenForm Formnamn]
[Makronamn parametrar]
|
|
Microsoft Word
|
|
Application
|
Topic
|
Item
|
Förklaring
|
|
Winword
|
System
|
SysItems
|
System Items
|
| |
|
Formats
|
Format som Word kan sätta till klippbordet
|
| |
|
Topics
|
Alla alternativa topics som finns tillgängliga
|
| |
document
(Namnet
på ett dokument.
T.ex. sales.doc)
|
Bokmärke
|
Ett bokmärke i texten
(markera en text och välj
Insert, Bookmark...
Skriv in ett namn i dialogen)
|
|
För mer info om MS Word som DDE Server se Q93657 i MSKB
|
|
För DDE Execute kan man använda följande:
|
|
Winword
|
System
|
[FileOpen ....]
(Se Q93657 för mer info)
|
|
Microsoft Excel
|
|
Application
|
Topic
|
Item
|
Förklaring
|
|
Excel
|
System
|
SysItems
|
System Items
|
| |
|
Formats
|
Format som kan sättas till klippbordet
|
| |
|
Selection
|
|
| |
|
Topics
|
Alla alternativa topics som finns tillgängliga
|
| |
ark
(Namnet
på ett ark.
T.ex. Sheet1)
|
RnCn
T.ex
R1C1
för A1
|
Rad nummer och kolumnnummer i formen
R1C2 där 1:an är rad och 2:an är kolumn
|
| |
|
För DDE Execute kan man använda följande:
|
|
Excel
|
System
|
??
|
Man kan göra en hel del med DDE (om man vill)
Prova t.ex. följande i VB :
Private Sub Command1_Click()
' Se till att ha igång Access när du kör detta
' byt ut MinDatabas
till namnet på den databas du har igång
' byt ut ManTabell
till en tabell i din databas
Text1.LinkTopic = "MSAccess|MinDatabas; TABLE MinTabell"
Text1.LinkItem = "Data"
Text1.LinkMode = vbLinkManual
Text1.LinkRequest
End Sub
Du kan även skriva in följande i Excel (för att förtydliga
har jag satt extra mellanslag i formeln):
=MSAccess | ' MinDatabas; TABLE MinTabell ' ! Data
Skriv in det i en tom cell i början av Excel arket.
Om du får ett värde i cellen så provar du följande:
1. Markera upp cellen du skrev in formeln i och ett godtyckligt område
neråt och åt höger sida: