Title: Arbeiten mit DDE- und OLE
1Arbeiten mit DDE- und OLE
- DDE- und OLE-Funktionen und Einsatz als
OLE-Server vonMicrosoft Visual FoxPro
2- Diese Schulung dient der Einführung in die
Ansteuerung von anderen Anwendungen wie WinWord,
Excel, Project, Outlook via OLE-Automation
ausMicrosoft Visual Foxpro
3Themenübersicht
- DDE-Funktionsübersicht, Beispiel
- OLE-Automation mit MS WinWord, Beispiel
- OLE-Automation mit MS Excel, Beispiel
- MAPI und VFP
- OLE-Automation mit MS Outlook, Beispiel
- OLE-Automation mit MS Project
- OLE-Automation mit MS SQL-Server
- OLE-Automation mit MS Access
- FPOLE.DLL-Funktionsübersicht
- Remote OLE-Automation
4Office Automation
- Office Automation und Möglichkeiten der Anbindung
von Software
5Was ist Office Automation?
- Betriebssystem
- Standardanwendungen
- Textverarbeitung
- Tabellenkalkulation
- Terminverwaltung etc.
- Business Anwendungen
- Auftragsbearbeitung bzw. eigentliche
Geschäfts-anwendung (Eigene Programmierung)
6Möglichkeiten der Anbindung
- ODBC - Open Database Connectivity
- DDE - Dynamic Data Exchange
- OLE - Object Linking a. Embedding
- COM - Component Object Model
- DCOM - Distributed COM (Transport)
- ActiveX - a new Word for OLE
7DDE-Funktionen
- Kurze Übersicht über die DDE-Funktionen
vonMicrosoft Visual FoxPro
8DDE-Funktionsübersicht
- DDESetOption
- Safety, TimeOut
- DDEInitiate
- DDEExecute
- DDETerminate
- DDELastError
- DDESetTopic
- System, ggf. Document
- DDEPoke (Write)
- DDERequest (Read)
- Server
- DDEAdvise (Topics)
- DDEEnabled
9DDE-Initialisierung
- ggf. ddeSetOption( "TimeOut", 3000)
- -- Fehlermeldungen abschalten
- ddeSetOption( "Safety", .f.)
- -- Prüfen ob WinWord schon geöffnet
- lhWord ddeInitiate( "Winword", "System")
- if lhWord lt 0
- run /n7 lcWordExe
- lhWord ddeInitiate( "Winword", "System")
- if lhWord lt 0
- return
- endif
- endif
- ddeTerminate( lhWord)
10DDE-Ansteuerung
- if ddeExecute( lhWord, 'DateiNeu
lcTemplate') - ? ddeExecute( lhWord, 'BearbeitenGeheZu
Adresse_an') - ? ddeExecute( lhWord, 'Einfügen Firma GmbH
') - ? ddeExecute( lhWord, 'BearbeitenGeheZu
Adr_Ansch') - ? ddeExecute( lhWord, 'Einfügen Straße"')
- -- Und nun eine Variable/TabellenFeld einfügen
- lcOrt PLZ Wohnort"
- ? ddeExecute( lhWord, 'BearbeitenGeheZu
An_Ort') - ? ddeExecute( lhWord, 'Einfügen lcOrt')
- endif
11DDE-Set Topic
- Hier gehts darum, Falls Winword geöffnet ist,
das - gewünschte Dokument als Aktives Dokument für
den DDE-Kanal - anzuwählen. Mit Hilfe der Topics kann
festgestellt werden, - ob ein bestimmtes Dokument geöffnet ist
- lhWord ddeInitiate( "Winword", "System")
- ? ddeExecute( lhWord, 'Dateiöffnen
"lcRngDoc"') - lcTopics ddeRequest( lhWord, "topics")
- if .not. (upper( lcRngDoc) upper(lcTopics))
- ? ddeTerminate( lhWord)
- return
- endif
12Verschiedene DDE-Beispiele
- -- setzen von Topic Die Rechnung
- lh2 DDEINITIATE( "Winword", "lcRngDoc")
- -- An den Anfang des Dokuments gehen
- ? ddeExecute( lh2, 'BeginnDokument')
- -- An den Anfang der Zeile gehen
- ? ddeExecute( lh2, 'BeginnZeile')
- -- Markieren einschalten
- ? ddeExecute( lh2, 'MarkierungErweitern')
- -- bis zum Ende der Zeile markieren
- ? ddeExecute( lh2, 'EndeZeile')
- -- und nun den Inhalt der Markierung auslesen
- ? ddeExecute( lh2, 'BearbeitenTextMarke
"Auslesen"')
13OLE-Automation Allgemein
- Vorbemerkungen zum Einsatz von OLE-Automation
14Was ist OLE ?
- Client und Server
- Die Registry
- Objektbasiert
- Linked Objects
- Embedded Objects
- OLE 2
- embedded objects
- in-place-editing
15OLE Automation Allgemein
- Application-Objekt
- Collections - Child-Objektlisten
- Objekte
- Eigenschaften
- Methoden
- Funktionen (bei Application)
- Sprache beachten (bzw. setzen)
16OLE-Automation mit WinWord
- Ansteuerung von WinWord via OLE-Automation
ausMicrosoft Visual FoxPro
17Vorgängerversion WinWord 95
- Objektmodell von Word
- nur Word.Basic interaktionsfähig
- Befehle von Word
- WordBasic
- DateiBeenden
- DateiNeu
- Dialoge (nur lesen, nicht schreiben (!))
- Sprache beachten für WordBasic (!)
18OLE-Automation mit WinWord
- Objektmodell von WinWord 97
- Application
- Documents
- Paragraphs (Absätze)
- Range (Bereich von Zeichen)
- Chars
- Dialoge
19Objektmodell von WinWord
20Alternative WordBasic
- Für Anwendungen inWinWord 2.0 und WinWord 95
- CreateObject(Word.Application)
- oBasic oApp.WordBasic( ltBefehlgt)
- oBasic.FileOpen( ltPfadgt)
- oBasic.FilePrint()
- oWord.Quit()
- Hilfe WrdBasic.hlp
- WordBasic immer verfügbar
21Hinweise zu WinWord
- Custom Document Properties
22Beispiele mit WinWord
- Verschiedene Beispiele und Übungen zu WinWord
mitMicrosoft Visual FoxPro
23Beispiele mit WinWord
- An/Abmelden bei Winword
- Koordinaten einstellen
- Dokumente öffnen
- Formate einstellen
- Bereich selektieren/Fonts
- Properties, Textmarken
- Tabellen
- Serienbriefe
- Sonstige Funktionen
24An/Abmelden bei WinWord
- -- Instanzierung einer Word Session
- oWord CreateObject( "Word.Application.8")
- -- Prüfen ob Instanzierung erfolgreich
- if isnull(oWord)
- return
- endif
- -- Winword beenden
- oWord.Quit(0)
25Koordinaten einstellen
- -- Sichtbar machen und Koordinaten einstellen
- oWord.visible .t.
- oWord.Left 380
- oWord.Width 400
- oWord.top 1
- oWord.Height 540
- -- ggf. Visual FoxPro wegschalten
- _screen.visible .F.
26Dokumente öffnen
- -- bestehendes Dokument öffnen
- owDok oWord.Documents.open( dokument")
- owDok.Close()
- -- neues Dokument mit Standardvorlage erstellen
- owDok oWord.Documents.Add()
- owDok.Close()
- -- neues Dokument mit Vorlage erstellen
- owDok oWord.Documents.Add( "Word97.dot")
- owDok.Close()
27Formate einstellen
- -- Format und Seitenränder des Dokuments setzen
- with owDok.PageSetup
- .Papersize 7 A4
- .Orientation 0 Portrait
- -- Seitenränder in Punkten angeben
- .LeftMarginoWord.CentimetersToPoints( 2.5 )
- .RightMarginoWord.CentimetersToPoints( 2 )
- .TopMarginoWord.CentimetersToPoints( 2.5 )
- .BottomMarginoWord.CentimetersToPoints( 2 )
- endwith
28Bereiche selektieren
- -- Bereich selektieren, Text einfügen
- oRange owDok.Range
- oRange.InsertBefore("Hallo Teilnehmer")
- -- Font für selektierten Bereich einstellen
- With oRange.Font
- .Bold .t.
- .Name "Arial"
- .Size 24
- EndWith
29Properties, Textmarken
- Properties.Add(Name,LinkToContent,Type,Value,Lin
kSource) - -- Suchen mit Schleife über Count, Exits gibt es
nicht - owDok.CustomDocumentProperties.Add(
"Name",.f.,4,ltNamegt ) - owDok.CustomDocumentProperties.Add(
"VName",.f.,4,VName) - -- Textmarken
- lcTextMarke "Adresse"
- owDok.Bookmarks.Add( lcTextmarke, oRange)
- if owDok.Bookmarks.Exists( lcTextmarke)
- owDok.Bookmarks( lcTextmarke ).Select
- endif
30Tabellen (1)
- -- Eine Tabelle mit 3 Spalten und 5 Zeilen
hinzufügen - oTable owDok.Tables.add( oRange, 5, 3)
- -- Die Spaltenbreiten festlegen
- oTable.Columns(1).Width oWord.CentimetersToPoints
( 8) - oTable.Columns(2).Width oWord.CentimetersToPoints
( 2) - oTable.Columns(3).Width oWord.CentimetersToPoints
( 6) - -- Zeilenhöhe der Tabelle einstellen
- lnHeight oWord.CentimetersToPoints( 1)
- for each oRow in oTable.Rows
- oRow.Height lnHeight
- oRow.HeightRule 2 exact
- endfor
31Tabellen (2)
- -- und nun die Tabelle füllen
- -- kann natürlich auch mit Daten einer DBF sein
- oTable.Cell( 1, 1).Range.Text WB GmbH
- oTable.Cell( 2, 1).Range.Text Herrn Abb
- oTable.Cell( 3, 1).Range.Text Frankfurter Str.
21b - oTable.Cell( 5, 1).Range.Text 61476 Kronberg
32Serienbrief (1)
- lcSource "C\Projekt\Devcon\Merge.dbf"
- OpenDataSource(Name, Format, ConfirmConversions,
- ReadOnly, LinkToSource, AddToRecentFiles,
- PasswordDocument, PasswordTemplate, Revert,
- WritePasswordDocument, WritePasswordTemplate,
- Connection, SQLStatement, SQLStatement1)
- with owDok.MailMerge
- .MainDocumentType 0 wdFormLetters
- .OpenDataSource( lcSource )
- endwith
- owDok.MailMerge.CreateDataSource( Name, Header)
- lcHeader "Name, Adresse, Postleitzahl, Ort,
Land" - owDok.MailMerge.CreateDataSource( lcSource,
lcHeader)
33Serienbrief (2)
- -- und nun die Tabelle füllen
- -- kann natürlich auch mit Daten einer DBF sein
- WDFieldType.WDMergeField 59
- oTable.Cell( 1, 1).Range.Fields.Add(
- Range, Type, Text)
- oRange oTable.Cell( 1, 1)
- owDok.Mailmerge.Fields.Add( oRange, "CUST_ID")
- owDok.MailMerge.Execute()
- owDok.SaveAs( lcPath "Word9703")
- -- Und nun das Dokument drucken
- owDok.PrintOut() alternativ PrintPreview()
34Sonstige Funktionen
- -- Datei speichern als
- owDok.SaveAs( "meindokument" )
- -- Dokument drucken
- owDok.PrintOut()
- owDok.PrintPreview()
35OLE-Automation mit Excel
- Ansteuerung von Excel viaOLE-Automation
ausMicrosoft Visual FoxPro
36OLE-Automation mit Excel
- Excel-Objekte in der Registry
- Application
- Sheet (Tabelle)
- WorkSpace (Arbeitsbereich)
- VBAModule
- Chart
- Template (Vorlage)
- Direkt erzeugbar mit CreateObject( )
37Objektmodell von Excel
38Hinweise zu Excel
- SYS( 3005, 1033/1031) - Sprache
- Excel.Application.Visible
- Excel.InterActive für Anzeigemodus
- Anwender kann nicht eingreifen
- Excel.DisplayAlerts für Fehleranzeige
- geht bei WinWord leider nicht!
- FOR EACH MemVar IN Group
39Beispiele mit Excel
- Verschiedene Beispiele und Übungen zu Excel mit
Microsoft Visual FoxPro
40Beispiele mit Excel
- Anmelden bei Excel
- Tabellen anlegen
- Werte einfügen
- Sonstige Funktionen
41Anmelden bei Excel
- sys( 3005, 1033) Sprache Englisch
- oExcel createObject( "Excel.Application")
- if isnull( oExcel)
- return .f.
- endif
- -- Fenstereinstellungen für Excel, Faktoren
beachten - oExcel.Top 0
- oExcel.Height _vfp.height0.91
- oExcel.Left (_vfp.Width0.76) 2
- oExcel.Width (sysmetric(1)- _vfp.width)0.74
- -- Excel anzeigen
- oExcel.Visible .T.
42Tabellen anlegen (1)
- -- Anwendereingaben verhindern
- oExcel.Interactive .T.
- -- Sicherheitsabfragen unterdrücken
- oExcel.DisplayAlerts .f.
- -- Neue Arbeitsmappen mit nur einer Tabelle
erstellen - oExcel.SheetsInNewWorkBook 1
- -- Eine Arbeitsmappe erstellen
- -- es müßte eine Tabelle vorhanden sein
- ? "Anzahl der Arbeitsmappen", oExcel.Workbooks.co
unt - oBook oExcel.Workbooks.add
43Tabellen anlegen (2)
- -- Eine neue Tabelle hinzufügen
- ? "Anzahl Tabellen in der Arbeitsmappe",
oBook.Sheets.count - oSheet oBook.Sheets.add
- ? "Anzahl Tabellen in der Arbeitsmappe",
oBook.Sheets.count -
- -- Die Tabelle löschen
- oSheet.delete()
- ? "Anzahl Tabellen in der Arbeitsmappe",
oBook.Sheets.count - oSheet oBook.Sheets(1)
44Werte einfügen (1)
- -- Nun holen wir uns den Zellbereich von A1 bis
A12 - oRange oSheet.Range( "A1A12")
-
- und nun setzen wir in der Zelle A1 und A2 das
Datum - oRange.Cells( 1, 1).Value 01.01.97
- oRange.Cells( 2, 1).Value 01.02.97
- Der Autofillbereich über den Bereich von A1 bis
A12 - oFillTo oRange
- oSheet.Range( "A1A2").Autofill( oFillTo)
45Werte einfügen (2)
- -- Nun den Bereich B1 - B10 mit Formel füllen
die Formel ist relativ - oRange oSheet.Range( "B1B12")
- oRange.Formula "month( A1)"
- -- formatieren von Zellen
- oRange.NumberFormat ",0.00" US-Notation
- oRange.Font.Bold .t.
- -- Nun den Bereich C1 bis C12 füllen
- oSheet.Range( "C1C12").Formula "B1 1.15"
- oSheet.Range( "C1C12").Numberformat ",0.0"
- -- Und nun das Autoformat laufen lassen
- oSheet.Range( "A1C12").Autoformat( 10)
46Werte einfügen (3)
- -- 10 Datensätze in das Clipboard kopieren
- _vfp.DataToClip( "_cTopTen", 10, 3) 3 Tabs
- -- Datensätze in Excel einfügen
- oExcel.ActiveSheet.Range( "A2").Select Zelle
A2 - oExcel.ActiveSheet.Paste() einfügen
- -- oExcelCells erhält die Referenz auf den
- -- eingefügten Bereich
- oExcelCells oExcel.Selection
- -- und nun noch ein Autoformat
- oExcelCells.Autoformat(11)
- -- immer zwei Reihen farblich anders
47Sonstige Funktionen
- -- Die aktuelle Arbeitsmappe speichern
- oExcel.ActiveWorkBook.saveAs( "D_XLS97")
- -- Die Summe über die Umsätze der Top 10
- Die erste Zeile enthält die Spaltenköpfe
(Feldnamen) - ? oExcel.Application.Evaluate( "sum( B2B11)")
- -- Direktes benutzen von Funktionen, auch mit
Arrays - ? oExcel.evaluate( "fv( 10, 12, 100)")
- ? oExcel.evaluate( "correl( 121,1.11.91)")
48Mailversand mit ActiveX
- Empfang und Versand von elektronischen
Nachrichten mitMicrosoft Visual FoxPro
49Mail und VFP
- FPW Workgroup Extensions (seit 93)
- FOXMAPI.FLL nicht mehr unter VFP
- VFP3 2 OLE-Container für Messaging
- Session Control (für Einloggen)
- Message Control (für Empfang/Versand)
- Wahlweise Versand via Outlook
50MAPI Session Control
- Verwaltung einer Mailsession, Beginn mit
Einloggen via Methode SignOn - LogonUI - Flag Dialogmaske für Login
- NewSession - Flag Neue Exchange-Session
- Username - String mit Profilname
- DownloadMails - Flag für Abgleich (Default .T. !)
- Rückgabe Session-ID für Message Ctrl!
- Methode SignOff
51MAPI Message Control (1)
- Übertragung der SessionID
- Aufruf Fetch()-Methode
- FetchUnreadOnly - Nur ungelesene Messages
- FetchSorted - Eingangsreihenfolge oder
Benutzerreihenfolge - Anzahl Messages in MsgCount
- Wechseln durch Ändern MsgIndex
- beginnt bei 0, also nur bis MsgCount-1, 0älteste
52MAPI Message Control (2)
- Eigenschaften MAPI-Message
- MsgNoteText - Nachrichtentext
- MsgSubject - Betreff
- MsgOrigDisplayName - Absender
- RecipDisplayName - Collection
- (RecipCount, RecipIndex)
53MAPI Message Control (3)
- Anlegen von neuen Nachrichten
- Methode Compose( ) oder
- MsgIndex auf -1 setzen
- Versand mit Send( )-Methode
- Attachments sind in einer Collection vorhanden,
Anzahl AttachmentCount - Attachment in AttachmentPathName
54OLE-Automation mit Outlook
- Ansteuerung von MS Outlookvia OLE-Automation
ausMicrosoft Visual FoxPro
55OLE-Automation mit Outlook
- Nachfolger von Exchange und Schedule
- via Exchange Server, Office, Outlook
- Sonderversion Outlook Express für Mail
- Dienste werden in Profilen verwaltet
- Dienste Exchange, Internet, Fax, CIS
- Folder (Ein/Ausgang, Journal, Kontakte, Kalender,
Aufgaben, Notizen)
56Objektmodell von Outlook (1)
- Wird bei Visual Modeler als UML mitgeliefert (VM
in Visual Studio) - Ziemlich komplexes Modell
- Kenntnisse der Struktur sind notwendig um Outlook
anzusteuern - Hilfe bei Office (extra installieren)
57Objektmodell von Outlook (2)
58Zugriff auf Outlook
- Getobject(, Outlook.Application)
- Createobject(Outlook.Application)
- NameSpace-Objekt (MAPI / Notes)
- Login
- CreateItem
- Hilfe in VBAOUTL.HLP
59Beispiele mit Outlook
- Verschiedene Beispiele und Übungen zu Outlook
mitMicrosoft Visual FoxPro
60Outlook-Beispiele
- An/Abmelden bei Outlook
- Zugriff auf Outlook
- Bereichseingrenzung
- Eintrag in das Journal
- Anlegen eines Termins
- Anlegen eines Kontakts
- Outlook-Konstanten
61An/Abmelden bei Outlook
- Anmelden bei Outlook
- oOutlook createobject( "Outlook.Application")
- oSession .oOutLook.GetNameSpace("MAPI")
- oSession.LogOn( alltrim( ltlcProfilegt ), , .t.)
- Abmelden bei Outlook
- oSession.logoff()
- oOutlook.quit()
62Zugriff auf Outlook
- -- Zugriff Journal
- oJournal oSession.GetDefaultFolder(11)
- -- Zugriff Termine
- oKontakte oSession.GetDefaultFolder(9)
- -- Zugriff Kontakte
- oKontakte oSession.getdefaultfolder(10)
63Bereichseingrenzung
- Bereichseingrenzung Beispiel Journal
- LOCAL lcRange, ldVon, ldBis
- lcRange 'Kategorien ' alltrim(
"ltKategoriegt" ) " ' - lcRange 'Start gt "' dtoc( ldVon) '" '
- lcRange 'Start lt "' dtoc( ldBis) '" '
- oItems oJournal.Items.restrict( lcRange )
- Schleife über Journaleinträge
- for each oItem in oItems .. next
64Anlegen Journaleintrag
- -- Anlegen Eintrag Journal
- local loItem
- loItem oOutlook.createitem(4)
- -- Werzuweisung
- loItem.Subject loItem.Categories
- loItem.Start loitem.End
- loItem.Duration loitem.Body
- loItem.ContactNames loitem.Type
- loItem.Companies
- -- Speichern
- loItem.Save()
65Anlegen Termin
- -- Anlegen Eintrag Termin
- local loTermin
- loTermin oOutlook.createitem(1)
- -- Werzuweisung
- loTermin.Subject ltTitelgt
- loTermin.Start ltDatum Zeitgt
- loTermin.End ltDatum Zeitgt
- loTermin.Body ltTextgt
- -- Speichern
- loTermin.save()
66Anlegen Kontakt
- -- Anlegen Eintrag Termin
- local loAdresse
- loAdresse oOutlook.createitem(2)
- -- Wertzuweisung
- loAdresse.LastName ltNamegt
- loAdresse.FirstName ltVornamegt
- loAdresse.EMail1Address lteMailgt
- loAdresse.BusinessFaxNumber ltFaxgt
- -- Speichern
- loAdresse.save()
67Outlook-Konstanten
- OlDefaultFolder
- Constant Value
- define olFolderDeletedItems 3
- define olFolderOutbox 4
- define olFolderSentMail 5
- define olFolderInbox 6
- define olFolderCalendar 9
- define olFolderContacts 10
- define olFolderJournal 11
- define olFolderNotes 12
- define olFolderTasks 13
- OlItems
- Constant Value
- define olMailItem 0
- define olAppointmentItem 1
- define olContactItem 2
- define olTaskItem 3
- define olJournalItem 4
- define olNoteItem 5
- define olPostItem 6
- Hinweis Komplette Konstanten im Notizblatt zu
dieser Seite
68OLE-Automation mit Project
- Ansteuerung von Project via OLE-Automation aus
Microsoft Visual FoxPro
69OLE-Automation mit Project
Application
Application
Project
Project
Window
Cell
Window
Cell
Resource
Resource
Task
Task
Calendar
Calendar
Pane
Pane
Resource
Resource
Assignment
Assignment
List
Task
Assignment
Assignment
List
Task
Assignment
Calendar
Resource
Calendar
Selection
Selection
Resource
Task
Task
Resource
Resource
Task
Task
List
List
70OLE-Automation mit SQL-Server
- Ansteuerung von MS SQL-Server via OLE-Automation
ausMicrosoft Visual FoxPro
71OLE-Automation mit SQL-Server
72OLE-Automation mit Access
- Ansteuerung von MS Access via OLE-Automation
ausMicrosoft Visual FoxPro
73OLE-Automation mit Access
74Visual FoxPro als OLE-Server
- Kurze Übersicht über die OLE-Server-Funktionen
vonMicrosoft Visual FoxPro
75Aufrufbare Funktionen
- Fernsteuerung
- FoxDoCmd
- FoxEval
- SetErrMode
- SetOLEObj
- CloseIt
- GetLastError
76Remote OLE Automation
- Remote OLE-Automation aus
- Microsoft Visual FoxPro
77Remote OLE Automation
- Registry Eintragung
- Remote Automation Connection Manager
- Erst ab VFP 6.0 sinnvoll...
78Zusammenfassung
- Objektmodell wichtig!
- Automation erlaubt Einbin-dung von Office
- Outlook einfach
- Remote Automation
79Vielen Dank!
- Das waren die Themen
- DDE-Funktionsübersicht
- OLE-Automation mit MS WinWord
- OLE-Automation mit MS Excel
- MAPI und VFP
- OLE-Automation mit MS Outlook
- OLE-Automation mit MS Project
- OLE-Automation mit MS SQL-Server
- OLE-Automation mit MS Access
- FPOLE.DLL-Funktionsübersicht
- Aufrufbeispiel in WordBasic
- Remote OLE-Automation
80Wenn Fragen bestehen
- Wizards Builders
- Methodische Software-Entwicklung GmbH
- Frankfurter Str. 21b
- 61476 Kronberg
- Tel. 06173-950906
- Fax 06173-950907
- CIS 101605,175