DEL420 ZAAWANSOWANE PROGRAMOWANIE W (PAKIECIE) DELPHI Andrzej Marciniak Prezentacja multimedialna przygotowana za pomoc¹ systemu Corel Presentations 11 Copyright 2004-2010 by Andrzej Marciniak DEL-8(1 z 46)
Na poprzednim wyk³adzie... P elementy jêzyka Delphi Pascal zwi¹zane z grafik¹ (cd.) typ TColor komponent Shape (typ TShape) komponent Image (typ TImage) komponent Chart (typ TChart) P formaty zbiorów z rysunkami (mapy bitowe, piktogramy, metazbiory) P komponenty dotycz¹ce obs³ugi multimediów komponent Animate (typ TAnimate) komponent MediaPlayer (typ TMediaPlayer) P rysowanie wykresów funkcji DEL-8(2 z 46)
Na tym wyk³adzie... P tworzenie komponentów VCL i ActiveX oraz ich wykorzystanie konstrukcja komponentu VCL testowanie komponentu VCL konstrukcja komponentu ActiveX testowanie komponentu ActiveX DEL-8(3 z 46)
VCL i ActiveX Kierowca nie musi znaæ budowy skrzyni biegów wystarczy, e potrafi j¹ obs³ugiwaæ. Komponenty zdejmuj¹ z programisty ciê ar zajmowania siê szczegó³ami. Wystarczy je u ywaæ, a nie zastanawiaæ siê nad tym, jak s¹ zbudowane. Szczegó³ami zajmujemy siê na etapie projektowania lub modyfikowania komponentów. DEL-8(4 z 46)
VCL i ActiveX Powody znajomoœci sposobu tworzenia komponentów: P wielokrotne wykorzystanie tego samego kodu, P modyfikacja istniej¹cych komponentów (poniewa ka dy komponent jest obiektem, wiêc opieraj¹c siê na nim mo emy utworzyæ nowy komponent, który bêdzie dziedziczy³ jego w³asnoœci), P udostêpnianie gotowych komponentów (mo liwoœæ nabywania dodatkowych komponentów od niezale nego dostawcy lub komercyjna dystrybucja w³asnych komponentów w postaci skompilowanej bez udostêpniania kodu Ÿród³owego). Uwaga: W œrodowisku Delphi komponenty ActiveX tworzy siê z komponentów VCL. DEL-8(5 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) W palecie komponentów tworzony komponent powinien byæ reprezentowany za pomoc¹ jakiegoœ piktogramu. Zasady wyœwietlania piktogramów komponentów: P po dodaniu komponentu do œrodowiska Delphi (bêdzie dalej) jego piktogram jest poszukiwany w zbiorze o takiej samej nazwie, jak nazwa zbioru z modu³em (.PAS) zawieraj¹cym opis komponentu, ale o rozszerzeniu nazwy DCR (skr. ang. Delphi Component Resource), zbiór.dcr jest zwyk³ym zbiorem z zasobem (.RES), tyle e o zmienionym rozszerzeniu nazwy, DEL-8(6 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) W palecie komponentów tworzony komponent powinien byæ reprezentowany za pomoc¹ jakiegoœ piktogramu. Zasady wyœwietlania piktogramów komponentów: P jeœli taki zbiór nie zostanie odnaleziony, to komponent bêdzie reprezentowany w palecie przez piktogram domyœlny (w zale noœci od typu przodka tworzonego komponentu piktogram ten mo e byæ ró ny). DEL-8(7 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) W zbiorze.dcr piktogram jest pamiêtany jako 16- lub 256-kolorowa mapa bitowa o rozmiarze 24 24 piksele (zaleca siê stosowaæ 16-kolorowe mapy bitowe). Piktogram komponentu mo na przygotowaæ za pomoc¹ programu Image Editor (program narzêdziowy dostêpny w œrodowisku Delphi). W tym celu nale y: P zainicjowaæ polecenie Image Editor w opcji Tools menu œrodowiska Delphi, co spowoduje wyœwietlenie na ekranie g³ównego okienka wspomnianego programu (okienko to ma tak¹ sam¹ nazwê Image Editor), DEL-8(8 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) tu jest to polecenie W tym celu nale y: P w menu okienka Image Editor zainicjowaæ polecenie File New Component Resource File (spowoduje to zmianê opcji g³ównego menu okienka), DEL-8(9 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) tu jest to polecenie W tym celu nale y: Pzainicjowaæ polecenie Resource New Bitmap, które otworzy okienko dialogowe Bitmap Properties, DEL-8(10 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) ustaliæ rozmiar na 24 24 piksele W tym celu nale y: Pw grupie Size okienka Bitmap Properties ustaliæ wysokoœæ i szerokoœæ na 24 piksele (przez wpisanie odpowiednich wartoœci), a w grupie Colors w³¹czyæ parametr ustalaj¹cy liczbê kolorów na 16, po czym wybraæ przycisk OK, DEL-8(11 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) klikn¹æ podwójnie W tym celu nale y: Pw okienku Untitled1.dcr usytuowaæ kursor myszki na napisie Bitmap1 i nacisn¹æ podwójnie klawisz myszki, co spowoduje otwarcie okienka do wykonania rysunku piktogramu (utworzenia mapy bitowej), DEL-8(12 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) w opcji View s¹ polecenia Zoom In i Zoom Out przyk³adowy rysunek piktogramu komponentu DEL-8(13 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) zmiana nazwy rysunku W tym celu nale y: Ppo wykonaniu rysunku w okienku Untitled1.dcr zmieniæ nazwê z domyœlnej Bitamp1 na np. TStaticTextClock (tak samo bêdzie nazywa³a siê klasa definiuj¹ca komponent), DEL-8(14 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) W tym celu nale y: Pzapisaæ zasób w zbiorze STATICTEXTCLOCK przez zainicjowanie polecenia File Save As i wpisanie odpowiedniej nazwy w podokienku Save Untitled1.dcr As (tytu³ zale y od wersji œrodowiska Windows) wyœwietlonego okienka dialogowego (rozszerzenie nazwy DCR zostanie przyjête domyœlnie). DEL-8(15 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) Po zapisaniu na dysku zasobu z piktogramem komponentu mo na rozpocz¹æ jego tworzenie. W tym celu nale y: P w g³ównym menu œrodowiska Delphi zainicjowaæ polecenie Component New Component, DEL-8(16 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) tu wpisaæ nazwê przodka W tym celu nale y: P w wyœwietlonym okienku New Component okreœliæ nazwê przodka tworzonej klasy (w podokienku kombinowanym Ancestor type), którym w naszym przypadku bêdzie klasa TStaticText (t³umaczy to przyjêt¹ przez nas wczeœniej nazwê komponentu StaticTextClock), DEL-8(17 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) tu wpisaæ nazwê klasy definiuj¹cej komponent nazwê klasy definiuj¹cej komponent (w podokienku Class Name) w naszym przypadku TStaticTextClock, przyj¹æ (lub zmieniæ) domyœlne ustalenia w innych podokienkach wejœciowych (podczas wpisywania nazwy komponentu, w podokienku Unit file name jest modyfikowana domyœlna nazwa modu³u z jego definicj¹; domyœln¹ stron¹ palety komponentów jest strona Samples), DEL-8(18 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) W tym celu nale y: Tworzenie komponentów P wybraæ przycisk OK, co spowoduje otwarcie okienka redakcyjnego z modu³em zawieraj¹cym definicjê klasy opisuj¹cej komponent, P zapisaæ modu³ na dysku ( File Save), P zainicjowaæ polecenie Component Install Component, Uwaga: Przy pracy w sieci ustaliæ w³asny katalog zapisu. DEL-8(19 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) tu wpisaæ nazwê pakietu W tym celu nale y: P w wyœwietlonym okienku Install Component przejœæ na stronê Into new package i wpisaæ nazwê pakietu w podokienku wejœciowym Package file name (komponenty s¹ przechowywane w pakietach ), po czym wybraæ przycisk OK. DEL-8(20 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) Koniec instalacji komponentu zostanie zasygnalizowany przez wyœwietlenie nastêpuj¹cego okienka: DEL-8(21 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) Utworzony automatycznie modu³ z definicj¹ komponentu ma postaæ Modu³ ten zawiera, oprócz definicji klasy okreœlaj¹cej komponent, tak e procedurê Register, której zadaniem jest umieszczenie piktogramu komponentu w palecie (procedura (RegisterComponents, której wywo³anie wystêpuje w treœci procedury Register, jest zdefiniowana w module Classes biblioteki VCL). unit StaticTextClock; interface uses SysUtils, Classes, Controls, StdCtrls; type TStaticTextClock = class (TStaticText) private { Private declarations } protected { Protected declarations } public { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents ( Samples, [TStaticTextClock]); end; end. DEL-8(22 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) O tym, e komponent zosta³ prawid³owo zainstalowany, mo na przekonaæ siê wyœwietlaj¹c odpowiedni¹ stronê palety komponentów (w podanym przyk³adzie stronê Samples). Na stronie tej powinien znajdowaæ siê jego piktogram. tu jest piktogram komponentu DEL-8(23 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) podœwietliæ napis wybraæ ten przycisk Uwaga: W celu usuniêcia komponentu nale y zainicjowaæ polecenie Project Options, w wyœwietlonym okienku dialogowym przejœæ do strony Packages i przy podœwietlonej nazwie zbioru z pakietem (lub jego opisie) na liœcie Design Packages wybraæ na tej stronie przycisk Remove. Spowoduje to usuniêcie wskazanego pakietu, a tym samym zawartego w nim komponentu. DEL-8(24 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) Zmiana (modyfikacja) zarejestrowanego komponentu polega zwykle na dodaniu kilku nowych elementów do definiuj¹cej go klasy. W tym celu nale y uruchomiæ program zarz¹dzaj¹cy pakietami przez zainicjowanie polecenia File Open i wyszukanie w wyœwietlonej liœcie zbiorów odpowiedniego pakietu (otwarcie pakietu automatycznie uruchamia ten program). DEL-8(25 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) Wczytanie pakietu (w naszym przypadku MOJEKOMPONENTY.DPK) spowoduje wyœwietlenie g³ównego okienka programu zarz¹dzaj¹cego pakietami z list¹ jego modu³ów (w naszym przypadku lista ta bêdzie zawiera³a tylko jeden modu³ StaticTextClock). Po usytuowaniu kursora myszki na nazwie modu³u i podwójnym naciœniêciu jej klawisza, na ekranie zostanie wyœwietlone okienko redakcyjne z tekstem Ÿród³owym modu³u. tu podwójnie klikn¹æ DEL-8(26 z 46)
Konstrukcja komponentu VCL (przyk³ad: StaticTextClock) Przyk³ad modyfikacji klasy TStaticTextClock (utworzenie komponentu wyœwietlaj¹cego u do³u formatki aktualn¹ datê i czas) zostanie podany podczas demonstracji... Po modyfikacji nale y skompilowaæ ca³y pakiet (wykonujemy to przez wybór przycisku Compile w g³ównym okienku programu zarz¹dzaj¹cego pakietami). Test poprawnoœci konstrukcji komponentu: na pustej formatce umieœciæ utworzony komponent (jeœli wymaga on obecnoœci innych komponentów, to te je umieœciæ na formatce), po czym wykonaæ program. DEL-8(27 z 46)
Konstrukcja i testowanie komponentu (przyk³ad: StaticTextClock)... a teraz prezentacja DEL-8(28 z 46)
Konstrukcja komponentu ActiveX (przyk³ad: StaticTextClockX) Komponenty ActiveX (elementy steruj¹ce i formatki) mog¹ byæ wykorzystywane w ró nych pakietach (m. in. C++ Builder, Visual C++, Visual Basic) i przegl¹darkach internetowych. atwiej jest zintegrowaæ z programem (aplikacj¹) obiekt realizuj¹cy okreœlone funkcje ni programowaæ te funkcje od pocz¹tku. Z komponentu StaticTextClock utworzymy komponent ActiveX, który nazwiemy (przez analogiê) StaticTextClockX. W tym celu wystarczy wykonaæ kilka prostych operacji: P zainicjowaæ polecenie File New Other i w wyœwietlonym okienku New Items przejœæ na stronê ActiveX, DEL-8(29 z 46)
Konstrukcja komponentu ActiveX (przyk³ad: StaticTextClockX) wybraæ ten piktogram W tym celu wystarczy wykonaæ kilka prostych operacji: P wybraæ na niej piktogram ActiveX Control, co spowoduje wyœwietlenie okienka dialogowego kreatora komponentów ActiveX, DEL-8(30 z 46)
Konstrukcja komponentu ActiveX (przyk³ad: StaticTextClockX) wybraæ klasê definiuj¹c¹ zwyk³y komponent W tym celu wystarczy wykonaæ kilka prostych operacji: P w podokienku listowym VCL Class Name tego okienka wybraæ (z listy) nazwê klasy definiuj¹cej zwyk³y komponent, z którego nale y utworzyæ komponent ActiveX i po akceptacji pozosta³ych ustaleñ domyœlnych (lub ich zmianie) wybraæ przycisk OK, co spowoduje automatyczne wygenerowanie modu³u z definicj¹ klasy okreœlaj¹cej komponent ActiveX. DEL-8(31 z 46)
Konstrukcja komponentu ActiveX (przyk³ad: StaticTextClockX) W przyk³adzie komponent ActiveX okreœla klasa TStaticTextClockX : type TStaticTextClockX = class (TActiveXControl, IStaticTextClockX); W jej nag³ówku obok nazwy przodka ( TActiveXControl) jest podana nazwa ³¹cza programowego ( IStaticTextClockX ). ¹cze to jest zdefiniowane w module Project2_TLB, który tak e zosta³ utworzony automatycznie. W definicji ³¹cza programowego IStaticTextControlX s¹ zdefiniowane w³asnoœci odpowiadaj¹ce w³asnoœciom komponentu StaticTextClock, ale dostêp do nich odbywa siê wy³¹cznie za pomoc¹ metod (o przedrostku Get_ oraz Set_ ), których definicje s¹ podane w implementacji ³¹cza, czyli w klasie TStaticTextClockX. DEL-8(32 z 46)
Konstrukcja komponentu ActiveX (przyk³ad: StaticTextClockX) Uwaga: Nie nale y bezpoœrednio zmieniaæ (modyfikowaæ) adnych tekstów Ÿród³owych zwi¹zanych z komponentem ActiveX. Do ingerencji we wszystkie elementy definicji komponentu ActiveX s³u y specjalny edytor, który jest inicjowany za pomoc¹ polecenia View Type Library. DEL-8(33 z 46)
Konstrukcja komponentu ActiveX (przyk³ad: StaticTextClockX) Automatyczne wygenerowanie modu³u z definicj¹ komponentu ActiveX nie koñczy procesu jego tworzenia. Nale y jeszcze ca³y projekt (bibliotekê): P skompilowaæ przez zainicjowanie polecenia Project Compile, w wyniku czego otrzymamy zbiór dyskowy.ocx z komponentem, P zarejestrowaæ w systemie, operacjê któr¹ wykonujemy za pomoc¹ polecenia Run Register ActiveX Server (do anulowania rejestracji s³u y polecenie Run Unregister ActiveX Server ). DEL-8(34 z 46)
Konstrukcja komponentu ActiveX (przyk³ad: StaticTextClockX) polecenie rejestruj¹ce Pomyœlna rejestracja zakoñczy siê wyœwietleniem nastêpuj¹cego komunikatu: DEL-8(35 z 46)
Testowanie komponentu ActiveX (przyk³ad: StaticTextClockX) Za pomoc¹ polecenia Component Install Component utworzony komponent ActiveX mo na do³¹czyæ do palety komponentów (na stronie ActiveX). Sprawdzanie poprawnoœci jego dzia³ania sprowadzi siê wówczas do umieszczania go na formatkach testowych programów okienkowych. Inny sposób polega na wyœwietleniu go w przegl¹darce internetowej. DEL-8(36 z 46)
Testowanie komponentu ActiveX (przyk³ad: StaticTextClockX) Œrodowisko Delphi zawiera gotowe narzêdzia do tworzenia dla przegl¹darek internetowych testowych zbiorów HTML (o rozszerzeniu nazwy HTM) zawieraj¹cych po³¹czenia z obiektami typu ActiveX (tak e typu ActiveForm). Odpowiednie polecenia ( Web Deployment Options oraz Web Deploy) znajduj¹ siê w opcji Project g³ównego menu œrodowiska. Uwaga: Jeœli polecenia te s¹ wy³¹czone, czyli s¹ niedostêpne, oznacza to, e bie ¹cy projekt nie jest projektem typu ActiveX. DEL-8(37 z 46)
Zainicjowanie polecenia Project Web Deployment Options spowoduje wyœwietlenie na ekranie okienka o takiej samej nazwie. Testowanie komponentu ActiveX (przyk³ad: StaticTextClockX) tu jest to polecenie DEL-8(38 z 46)
Testowanie komponentu ActiveX (przyk³ad: StaticTextClockX) Okienko Web Deployment Options DEL-8(39 z 46)
Testowanie komponentu ActiveX (przyk³ad: StaticTextClockX) Na pierwszej stronie ( Project ) tego okienka nale y okreœliæ: P skorowidz, w którym ma byæ zapisany zbiór.ocx ze sterownikiem ActiveX lub formatk¹ typu ActiveForm (w podokienku wejœciowym Target dir, np. C:\Program Files\Delphi 7\Projects), P lokalizacjê zbioru.ocx wyspecyfikowan¹ w formacie URL (skr. ang. Uniform Resource Locator) i przeznaczon¹ dla serwera (np. http://serwerxxx/), a w przypadku braku serwera skorowidz testowy (tak e w formacie URL, np. file:///c:\program Files\Delphi 7 \Projects); informacjê tê nale y wpisaæ w podokienku Target URL, P skorowidz, w którym œrodowisko Delphi ma utworzyæ testowy zbiór HTML z po³¹czeniem do zbioru.ocx (w podokienku wejœciowym HTML dir). DEL-8(40 z 46)
Testowanie komponentu ActiveX (przyk³ad: StaticTextClockX) Dla celów testowych na ogó³ nie ma potrzeby zmieniaæ domyœlnych ustaleñ ani w grupie General Options (na stronie Project), ani na pozosta³ych stronach okienka Web Deployment Options. Po zamkniêciu okienka Web Deployment Options (przycisk OK) inicjujemy polecenie Project Build, które spowoduje utworzenie zbioru.ocx ze sterownikiem ActiveX (lub formatk¹ ActiveForm). DEL-8(41 z 46)
Testowanie komponentu ActiveX (przyk³ad: StaticTextClockX) Ostatnim etapem utworzenia testowej strony dla przegl¹darki internetowej jest zainicjowanie polecenia Project Web Deploy. Spowoduje ono umieszczenie zbioru.ocx w skorowidzu ustalonym w podokienku Target dir okienka Web Deployment Options i utworzenie zbioru HTML w skorowidzu okreœlonym w podokienku HTML dir tego okienka (zbiór ten bêdzie mia³ tak¹ sam¹ nazwê jak projekt, ale rozszerzenie nazwy HTM). W zbiorze HTML bêdzie okreœlone po³¹czenie (w formacie URL) ze zbiorem.ocx. DEL-8(42 z 46)
Testowanie komponentu ActiveX (przyk³ad: StaticTextClockX) Dla rozwa anego projektu zawartoœæ zbioru HTML bêdzie nastêpuj¹ca (zbiór.htm mo na wczytaæ do okienka redakcyjnego œrodowiska Delphi): <HTML> <H1> Delphi 7 ActiveX Test Page </H1><p> You should see your Delphi 7 forms or controls embedded in the form below. <HR><center><P> <OBJECT classid="clsid:fb791945-df58-4af3-bf1a-a041bd9df1a4" codebase="///c:/program Files/Borland Delphi 7/Projects/StaticTextClockXControl1.ocx#version=1,0,0,0" width=350 height=250 align=center hspace=0 vspace=0 > </OBJECT> </HTML> Uwaga: Numer identyfikacyjny (podany w instrukcji classid) mo e byæ inny. DEL-8(43 z 46)
Po wczytaniu podanego zbioru do przegl¹darki MS Internet Explorer otrzymamy nastêpuj¹cy obraz: Tworzenie komponentów Testowanie komponentu ActiveX (przyk³ad: StaticTextClockX) DEL-8(44 z 46)
Konstrukcja i testowanie komponentu ActiveX (przyk³ad: StaticTextClockX)...prezentacja DEL-8(45 z 46)
KONIEC DEL-8(46 z 46)