Tworzenie aplikacji Windows Serwery automatyzacji OLE



Podobne dokumenty
Delphi 7 + Indy 10 Przykłady prostych aplikacji sieciowych

Cel: Przypisujemy przyciskom określone funkcje panel górny (Panel1)

Zadanie. Menu Plik niech posiada dwie pozycje: Tekstowy i Excel, a każda z nich niech posiada dwie pozycje Otwórz i Zapisz, patrz rys. 2.

Zakres tematyczny dotyczący podstaw programowania Microsoft Office Excel za pomocą VBA

Visual Basic for Applications. Wstęp

Budowa i oprogramowanie komputerowych systemów sterowania. Laboratorium 4. Metody wymiany danych w systemach automatyki DDE

Aplikacje w środowisku VBA. Visual Basic for Aplications

Program szkolenia VBA (VISUAL BASIC FOR APPLICATIONS) W EXCELU PODSTAWOWY.

Zaawansowane aplikacje internetowe - laboratorium

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe.

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

AUTOMATYZACJA PRACY Z UŻYCIEM MAKR. Tom XII NPV WSP.KORELACJI ROZKŁ.EXP JEŻELI COS KOMÓRKA VBA DNI.ROBOCZE ILOCZYN LOG SUMA CZY.

5.2. Pierwsze kroki z bazami danych

Instalacja i konfiguracja IIS-a na potrzeby dostępu WEB do aplikacji Wonderware InTouch Machine Edition

Program szkolenia PODSTAWY VBA (VISUAL BASIC FOR APPLICATIONS) I FORMULARZE.

Visual Basic w programie Excel

Wprowadzenie do projektu QualitySpy

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

Tworzenie własnych komponentów

Wprowadzenie do systemu Delphi

Nazwa implementacji: Kółko i krzyżyk w Lazarusie. Autor: Piotr Fiorek Andrzej Stefaniuk

Program szkolenia VBA (VISUAL BASIC FOR APPLICATIONS) W EXCELU PRZEKROJOWY.

Kierunek: ETI Przedmiot: Programowanie w środowisku RAD - Delphi Rok III Semestr 5. Ćwiczenie 5 Aplikacja wielo-okienkowa

Języki skryptowe w programie Plans

Delphi Laboratorium 3

Serwery Statefull i Stateless

Politechnika Łódzka. Instytut Systemów Inżynierii Elektrycznej. Laboratorium przyrządów wirtualnych. Ćwiczenie 3

7.9. Ochrona danych Ochrona i zabezpieczenie arkusza. Pole wyboru

Zastanawiałeś się może, dlaczego Twój współpracownik,

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS

Właściwości i metody obiektu Comment Właściwości

Dodawanie grafiki i obiektów

Cel: Zastosowanie okien pytającychwyświetlających pytania i komunikaty (MessageBox). Klub IKS

BAZY DANYCH Panel sterujący

Podstawy Programowania 2

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

Przygotowanie własnej procedury... 3 Instrukcja msgbox wyświetlanie informacji w oknie... 6 Sposoby uruchamiania makra... 8

Komunikacja i wymiana danych

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Makropolecenia w Excelu

Informatyka Edytor tekstów Word 2010 dla WINDOWS cz.1

Programowanie obiektowe

Funkcje i instrukcje języka JavaScript

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Visual Basic w programie Excel dla Windows

Trik 1 Edycja wykresu bezpośrednio w dokumencie Worda

Pokaz slajdów na stronie internetowej

INFORMATYKA TECHNICZNA Badanie możliwości wykorzystania interfejsu automatyzacji OLE w systemie CAx

Tworzenie szablonów użytkownika

Projekt ZSWS. Instrukcja uŝytkowania narzędzia SAP Business Explorer Analyzer. 1 Uruchamianie programu i raportu. Tytuł: Strona: 1 z 31

Programowanie RAD Delphi

Język programowania. Andrzej Bobyk

Excel. Tworzenie zaawansowanych aplikacji.

Wykład 5: Klasy cz. 3

Ćwiczenie Zmiana sposobu uruchamiania usług

Jak posługiwać się edytorem treści

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Makra VBA w Excelu dla początkujących

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

LABORATORIUM 6: ARKUSZ MS EXCEL JAKO BAZA DANYCH

16) Wprowadzenie do raportowania Rave

MS Access formularze

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

SYSTEMY ZARZĄDZANIA TREŚCIĄ WORDPRESS

Dodawanie operacji dodatkowych w WAPRO Mag.

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Przewodnik Szybki start

Wykład 8: klasy cz. 4

VBA-podstawy cz. 1. Począwszy od wersji Office 2010 skoroszyty Excel wsparte makrami VB mają rozszerzenie.xlsm

Temat: Organizacja skoroszytów i arkuszy

Zadanie 8. Dołączanie obiektów

PROJEKT WSPÓŁFINANSOWANY ZE ŚRODKÓW UNII EUROPEJSKIEJ W RAMACH EUROPEJSKIEGO FUNDUSZU SPOŁECZNEGO OPIS PRZEDMIOTU. studia pierwszego stopnia

Co nowego w systemie Kancelaris 3.31 STD/3.41 PLUS

SERWER AKTUALIZACJI UpServ

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Wykład 2 Składnia języka C# (cz. 1)

ABC 2002/XP PL EXCEL. Autor: Edward C. Willett, Steve Cummings. Rozdział 1. Podstawy pracy z programem (9) Uruchamianie programu (9)

Opis programu EKSoft Rezerwacje

Wprowadzenie (17) Część I. Makra w Excelu - podstawy (23)

VBA praca z makrami w Excelu

Przesyłanie Pakietów Danych i TCP/IP

Informatyka Edytor tekstów Word 2010 dla WINDOWS cz.1

INFORMATYKA TECHNICZNA Badanie możliwości wykorzystania języka AutoLISP i środowiska VisualLISP w systemie CAx

MsgBox(Komunikat [, Przyciski] [, Tytuł] [, PlikHelp, HelpContext])

Zadanie 1. Stosowanie stylów

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Laboratorium 15: Bazy Danych Tworzenie bazy danych i programowanie elementów nawigacyjnych aplikacji stworzonej przy pomocy technologii dbexpress

UONET+ - moduł Sekretariat. Jak wykorzystać wydruki list w formacie XLS do analizy danych uczniów?

Program powinien otworzyć się z pierwszym formularzem. Jeśli nie, otwórz pierwszy formularz, wybierając go z listy - Shift+F12.

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Windows Serwer 2008 R2. Moduł 5. Zarządzanie plikami

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Sposób tworzenia tabeli przestawnej pokażę na przykładzie listy krajów z podstawowymi informacjami o nich.

Instrukcja użytkownika

Transkrypt:

Jacek Matulewski http://www.phys.uni.torun.pl/~jacek/ Tworzenie aplikacji Windows Serwery automatyzacji OLE Ćwiczenia Toruń, 14 grudnia 2002 Najnowsza wersja tego dokumentu znajduje się pod adresem http://www.phys.uni.torun.pl/~jacek/dydaktyka/rad/rad4_ole.pdf Źródła opisanych w tym dokumencie programów znajdują się pod adresem http://www.phys.uni.torun.pl/~jacek/dydaktyka/rad/rad4_ole.zip 1

I. Spis treści I. Spis treści... 2 II. Automatyzacja OLE... 3 1. Współpraca aplikacji z uruchomioną aplikacją Excela... 3 2. Tworzenie obiektu Excel.Application... 6 3. Edycja komórek Excela... 6 4. Serwer automatyzacji OLE Internet Explorer... 8 III. Paleta serwerów automatyzacji... 9 1. Współpraca aplikacji z uruchiomioną aplikacją Excela... 9 2. Przykład współpracy aplikacji z Microsoft Word... 11 2

II. Automatyzacja OLE Automatyzacja (ang. Automation) jest elementem COM (ang. Component Object Model) standardu umożliwiającego aplikacjom udostępnianie klas (ActiveX) i obiektów (OLE) innym aplikacjom oraz w szczególności narzędziom programistycznym. Pierwszymi serwerami automatyzacji, a więc aplikacjami udostępniającymi obiekty były programy rozprowadzane razem z systemem Windows 3.1 (np. Paintbrush), a pierwszymi klientami elementy pakietu Office (które np. do edycji obrazu korzystały z Paintbrusha). Standard OLE (ang. Object Linking and Embedding łączenie i osadzanie obiektów) ewoluował razem z Windows do wersji 32-bitowej (OLE2) wzbogacając się między innymi o automatyzację. Mechanizm automatyzacji pozwala na udostępnianie obiektów innym aplikacjom, przez które mogą być w pełni kontrolowane. Typowym przykładem serwera (dostarczyciela obiektów) automatyzacji jest Microsoft Office, a typowym zastosowaniem gromadzenie danych i ich obróbka w arkuszach Excela czy wykorzystywanie szablonów Worda do tworzenia wydruków. Automatyzacja umożliwia niemal nieograniczony dostęp do komórek i funkcji Excela oraz każdego elementu dokumentu Worda. Jeżeli aplikacja jest serwerem automatyzacji, obiekty przez nią wystawione są dostępne i mogą być kontrolowane przez aplikacje klienckie. Naszym zadaniem jest właśnie tworzenie klientów automatyzacji 1. Uwaga! Spora część przedstawionych w pierwszym rozdziale przykładów jest wiernym tłumaczeniem kodów Visual Basica ze skryptu RAD3. Tam także można znaleźć bardziej wyczerpujące komentarze. 1. Współpraca aplikacji z uruchomioną aplikacją Excela Klient automatyzacji może kontrolować uruchomioną już aplikację lub otworzyć nową jej instancję korzystając z funkcji VCL GetActiveOleObject() oraz CreateOleObject(). Obie mają bardzo prostą składnię, znacznie prostszą niż ich odpowiedniki z WinAPI. Ich jedynym argumentem jest nazwa klasy np. GetActiveOleObject('Excel.Application') żeby połączyć się z działającą aplikacją Excela lub 1 O tworzeniu aplikacji serwerów można dowiedzieć się np. z Delphi 4 Vademecum profesjonalisty Teixeira i Pacheco, Wydawnictwo Helion Gliwice 1998. 3

CreateOleObject('AcroExch.App') żeby zainicjować aplikację Adobe Acrobat. Chyba najczęściej wykorzystywanymi obiektami automatyzacji są obiekty Microsoft Office Delphi, na palecie Servers udostępnia nawet kontrolki ActiveX ułatwiające ich wykorzystanie jednak pozbawione są wszelkiej dokumentacji. Jedynym sposobem jest analiza plików w katalogu Delphi OCX\Servers. Z kolei informacje o obiektach podłączanych za pomocą funkcji GetActiveOleObject() i CreateOleObject() można uzyskać na stronach MSDN, jeżeli udostępniane są przez serwery automatyzacji dostarczane przez Microsoft, lun ze stron innych producentów. Bardzo wygodnym narzędziem analizy obiektów automatyzacji OLE jest Object Browser w Visual Basicu, oczywiście o ile korzystamy także z konkurencji Borlanda. Napiszmy prostą aplikację łączącą się z uruchomioną aplikacją Excel. W tym celu stwórzmy projekt Delphi zawierający cztery przyciski i ListBox podobnie jak na rysunku. Informacje o aktualnie uruchomionej aplikacji Excela (przycisk Button1) procedure TForm1.Button1Click(Sender: TObject); var ExlApp :Variant; //Deklaracja obiektu Excela jako wariant komunikat :String; //Tu obiekt nie jest tworzony, a jedynie do zmiennej przypisywany jest //obiekt istniejacy (uruchomiona aplikacja Excela) try ExlApp:=GetActiveOleObject('Excel.Application'); except on EOleSysError do ShowMessage('Błąd! Nie udało się podłączyć do Excela.'); Exit; //Informacja o aktywnym skoroszycie, arkuszu i komórce komunikat:='aktywny zeszyt: '+ExlApp.ActiveWorkbook.Name +Chr(10)+ 'Aktywny arkusz: '+ExlApp.ActiveSheet.Name +Chr(10)+ 'Adres aktywnego pola: '+ExlApp.ActiveCell.Address +Chr(10)+ 'Wartość aktywnego pola: '+String(ExlApp.ActiveCell.Value); MessageBox(Handle,PChar(komunikat), 'Informacje o aktualnie uruchomionej aplikacji Excela',MB_OK); ExlApp:=NULL; Najpierw podłączymy się do Excela funkcją GetActiveOleObject(). Ponieważ jej rezultat nie jest pewny (np. Excel może nie być uruchomiony) wykorzystaliśmy konstrukcję try except, aby wychwycić ewentualny wyjątek EOleSysError 2. Jeżeli połączenie się powiodło pobieramy z obiektu informacje o nazwach aktywnego zeszytu i aktywnego arkusza oraz adresie i wartości aktywnej komórki. Następnie uzyskane informacje prezentujemy korzystając z metody Application.MessageBox(). Uwaga! W projektowaniu aplikacji korzystających z mechanizmu Automatyzacji OLE bardzo często przerywamy działanie tworzonej aplikacji bez zwalniania podłączonego obiektu. Często utrudnia to, lub nawet uniemożliwia, kolejne jej uruchomienia ze względu na działający w ukryciu egzemplarz serwera automatyzacji. W takiej sytuacji należy w Menadżerze zadań Windows na zakładce Procesy odnaleźć odpowiedni proces i go zakończyć. 2 W dalszych przykładach pominiemy obsługę błędów w imię przejrzystości. 4

Zamknij aktualnie uruchomioną aplikację Excela (przycisk Button2) Podobnie proste jak czytanie i zmienianie własności obiektu uzyskanego dzięki dobrodziejstwu automatyzacji jest wykonywanie jego metod. Można dla przykładu zamknąć uruchomioną aplikację Excela korzystając z jego metody Quit: procedure TForm1.Button2Click(Sender: TObject); var ExlApp :Variant; //Deklaracja obiektu Excela jako wariant ExlApp:=GetActiveOleObject('Excel.Application'); //Przypisanie if not VarIsEmpty(ExlApp) then ExlApp.Quit; //Wykorzystanie funkcji Excela ExlApp:=NULL; Tym razem zamiast otaczać obsługą wyjątków moment podłączania do uruchomionej aplikacji Excela sprawdzamy czy połączenie się udało weryfikując przed wykonaniem jego metody, czy w reprezentujący go obiekt ExlApp rzeczywiście jest zainicjowany (powie nam to funkcja VarIsEmpty()). Odczytaj nazwy arkuszy z uruchomionego Excela (Button3) Zajrzymy do aktywnej aplikacji Exela i w ListBoxie umieścimy informacje o jego wszystkich zeszytach i arkuszach. procedure TForm1.Button3Click(Sender: TObject); var ExlApp :Variant; //Deklaracja obiektu Excela jako wariant n,m :Integer; //Przypisanie ExlApp:=GetActiveOleObject('Excel.Application'); //Czyszczenie listy ListBox1.Clear; //Czytanie nazw zeszytów i arkuszy for n:=1 to ExlApp.Workbooks.Count do //Petla po skoroszytach for m:=1 to ExlApp.Workbooks.Item[n].Sheets.Count do //Arkusze ListBox1.Items.Add(ExlApp.Workbooks.Item[n].Name +', '+ ExlApp.Workbooks.Item[n].Sheets.Item[m].Name); //Zwolnienie zmiennej ExlApp:=NULL; Procedura wykonuje dwie pętle. Zewnętrzna (ze zmienną n) przebiega po skoroszytach (wykorzystano własność Application.Workbooks.Count przechowującą ilość otwartych skoroszytów w aplikacji Excela). Pętla wewnętrzna (ze zmienną m przebiegającą od 1 do wartości własności Count w Sheets) odczytuje nazwy arkuszy i razem z nazwami zeszytów umieszcza je w liście. Zapisz obszar roboczy do pliku (okno dialogowe w Excelu) (Button4) Korzystając z okienka Zachowaj jako Excela (metoda GetSaveAsFilename()), zachowamy aktywny zeszyt do pliku o wybranej przez nas nazwie. Alternatywnie można posłużyć się dialogiem z biblioteki VCL TSaveDialog: procedure TForm1.Button4Click(Sender: TObject); var ExlApp :Variant; //Deklaracja obiektu Excela jako wariant NazwaPliku :String; 5

ExlApp:=GetActiveOleObject('Excel.Application'); //Przypisanie NazwaPliku:=''; while NazwaPliku='' do NazwaPliku:=ExlApp.GetSaveAsFilename(NazwaPliku); ExlApp.ActiveWorkbook.SaveAs(FileName:=NazwaPliku); //Trzeba pamietac o rozszerzeniu.xls 2. Tworzenie obiektu Excel.Application Równie proste jest jak podłączanie się do uruchomionej aplikacji jest tworzenie nowego egzemplarza tej aplikacji. Stwórzmy prostą aplikację z dwoma przyciskami: Pierwszy otwiera pusty Excel, a drugi tworzy w nim nowy arkusz. Kompletnie pominięto obsługę błędów. Stwórz obiekt OLE Excel.Application procedure TForm1.Button1Click(Sender: TObject); ExlApp:=CreateOleObject( Excel.Application ); ExlApp.Visible:=True; Otwórz zeszyt w Excelu (metoda obiektu) procedure TForm1.Button2Click(Sender: TObject); if not VarIsEmpty(ExlApp) then ExlApp.Workbooks.Add; 3. Edycja komórek Excela Ta aplikacja, w odróżnieniu od projektu z pierwszego paragrafu połączy się z Excelem przy uruchomieniu aplikacji i korzystać będzie z globalnego obiektu ExlApp, zamiast z lokalnych obiektów w każdej metodzie. Połączenie następuje w metodzie FormCreate: procedure TForm1.FormCreate(Sender: TObject); try ExlApp:=GetActiveOleObject( Excel.Application ); except on E: EOleSysError do ShowMessage( Blad inicjacji obiektu Excela ( +E.Message+ ) ); 6

Halt; Czytaj wartość aktualnej komórki Podobnie jak poprzednio metody mają cel jedynie demonstracyjny, więc są jak najprostsze: procedure TForm1.Button1Click(Sender: TObject); Label3.Caption:=ExlApp.ActiveWorkbook.Name+. + ExlApp.ActiveSheet.Name+. + ExlApp.ActiveCell.Address; Edit1.Text:=ExlApp.ActiveCell.Value; Zapisz wartość do aktualnej komórki i Wytłuść czcionkę w akt. komórce Komunikacja z aplikacją może być dwustronna, tzn. z komórek można oczywiście czytać wartości, ale można je także modyfikować: procedure TForm1.Button2Click(Sender: TObject); ExlApp.ActiveCell.Value:=Edit1.Text; oraz procedure TForm1.Button3Click(Sender: TObject); ExlApp.ActiveCell.Font.Bold:=True; Aplikacja Excela widoczna Kolejną własnością obiektu Excel.Application jest Visible, która pozwala ukryć jego okno: procedure TForm1.CheckBox1Click(Sender: TObject); ExlApp.Visible:=CheckBox1.Checked; 7

4. Serwer automatyzacji OLE Internet Explorer Zadaniem kolejnej mini aplikacji jest zilustrowanie łączenia z innym serwerem automatyzacji. Jej działanie ani kod nie wymagają chyba komentarza. procedure TForm1.Button1Click(Sender: TObject); IE:=CreateOleObject('InternetExplorer.Application'); //IE:=GetActiveOleObject('InternetExplorer.Application'); IE.Visible:=true; IE.Navigate(Edit1.Text); 8

III. Paleta serwerów automatyzacji Na palecie Servers w Delphi Proffesional i Enterprise (od wersji 5) można znaleźć kontrolki ActiveX ułatwiające komunikację z serwerami automatyzacji. W szczególności udostępniają zdarzenia tych obiektów. Napiszmy ponownie dwa projekty z poprzedniego rozdziału korzystając z kontrolki TExcelApplication. 1. Współpraca aplikacji z uruchiomioną aplikacją Excela Do identycznie jak poprzednio przygotowanej formy dodajemy komponent TExcelApplication. Metoda służąca do łaczenia z Excelem to Connect (można również ustawić własność AutoConnect). To czy ma być wykryta działająca aplikacja, czy stworzona nowa zależy od wartości własności ConnectKind. Co więcej komponent umożliwia wybranie zdalnego komputera, na którym chcemy wykryć lub uruchomić Excela. Zmodyfikowana metoda projektu pobierająca informacje o uruchomionym Excelu może wyglądać następująco: procedure TForm1.Button1Click(Sender: TObject); var komunikat :String; ExcelApplication1.Connect; 9

with ExcelApplication1 do komunikat:='aktywny zeszyt: '+ActiveWorkbook.Name +Chr(10)+ 'Aktywny arkusz: '+(ActiveSheet as _Worksheet).Name +Chr(10)+ 'Adres aktywnego pola: '+ActiveCell.Address[True,True,1,False,False] +Chr(10)+ 'Wartość aktywnego pola: '+String(ActiveCell.Value); MessageBox(Handle,PChar(komunikat), 'Informacje o aktualnie uruchomionej aplikacji Excela',IDOK); ExcelApplication1.Disconnect; W kodzie metody kontrolka ExcelApplication1 zastąpiła zmienną ExlApp typu Variant z poprzedniej implementacji. Dostępny jest ActiveWorkbook typu ExcelWorkbook (równoważne z _Workbook) oraz ActiveCell typu ExcelRange. Natomiast własność ActiveSheet udostępniona jest za pomocą interface u Delphi dla obiektów OLE IDispatch. Aby uzyskać dostęp do własności tego obiektu należy go wcześniej zrzutować na typ ExcelWorksheet (lub równoważne _WorkSheet): (ActiveSheet as _Worksheet).Name. Procedura powinna się zakończyć rozłączeniem z obiektem. Pozostałe procedury należy zmodyfikować w analogiczny sposób. procedure TForm1.Button2Click(Sender: TObject); ExcelApplication1.Connect; ExcelApplication1.Quit; ExcelApplication1.Disconnect; oraz procedure TForm1.Button3Click(Sender: TObject); var n,m :Integer; ExcelApplication1.Connect; //Czyszczenie listy ListBox1.Clear; //Czytanie nazw zeszytów i arkuszy for n:=1 to ExcelApplication1.Workbooks.Count do //Petla po skoroszytach for m:=1 to ExcelApplication1.Workbooks.Item[n].Sheets.Count do //Arkusze ListBox1.Items.Add(ExcelApplication1.Workbooks.Item[n].Name +', '+ (ExcelApplication1.Workbooks.Item[n].Sheets.Item[m] as _Worksheet).Name); ExcelApplication1.Disconnect; Analogicznie można zmodyfikować projekt z paragrafu 3 w poprzednim rozdziale. Tym razem do formy dodałem również kontrolkę TExcelWorksheet. Z jej zdarzeniami OnSelectionChange oraz OnChange wiążę metodę, która wywołuje z kolei metodę zdarzeniową związaną z naciśnięciem Button1. Ta metoda zdarzeniowa aktualizuje wyświetlany adres i wartość aktywnej komórki. procedure TForm1.ExcelWorksheet1SelectionChange(ASender: TObject; const Target: ExcelRange); Button1Click(Self); 10

2. Przykład współpracy aplikacji z Microsoft Word Współpraca z edytorem tekstu dostępnym w Office za pomocą kontrolek Worda jest również prosta. Po połączeniu aplikacji z Wordem i otwarciu nowego dokumentu w reakcji na naciśnięcie pierwszego przycisku procedure TForm1.Button1Click(Sender: TObject); var NazwaPliku :OleVariant; NazwaPliku:=FileListBox1.FileName; WordApplication1.Connect; WordApplication1.Visible:=true; WordApplication1.Documents.Open(NazwaPliku, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); możemy modyfikować dokument Worda. Tu na przykład modyfikowany jest zaznaczony fragment tekstu: procedure TForm1.Button2Click(Sender: TObject); var NazwaPliku :OleVariant; NazwaPliku:=FileListBox1.FileName; if FontDialog1.Execute then WordApplication1.Connect; WordApplication1.Visible:=true; WordDocument1.ConnectTo(WordApplication1.Documents.Open( NazwaPliku, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam)); with WordDocument1.Range.Font do Bold:=Integer(fsBold in FontDialog1.Font.Style); Italic:=Integer(fsItalic in FontDialog1.Font.Style); Underline:=Integer(fsUnderline in FontDialog1.Font.Style); Strikethrough:=Integer(fsStrikeOut in FontDialog1.Font.Style); Name:=FontDialog1.Font.Name; Size:=FontDialog1.Font.Size; case FontDialog1.Font.Color of clblack: ColorIndex:=wdBlack; 11

clblue: ColorIndex:=wdBlue; claqua: ColorIndex:=wdTurquoise; cllime : ColorIndex:=wdBrightGreen; clfuchsia: ColorIndex:=wdPink; clred: ColorIndex:=wdRed; clyellow: ColorIndex:=wdYellow; clwhite: ColorIndex:=wdWhite; clnavy: ColorIndex:=wdDarkBlue; clteal: ColorIndex:=wdTeal; clgreen: ColorIndex:=wdGreen; clpurple: ColorIndex:=wdViolet; clmaroon: ColorIndex:=wdDarkRed; clolive: ColorIndex:=wdDarkYellow; clgray: ColorIndex:=wdGray50; clsilver: ColorIndex:=wdGray25; WordDocument1.Disconnect; Ze względu na różnice w implementacji klasy przechowującej wartość koloru (w tym przypadku koloru czcionki) konieczne jest tłumaczenie stałych określających kolory. Wreszcie można wywoływać metody Worda, np. wywołanie sprawdzania pisowni: procedure TForm1.Button3Click(Sender: TObject); var NazwaPliku :OleVariant; NazwaPliku:=FileListBox1.FileName; WordApplication1.Connect; WordApplication1.Visible:=true; WordDocument1.ConnectTo(WordApplication1.Documents.Open(NazwaPliku, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam)); WordDocument1.CheckSpelling; WordDocument1.Disconnect; Uwaga! OLE Automation nie wyparł tradycyjnego osadzania i łączenia obiektów, czyli w środowisku 32-bitowym OLE2. Przykłady wykorzystania w tym celu komponentu TOLEContainer oraz użycie jego metod i własności można znaleźć w źródłach dołączonych do tego działu w katalogach rozpoczynających się od RAD4.ole.IV. W przeciwieństwie do serwerów są to dobrze udokumentowane komponenty VCL i dlatego pominąłem w tym skrypcie opis tych przykładów. 12