22, ## Documents ##, Delphi 4 dla każdego


Rozdział 22.
Aplikacje internetowe


Są tacy, którzy twierdzą, że Internet jest tylko przemijającą modą, zaś korzystanie z niego - przejawem szacownego snobizmu. Jeżeli jesteś jednym z nich - niestety, jesteś w błędzie. Internet rozrósł się już do ogromnych rozmiarów i rozrasta się gwałtownie z każdym dniem. Witryny WWW przestały być już tylko ciekawostkami, stając się jednym z pełnoprawnych narzędzi businessu. Internet to również transfer plików, poczta elektroniczna i usługi komercyjne na odległość.

Skoro nic więc nie zapowiada zmierzchu egzystencji Internetu, warto pokusić się o nabycie umiejętności tworzenia oprogramowania internetowego. Niniejszy rozdział poświęcony jest pewnym aspektom programowania internetowego przy użyciu Delphi.

Komponenty internetowe
dostępne w Delphi

Komponenty internetowe dostępne na stronie Internet Palety Komponentów dzielą się na dwie kategorie. Pierwsza z nich to komponenty dostarczone przez firmę NetMasters; są to „rodowite” komponenty VCL, z jednym wyjątkiem komponentu THTML, który jest kontrolką ActiveX. Lista kontrolek NetMasters wraz z opisem każdej z nich znajduje się w tabeli 22.1; została ona uporządkowana według kolejności występowania kontrolek w Palecie Komponentów.

Tabela 22.1. Internetowe kontrolki NetMasters

Kontrolka

Przeznaczenie

TNMDayTime

Pobiera datę i czas z internetowych serwerów daty i czasu.

TNMEcho

Wysyła i odbiera tekst z internetowych serwerów echa.

TNMFinger

Pobiera informacje na temat użytkownika z serwera finger.

TNMFTP

Przeprowadza transfer plików między komputerami w sieci za pomocą protokołu FTP (File Transfer Protocol).

cd. na następnej stronie

Tabela 22.1. cd. Internetowe kontrolki NetMasters

Kontrolka

Przeznaczenie

TNMHTTP

Przeprowadza transfer plików przy użyciu protokołu HTTP
(Hypertext Transfer Protocol). Zazwyczaj dokumenty w języku HTML są wyświetlane przez przeglądarkę WWW. Do ściągania dokumentów HTML, które nie wymagają wyświetlenia w przeglądarce, stosowana jest kontrolka THTTP.

TNMMsg

Wysyła proste komunikaty tekstowe (ASCII) przy użyciu protokołu TCP/IP.

TNMMSGServ

Odbiera komunikaty wysłane przy użyciu kontrolki TNMMsg.

TNMNNTP

Wysyła i odbiera komunikaty z internetowych serwerów grup
dyskusyjnych przy użyciu protokołu NNTP (Networking News Transfer Protocol).

TNMPOP3

Odbiera wiadomości pocztowe

TNMUUProcessor

Koduje lub dekoduje pliki zawierające informacje typu MIME lub UU.

TNMSMTP

Wysyła pocztę poprzez serwery pocztowe SMTP
(Simple Mail Transfer Protocol).

TNMStrm

Wysyła strumienie danych do stacji lokalnej lub internetowego serwera strumieni.

TNMStrmServ

Odbiera strumienie wysłane przez kontrolkę TNMStrm.

TNMTime

Pobiera datę i czas z internetowych serwerów czasu.

TNMUDP

Dokonuje transferu danych poprzez sieć przy użyciu protokołu UDP (User Datagram Protocol).

TPowersock

Implementuje interfejs Winsock API.

TNMGeneralServer

Stosowana dla ogólnych zastosowań w serwerach TCP/IP.

THTML

Wyświetla pliki HTML (Hypertext Markup Language).
Jest to komponent przeglądarki WWW.

TNMURL

Konwertuje dane URL do postaci czytelnego łańcucha i odwrotnie

Drugą kategorię kontrolek stanowią komponenty VCL firmy Borland. W skład Delphi w wersji Client/Server i Professional wchodzą komponenty TClientSocket i TServerSocket. Komponenty Web Broker (TWebDispatcher, TPageProducer, TQueryTableProducer i TDataSetTableProducer) są dostępne tylko w wersji Client/Server. Lista internetowych komponentów VCL przedstawiona została w tabeli 22.2.

Tabela 22.2. Rodzime komponenty internetowe VCL

Kontrolka

Opis

TClientSocket

Zarządza połączeniami gniazdowymi TCP/IP od strony klienta.

TServerSocket

Zarządza połączeniami gniazdowymi TCP/IP od strony serwera.

TWebDispatcher

Konwertuje zwykły moduł danych do postaci sieciowego modułu danych.

Tabela 22.2. cd. Rodzime komponenty internetowe VCL

Kontrolka

Opis

TPageProducer

Umożliwia budowanie dynamicznych stron HTML.

TQueryTableProducer

Generuje dokument HTML na podstawie danych zwracanych przez komponent TQuery.

TDataSetTableProducer

Generuje dokument HTML na podstawie danych zwracanych przez komponent TDataSet.

Przedstawione grupy komponentów dają możliwości wystarczające do tworzenia wysokiej jakości aplikacji internetowych.

Budowa przeglądarki sieciowej

Do najbardziej dostrzegalnych zadań programowania związanego z Internetem należy tworzenie przeglądarek sieciowych. Jest to najbardziej fascynujące zadanie, które ponadto może okazać się również jednym z najłatwiejszych zadań.

Komu potrzebna jest jeszcze jedna przeglądarka?

Pytanie to jest godne zastanowienia. W końcu wszędzie na świecie królują już Netscape Navigator i Microsoft Internet Explorer, komu więc tak naprawdę potrzebny będzie kolejny nowy model przeglądarki? Nie masz przecież zamiaru budować aplikacji, która będzie konkurować z dwoma powyższymi produktami. Z drugiej strony można wyobrazić sobie firmę zatrudniającą setki lub nawet tysiące pracowników, którzy wymagają dostępu do sieci WWW. Zakupienie licencji na tysiące kopii komercyjnej przeglądarki sieciowej może okazać się bardzo drogim przedsięwzięciem. Napisanie w ciągu kilku godzin dobrej jakości przeglądarki może zaoszczędzić takiej firmie sporo środków finansowych.

Innym powodem, dla którego firma chciałby posiadać niestandardową przeglądarkę WWW jest ograniczenie dostępu do sieci. Dla przykładu, może zaistnieć taka sytuacja, kiedy to pracownicy będą musieli od czasu do czasu odwiedzać określone strony w sieci. W samodzielnie stworzonej przeglądarce można ograniczyć dostęp do sieci pozwalając na łączenie się tylko z autoryzowanymi stronami WWW. Nasuwa się tutaj inna myśl - stworzona samodzielnie przeglądarka doskonale nadaje się dla dzieci!

W końcu, powodem najbardziej przemawiającym za stworzeniem użytkowej przeglądarki sieciowej jest intranet. Intranet jest siecią lokalną zbudowaną w oparciu o technologie internetowe. Intranet może zawierać różnorodne informacje przeznaczone na wewnętrzny użytek firmy - zyski firmy, polityka firmy, książka adresowa pracowników, plany spotkań lub nawet firmowa liga koszykówki. Użytkowa przeglądarka może pozwolić na dostęp do intranetu i jednocześnie uniemożliwić korzystanie z Internetu.

Biorąc pod uwagę powyższe rozważania spróbujemy zbudować prostą przeglądarkę WWW. Zapewne zdziwi Cię łatwość, z jaką zostanie zbudowana ta aplikacja.

Pierwsze kroki procesu budowania przeglądarki

Kontrolka THTML jest gotową do wykorzystania przeglądarką sieciową. Wszystko, co trzeba zrobić, to umieścić ją w formularzu i wywołać metodę RequestDoc. Podejście takie może wydawać się nadmiernie uproszczone, niemniej jednak dokładnie w ten sposób można wyświetlić dokument znajdujący się w dowolnym miejscu Internetu. Oto jak szybko można stworzyć aplikację przeglądarki sieciowej:

  1. Rozpocznij projekt nowej aplikacji. Zmień właściwość Name formularza na WebMain oraz właściwość Caption na EZ Web Browser.

  2. Umieść w formularzu komponent Panel, zmień jego właściwość Align na alTop oraz właściwość Height na 60. Usuń wartość właściwości Caption.

  3. Umieść w panelu komponent ComboBox. Przesuń go w górną część panelu i rozciągnij tak, aby jego rozmiar był równy rozmiarowi panelu. Zmień właściwość Name na URLComboBox. Zmień właściwość Text na dowolny adres URL (na przykład http://www.helion.com.pl lub http://www.turbopower.com). Kliknij podwójnie na właściwość Constraints i zmień ograniczenie AnchorHorz na akStretch.

  4. Umieść w formularzu komponent StatusBar. Zostanie on automatycznie umieszczony w dolnej części formularza. Zmień jego właściwość Name na StatusBar i właściwość SimplePanel na True.

  5. Mniej więcej pośrodku formularza umieść komponent HTML. Zmień jego właściwość Align na alClient. Komponent wypełni całą dostępną przestrzeń. Zmień jego właściwość Name na HTML.

W tej chwili formularz powinien wyglądać tak jak przedstawia to rysunek 22.1. Jeżeli tak nie jest, możesz spróbować dopasować go lub pozostawić bez zmian. (Odrobina indywidualizmu nigdy nie zaszkodzi.)

W tym miejscu powinieneś zapisać cały projekt. Zapisz formularz jako WebBrwsU.pas i projekt jako WebBrows.dpr. Teraz zadbamy o to, aby przeglądarka stała się narzędziem użytecznym.

Rysunek 22.1.

Przeglądarka po wykonaniu kilku pierwszych kroków

0x01 graphic

  1. Kliknij na obiekcie combo, we wnętrzu wygenerowanego szkieletu procedury zdarzeniowej wpisz następujący kod:

if URLComboBox.Text<>'' then

HTML.RequestDoc(URLComboBox.Text);

Po sprawdzeniu, czy tekst w polu listy nie jest łańcuchem pustym następuje wywołanie metody RequestDoc, która ładuje żądany dokument.

  1. Teraz wygeneruj procedurę obsługującą zdarzenie OnKeyPress. W jej ciele funkcji umieść następujący kod:

if Key = Char(VK_RETURN) then begin

Key := #0;

if URLComboBox.Test = '' then

Exit;

URLComboBoxClick(Sender);

end;

W powyższym kodzie na początku sprawdzany jest parametr Key na okoliczność naciśnięcia przycisku Enter. Jeżeli takie zdarzenie miało miejsce, parametr Key jest ustawiany na wartość 0, a następnie wywoływana jest metoda URLComboBoxClick (stworzona w kroku szóstym). Ustawienie wartości Key na 0 zapobiega wydawaniu dźwięku przez głośnik w chwili naciśnięcia klawisza Enter. Wywołanie metody URLComboBoxClick powoduje załadowanie adresu URL.

  1. Skompiluj i uruchom program. Wpisz adres URL i naciśnij klawisz Enter. Jeżeli wpisany adres jest poprawny, do kontrolki HTML załadowana zostanie wyspecyfikowana strona.

W ciągu 15 minut stworzyliśmy przeglądarkę WWW, która swoim działaniem przypomina inne programy tego typu. Naszej aplikacji brakuje jeszcze kilku funkcji, które musimy dodać.

0x01 graphic

Jeżeli jesteś szczęśliwcem posiadającym stałe łącze do Internetu, Twoja przeglądarka będzie gotowa do pracy od zaraz.

Jeżeli korzystasz z połączenia dodzwanianego (Dial-up Networking) z włączoną opcją wybierania automatycznego, połączenie z dostawcą usług internetowych (ISP) zostanie zainicjowane samoczynnie. Jeżeli nie masz zainstalowanego mechanizmu Dial-up Networking, przed uruchomieniem swojego programu będziesz musiał połączyć się „ręcznie” z Internetem.

Dodanie wskaźnika postępu

Jedną z cech, której nie posiada jeszcze przeglądarka, jest informacja o stanie ładowania strony. Naszym zadaniem będzie dodanie procedury, która uaktualnia pasek stanu w trakcie wczytywania strony. W celu uzyskania okresowego uaktualniania stanu wykorzystamy zdarzenia OnUpdateRetrieval i OnEndRetrieval należące do komponentu HTML. Do procentowego określenia ilości załadowanych danych posłużą metody GetBytesTotal i GetBytesDone, na końcu wyznaczona wartość procentowa zostanie wyświetlona na pasku stanu.

  1. Kliknij na kontrolce HTML umieszczonej w formularzu. Wygeneruj procedurę obsługującą zdarzenie OnUpdateRetrieval. Dodaj kod do wnętrza funkcji tak, aby przyjęła ona następującą postać:

procedure TWebMain.HTMLUpdateRetrieval(Sender: TObject);

var

Total : Integer;

Done : Integer;

Percent : Integer;

begin

Total := HTML.RetrieveBytesTotal;

Done := HTML.RetrieveBytesDone;

if (Total = 0) or (Done = 0) then

Percent := 0

else

Percent := ((Done * 100) div Total);

StatusBar.SimpleText := Format(

'Getting Document: %d%% z %dK', [Percent, Total div 1024]);

end;

  1. Teraz wygeneruj procedurę obsługującą zdarzenie OnEndRetrieval; w jej ciele umieść linię kodu:

StatusBar.SimpleText := 'Done';

Przyjrzyj się procedurze w pierwszym kroku. Metoda GetBytesTotal informuje o ilości bajtów składających się na ładowany aktualnie dokument lub obiekt osadzony (którym może być również obraz). Metoda GetBytesDone zwraca ilość bajtów odebranych do momentu jej wywołania. Mając te dane można w łatwy sposób określić procentową ilość danych, które zostały już załadowane. Ostatnią operacją jest sformatowanie łańcucha przy użyciu danych uzyskanych z kontrolki HTML i wysłanie ich na pasek stanu. Kod utworzony w drugim kroku zwyczajnie uaktualnia pasek stanu po tym, jak cały dokument zostanie załadowany.

Uruchom ponownie program i obserwuj jego zachowanie w trakcie ładowania strony. Pasek stanu pokazuje procentową ilość załadowanej strony i osadzonych w niej obiektów.

Dodatki końcowe

Na koniec dodamy kilka przycisków pod polem adresu URL. (Końcowy efekt przedstawiony został na rysunku 22.2).

  1. Umieść przycisk w panelu pod obiektem combo. Zmień jego właściwość Name na GoBtn i właściwość Caption na Go!.

  1. Stwórz procedurę obsługującą zdarzenie OnClick nowego przycisku; w jej ciele umieść następującą linię kodu:

URLComboBoxClick(Self);

Rysunek 22.2.

EZ Web Browser po dodaniu wszystkich przycisków

0x01 graphic

  1. Na prawo od poprzedniego przycisku umieść kolejny. Zmień jego właściwość Name na StopBtn i właściwość Caption na Stop.

  2. Wygeneruj procedurę obsługującą zdarzenie OnClick dla tego przycisku i wpisz w jej wnętrzu następujący kod:

HTML.Cancel(0);

StatusBar.SimpleText := 'Done';

  1. Umieść trzeci przycisk w panelu, na prawo od poprzednich dwóch. Zmień jego właściwość Name na ReloadBtn, właściwości Caption nadaj wartość Reload.

  2. Stwórz procedurę obsługującą zdarzenie OnClick tego przycisku i wpisz do jej wnętrza taki sam kod jak w punkcie drugim:

URLComboBoxClick(Self);

  1. Umieść czwarty (ostatni) przycisk w panelu. Zmień jego właściwość Name na SourceBtn i właściwość Caption na View Source.

  2. Stwórz procedurę obsługującą zdarzenie OnClick i wpisz do jej wnętrza następujący kod:

HTML.ViewSource := not HTML.ViewSoruce;

if HTML.ViewSource then

SourceBtn.Caption := 'View Document'

else

SourceBtn.Caption := 'View Source';

Formularz powinien teraz wyglądać tak, na jak rysunku 22.2.

Wykonując powyższe kroki napotkałeś kilka nowych elementów komponentu THTML. Metoda Cancel zatrzymuje proces ładowania dokumentu. Właściwość ViewSource służy do przełączania się między wyświetlaniem dokumentu HTML i jego kodem źródłowym.

Uruchom ponownie program. Sprawdź działanie nowych przycisków zwracając uwagę szczególnie na przycisk View Source (pokaż źródło).

Praca nad przeglądarką została niemal zakończona. Dodajmy kilka nowych cech, których celem będzie dostarczenie dodatkowych informacji o stanie przeglądarki. W tym celu obsłużymy dwa kolejne zdarzenia komponentu THTML.

  1. Wygeneruj procedurę obsługującą zdarzenie OnDoRequestDoc komponentu THTML. W jej ciele umieść następujący kod:

StatusBar.SimpleText := 'Connecting to' + URL + '...';

  1. Teraz stwórz procedurę obsługującą zdarzenie OnBeginRetrieval; w jej wnętrzu umieść następujący kod:

StatusBar.SimpleText := 'Connected...';

URLComboBox.Items.Insert(0, URLComboBox.Text);

W pierwszym kroku wykorzystane zostało zdarzenie OnDoRequestDoc, generowane w chwili żądania załadowania dokumentu. Parametr URL procedury obsługującej to zdarzenie określa adres URL z którym połączyła się przeglądarka. Gdy tylko adres URL jest dostępny, można wykorzystać go zbudowania łańcucha, który wyświetlony zostanie na pasku stanu. Funkcja stworzona w drugim kroku wyświetla na pasku stanu komunikat informujący o rzeczywistym rozpoczęciu ładowania dokumentu. Druga linia tej funkcji pobiera adres URL i dodaje go listy rozwijalnej obiektu combo. Przed dodaniem adresu URL do listy odwiedzonych miejsc trzeba upewnić się, że przeglądarka rzeczywiście połączyła się z tym adresem.

Moje gratulacje - właśnie skończyłeś pracę nad swoją pierwszą aplikacją internetową. Działająca przeglądarka EZ Web Browser została przedstawiona na rysunku 22.3.

Rysunek 22.3.

Przeglądarka EZ Web Browser wyświetlająca stronę WWW

0x01 graphic

Efekt końcowy jest doskonały. Co prawda istnieją takie funkcje, których nasza przeglądarka nie jest w stanie wykonać, ale mimo to zakres jej funkcjonalności jest duży, możesz więc być z siebie dumny. Usiądź wygodnie i podziwiaj swoją pracę. Spróbuj teraz sam zmodyfikować przeglądarkę. Możesz na przykład dodać listę adresów URL, która posłuży następnie do stworzenia przycisków przeglądania (w przód i wstecz). Mógłbyś również zastąpić zwykłe przyciski paskiem narzędzi dodając odpowiednie ikony do przycisków paska. Jeżeli chcesz dodać element stanowiący rzeczywiste uwieńczenie aplikacji, dodaj animację widoczną w czasie ładowania dokumentu, dzięki czemu użytkownik będzie mógł w przybliżeniu określić stan przeglądarki. Do tego celu najlepiej wykorzystać komponent TImageList, również komponent TAnimate może posłużyć do realizacji tego zadania.

Kontrolka THTML posiada kilka właściwości, o których nie było jeszcze mowy. Większość z nich dotyczy preferencji użytkownika takich, jak kolor tła, kolor odnośników, kolor odwiedzonych odnośników, czcionek stosowanych dla każdego z nagłówków, itd. Właściwości te nie będą tutaj szczegółowo omawiane, ponieważ ich użycie jest bardzo proste. Zazwyczaj wystarczy po prostu pozostawić ich ustawienia domyślne. Oczywiście, jeżeli będziesz chciał zmienić wygląd swojej przeglądarki, wtedy warto będzie poświęcić trochę czasu na przestudiowanie listy właściwości kontrolki THTML.

Listing 22.1 przedstawia kod źródłowy głównego modułu przeglądarki.

Listing 21.1. WebBrwsU.pas

unit WebBrwsU;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, OleCtrls, NMHTML, ComCtrls;

type

TWebMain = class(TForm)

Panel1: TPanel;

URLComboBox: TComboBox;

StatusBar: TStatusBar;

HTML: THTML;

GoBtn: TButton;

StopBtn: TButton;

ReloadBtn: TButton;

SourceBtn: TButton;

procedure URLComboBoxClick(Sender: TObject);

procedure URLComboBoxKeyPress(Sender: TObject; var Key: Char);

procedure HTMLUpdateRetrieval(Sender: TObject);

procedure HTMLEndRetrieval(Sender: TObject);

procedure GoBtnClick(Sender: TObject);

procedure StopBtnClick(Sender: TObject);

procedure ReloadBtnClick(Sender: TObject);

procedure SourceBtnClick(Sender: TObject);

procedure HTMLDoRequestDoc(Sender: TObject; const URL: WideString;

Element: HTMLElement; DocInput: DocInput;

var EnableDefault: WordBool);

procedure HTMLBeginRetrieval(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

WebMain: TWebMain;

implementation

{$R *.DFM}

procedure TWebMain.URLComboBoxClick(Sender: TObject);

begin

if URLComboBox.Text <> '' then

HTML.RequestDoc(URLComboBox.Text);

end;

procedure TWebMain.URLComboBoxKeyPress(Sender: TObject; var Key: Char);

begin

if Key = Char(VK_RETURN) then begin

Key := #0;

if URLComboBox.Text = '' then

Exit;

URLComboBoxClick(Sender);

end;

end;

procedure TWebMain.HTMLUpdateRetrieval(Sender: TObject);

var

Total : Integer;

Done : Integer;

Percent : Integer;

begin

Total := HTML.RetrieveBytesTotal;

Done := HTML.RetrieveBytesDone;

if (Total = 0) or (Done = 0) then

Percent := 0

else

Percent := ((Done * 100) div Total);

StatusBar.SimpleText := Format(

'Getting Document: %d%% of %dK', [Percent, Total div 1024]);

end;

procedure TWebMain.HTMLEndRetrieval(Sender: TObject);

begin

StatusBar.SimpleText := 'Done';

end;

procedure TWebMain.GoBtnClick(Sender: TObject);

begin

URLComboBoxClick(Self);

end;

procedure TWebMain.StopBtnClick(Sender: TObject);

begin

HTML.Cancel(0);

StatusBar.SimpleText := 'Done';

end;

procedure TWebMain.ReloadBtnClick(Sender: TObject);

begin

URLComboBoxClick(Self);

end;

procedure TWebMain.SourceBtnClick(Sender: TObject);

begin

HTML.ViewSource := not HTML.ViewSource;

if HTML.ViewSource then

SourceBtn.Caption := 'View Document'

else

SourceBtn.Caption := 'View Source';

end;

procedure TWebMain.HTMLDoRequestDoc(Sender: TObject; const URL: WideString;

Element: HTMLElement; DocInput: DocInput; var EnableDefault: WordBool);

begin

StatusBar.SimpleText := 'Connecting to ' + URL + '...';

end;

procedure TWebMain.HTMLBeginRetrieval(Sender: TObject);

begin

StatusBar.SimpleText := 'Connected...';

URLComboBox.Items.Insert(0, URLComboBox.Text);

end;

end.

Użytkowanie Internet Explorera jako kontrolki ActiveX

Jeżeli zainstalowałeś w swoim systemie przeglądarkę Internet Explorer firmy Microsoft, możesz wykorzystać ją jako kontrolkę ActiveX. Pierwszą rzeczą, jaką musisz wykonać, jest zaimportowanie kontrolki Explorera do Palety Komponentów Delphi. Po umieszczeniu kontrolki w Palecie będzie można umieścić ją w formularzu tak, jak każdą inną kontrolkę. Zacznijmy od pokazania w jaki sposób należy zaimportować Internet Explorer. (Sposób importowania kontrolki ActiveX został już przedstawiony w rozdziale piętnastym „Obiekty typu COM i ActiveX”, drobna powtórka jednak nie zaszkodzi.) Oto sposób postępowania:

  1. Wybierz polecenie menu Component | Import ActiveX Control. Wyświetlone zostanie okno dialogowe importu kontrolki ActiveX.

  1. Z listy dostępnych kontrolek ActiveX wybierz Microsoft Internet Controls (Version 1.x) (rysunek 22.4.). W przypadku Internet Explorera 3 numer wersji będzie równy 1.0, z kolei dla Internet Explorera 4 będzie on równy 1.1. Zwróć uwagę na pole Class names, zgodnie z jego zawartością jedną z klas znajdującą się w pliku jest TWebBrowser. W przypadku Internet Explorera 4 w polu Class names znajdą się również klasy TWebBrowser_V1 (oryginalna kontrolka przeglądarki sieciowej) i TShellFolderViewOC.

  2. Kliknij na przycisku Install, aby zainstalować kontrolkę (wartości pozostałych pól mogą pozostać bez zmian).

  3. Wyświetlone zostanie okno dialogowe instalacji z prośbą o podanie nazwy pakietu. Kliknij na zakładkę Into new package i wpisz w pole File name wartość IE. (Możesz również wpisać opis jeśli chcesz, nie jest to jednak konieczne.) Kliknij na przycisk OK, aby utworzyć pakiet.

  4. Na ekranie pojawi się okno dialogowe proszące o potwierdzenie budowy i instalacji pakietu. Kliknij na przycisk Yes.

  5. 0x08 graphic
    Rysunek 22.4.

    Okno dialogowe importu kontrolki ActiveX

    0x01 graphic

    Po zbudowaniu pakietu Delphi wyświetli komunikat potwierdzający instalację kontrolki TWebBrowser. Możesz ją teraz wypróbować:

    1. Najpierw wybierz polecenie File | Close All, aby zamknąć wszystkie okna, a następnie utwórz nową aplikację.

    1. Kliknij na zakładce ActiveX Palety Komponentów. Wybierz kontrolkę WebBrowser i umieść ją w formularzu, zmieniając jej rozmiar według własnego uznania (pozostaw miejsce dla przycisku).

    2. Dodaj do formularza komponent Button. Kliknij na nim dwukrotnie, aby utworzyć procedurę obsługującą zdarzenie OnClick; w jej ciele umieść następujący kod (użyj dowolnego adresu URL, jeśli chcesz):

    WebBrowser1.Navigate('http://www.turbopower.com',

    EmptyParam, EmptyParam, EmptyParam, EmptyParam););

    Jak łatwo można się domyślić, metoda Navigate powoduje załadowanie przez przeglądarkę dokumentu z sieci.

    1. Kliknij na przycisk Run, aby uruchomić program.

    Po uruchomieniu programu kliknij na przycisk znajdujący się w formularzu. Kontrolka WebBrowser załaduje, a następnie wyświetli stronę WWW.

    Po zainstalowaniu kontrolki, Delphi utworzył moduł o nazwie SHDocVw_TLB.pas. Można w nim znaleźć metody i właściwości dostępne dla komponentu TWebBrowser.

    0x01 graphic

    Dokumentacja kontrolki WebBrowser jest dostępna na stronie internetowej firmy Microsoft. Szukaj tekstu Reusing the WebBrowser Control.

    Kontrolki TWebBrowser nie wolno samodzielnie rozpowszechniać bez uzyskania licencji od firmy Microsoft. Jeżeli jednak wiesz, że użytkownicy posiadają w swoich systemach zainstalowany program Internet Explorer, Twoja aplikacja będzie u nich pracować, ponieważ posiadają oni już zainstalowaną kontrolkę WebBrowser. Nadal musisz jednak zarejestrować tę kontrolkę w komputerze użytkownika, aby Twoja aplikacja mogła być uruchomiona. Więcej informacji na temat rejestrowania kontrolek ActiveX znajdziesz w dalszej części tego rozdziału, w sekcji „Dystrybucja aplikacji internetowych”.

    Wysyłanie poczty

    Istnieje wiele powodów do wysyłania poczty z aplikacji. Być może chcesz, aby użytkownicy mogli wysyłać do Ciebie pocztę w przypadku napotkania jakiegokolwiek problemu w aplikacji. W takiej sytuacji aplikacja mogłaby generować formularz zawierający komponent Memo i przycisk Wyślij. Po wpisaniu tekstu wiadomości w pole Memo i kliknięciu na przycisk Wyślij komunikat byłby przesyłany pod wskazany adres. Mógłbyś nawet zadbać o dołączenie do wiadomości pliku dziennika aplikacji w celu zdiagnozowania problemów, z którymi boryka się użytkownik.

    Do wysyłania wiadomości pocztowych poprzez serwer SMTP służy kontrolka TNMSMTP. SMTP jest trochę dziwnym protokołem, ponieważ nie wymaga rzeczywistego logowania się do serwera (przynajmniej w większości serwerów SMTP). Można zwyczajnie połączyć się z dowolnym serwerem pocztowym, wysłać wiadomość i rozłączyć się. Właściwość Host służy do określenia nazwy maszyny, na której znajduje się serwer pocztowy, z którym chcemy się połączyć. Zazwyczaj jako nazwę wystarczy wpisać słowo mail. Wyspecyfikowanie nazwy mail jest poleceniem dla kontrolki TNMSMTP nakazującym jej połączenie się z lokalnym serwerem pocztowym niezależnie od tego, czy jest to serwer dostawcy Internetu, czy też serwer pocztowy Twojej firmy.

    Można jawnie określić nazwę serwera pocztowego (np. mail.mojafirma.com), ale zazwyczaj nie jest to konieczne. Jeżeli wpiszesz nieprawidłową nazwę serwera, wygenerowany zostanie wyjątek ESockError. Właściwość Port służy do określenia portu, z którym należy się połączyć. Domyślnym portem SMTP jest port 25. WłaściwośćPort jest domyślnie ustawiona na wartość 25, więc nie trzeba jej zmieniać.

    Informacja stanowiąca wiadomość pocztową jest przechowywana we właściwości PostMessage. Właściwość ta jest klasą, która zawiera właściwości, takie jak ToAddress, FromAddress, Subject, Body i inne. Odpowiednie pola właściwości PostMessage trzeba wypełnić przed wysłaniem wiadomości.

    Zanim będzie można wysłać wiadomość pocztową, trzeba połączyć się z serwerem SMTP. Do tego celu służy metoda Connect:

    SMTP.Host := 'mail';

    SMTP.Connect;

    Po połączeniu się z serwerem można przystąpić do wysyłania wiadomości. Dobrym miejscem do przeprowadzenia tej operacji jest procedura obsługująca zdarzenie OnConnect, ponieważ jego wystąpienie jest potwierdzeniem uzyskania połączenia z serwerem SMTP. Przykład:

    procedure TMainForm.SMTPConnect(Sender : TObject);

    begin

    with SMTP.PostMessage do begin

    FromAddress := 'jankes@happynet.com';

    ToAddress.Add('gandolf@happynet.com');

    Subjet:= 'Test';

    Body.Add('To jest test');

    end;

    SMTP.SendMail;

    end;

    W procedurze tej ustawiane są parametry FromAddres (adres nadawcy), ToAddress (adres odbiorcy), Subject (temat wiadomości) i Body (ciało wiadomości) należące do właściwości PostMessage, po czym następuje wysłanie wiadomości przy użyciu metody SendMail. Jak widać jest to bardzo proste. Typem właściwości ToAddress i Body jest TStringList. W przypadku właściwości Body przyczyna jest oczywista - wiadomość może składać się kilku linii tekstu. Nadanie właściwości ToAddress typu TStringList pozwala na wyspecyfikowanie większej ilości odbiorców wiadomości niż tylko jeden.

    0x01 graphic

    Wartości pól ToAddress i FromAddress są niezbędne. Pozostałe pola (włącznie z ciałem wiadomości) są opcjonalne.

    Po upewnieniu się, że wiadomość została pomyślnie wysłana, można odłączyć się od serwera SMTP. O pomyślnym wysłaniu wiadomości informuje zdarzenie OnSuccess, stąd procedura obsługująca to zdarzenie może wyglądać następująco:

    procedure TForm1.SMTPSuccess(Sender: TObject);

    begin

    SMTP.Disconnect;

    end;

    Oczywiście w trakcie pojedynczego połączenia można wysłać kilka wiadomości. Nie trzeba wtedy rozłączać się i ponownie łączyć przed każdym wysłaniem komunikatu. Wystarczy połączyć się raz, wysłać wszystkie wiadomości pocztowe i na końcu rozłączyć się z serwerem.

    Wysłana wiadomość może dotrzeć bezproblemowo na miejsce lub zaginąć gdzieś po drodze. Również w przypadku niepowodzenia operacji wysyłki trzeba być przygotowanym na odłączenie się od serwera. Dostarczenie wiadomości zakończone niepowodzeniem jest sygnalizowane zdarzeniem OnFailure, można więc wykorzystać je do odłączenia się od serwera podobnie jak zdarzenie OnSuccess. Na dyskietce dołączonej do niniejszej książki znajduje się prosty program ilustrujący sposób wysyłania poczty przy użyciu kontrolki TNMSMTP.

    Dystrybucja aplikacji internetowych

    Jeżeli zbudowana przez Ciebie aplikacja internetowa korzysta wyłącznie z komponentów VCL, jej dystrybucja nie wymaga podejmowania żadnych szczególnych kroków chyba, że korzystasz z pakietów wykonywalnych. Jeżeli sytuacja taka ma miejsce, do aplikacji musisz dołączyć pakiet INET40.BPL, ponadto jeżeli korzystasz z komponentów generujących strony (page producers) razem z aplikacją trzeba będzie również dystrybuować plik INETDB40.BPL.

    Więcej pracy wymaga aplikacja korzystająca z kontrolek ActiveX. Kontrolki ActiveX muszą być rejestrowane na komputerach, na których pracować będzie korzystająca z nich aplikacja. Najprostszy sposób rejestrowania kontrolek ActiveX opiera się na wykorzystaniu dobrego programu instalacyjnego. Razem z Delphi w wersji Professional i Client/Server dostarczany jest program instalacyjny InstallShield, który warto wypróbować. Innym dobrym programem instalacyjnym jest Wise Install firmy Great Lakes Business Solutions. Dobre programy instalacyjne podczas instalowania aplikacji rejestrują również kontrolki ActiveX, z których aplikacja ta korzysta.

    Jeżeli nie skorzystasz z komercyjnego programu instalacyjnego, będziesz musiał ręcznie zainstalować wszelkie kontrolki ActiveX z jakich korzysta stworzona przez Ciebie aplikacja. Do rejestrowania i wyrejestrowania kontrolek ActiveX i OCX służy program TREGSVR.EXE (dostępny w katalogu Delphi 4\Bin). Przykładowo, aby zainstalować stworzoną niedawno aplikację EZ Web Browser, trzeba wysłać razem z nią następujące pliki:

    HTML.OCX

    NMOCOD.DLL

    NMSCKN.DLL

    NWM3VWN.DLL

    NMORENU.DLL

    WEBBROWS.EXE

    Po zainstalowaniu tych plików, korzystając z narzędzia TREGSVR.EXE, trzeba zarejestrować pliki HTML.OCX i NMOCOD.DLL. W tym celu w wierszu pleceń należy wpisać:

    TREGSVR HTML.OCX

    Podobną operację trzeba wykonać dla pliku NMOCOD.DLL. W ten sposób zarejestrowana zostanie kontrolka HTML, więc korzystająca z niej aplikacja powinna uruchomić się bez problemu.

    0x01 graphic

    Jeżeli kontrolka nie zostanie zarejestrowana poprawnie, w chwili kiedy użytkownik spróbuje uruchomić program otrzyma komunikat Class not registered (Klasa nie zarejestrowana). Aplikacja zostanie zakończona - pozostawiając użytkownika w rozmyślaniach nad tym, co poszło nie tak.

    Do wyrejestrowania kontrolki należy użyć przełącznika /u:

    TREGSVR /u HTML.OCX

    Dobry program instalacyjny posiada zazwyczaj opcję odinstalowania, która wykona ten proces automatycznie.

    Jak widać, zastosowanie w aplikacji kontrolek ActiveX wymaga odrobiny pracy podczas jego instalacji. Nieświadomość konieczności instalowania kontrolek ActiveX może być źródłem niezrozumiałych sytuacji dla Ciebie i Twoich użytkowników. Przy okazji - pliki niezbędne do dystrybucji aplikacji korzystającej z kontrolki HTML zajmują w sumie około 900 KB, stąd wniosek, iż korzystanie z kontrolek ActiveX odbywa się kosztem zajętości pamięci. Z tego powodu osobiście wszędzie tam, gdzie jest to możliwe, wolę korzystać z komponentów VCL.

    Podsumowanie

    W tym rozdziale zapoznałeś się z internetowymi komponentami oferowanymi przez Delphi. Korzystając z komponentu THTML zbudowałeś prostą aplikację przeglądarki stron WWW i nauczyłeś się wysyłać pocztę przy użyciu kontrolki TNMSMTP. Tworzenie aplikacji przeznaczonych do współpracy z Internetem jest obecnie znaczącą gałęzią rynku komputerowego, dlatego zdobycie umiejętności z tego zakresu na pewno się przyda.

    Warsztat

    Warsztat składa się z pytań kontrolnych oraz ćwiczeń utrwalających i pogłębiających zdobytą wiedzę. Odpowiedzi do pytań możesz znaleźć w dodatku A.

    Pytania i odpowiedzi

    TClientSocket i TServerSocket.

    Tak. Do tworzenia dokumentów HTML na podstawie tabel bazy danych służą komponenty TQueryTableProducer i TDataSetTableProducer. Więcej na temat sposobu ich wykorzystania można dowiedzieć się analizując przykładowe projekty znajdujące się w katalogu Delphi 4\Webserv.

    Ponieważ istnieją dwa oddzielne protokoły pocztowe: jeden do wysyłania poczty (SMTP) i jeden do odbierania poczty (POP3).

    Możesz być tym zdziwiony, ale wiele protokołów, z których korzysta Internet, zostało zdefiniowanych około dwudziestu lat temu lub nawet wcześniej, chociaż sam Internet jest o wiele młodszy. Protokoły stosowane w Internecie oryginalnie zostały zaprojektowane dla platformy UNIX.

    Quiz

    1. Jaka kontrolka służy do wyświetlania stron WWW?

    1. Jaka kontrolka służy do łączenia z grupami dyskusyjnymi?

    2. Jak nazywa się metoda służąca do wyświetlania dokumentu HTML przez kontrolkę THTML?

    3. Jakie zdarzenie jest generowane w chwili zakończenia ściągania dokumentu HTML?

    4. Jaka kontrolka służy wysyłania wiadomości pocztowych?

    5. Jaka kontrolka służy do odbierania wiadomości pocztowych?

    6. Jak nazywa się metoda służąca do wysyłania poczty przez kontrolkę TNMSMTP?

    7. Czy kontrolka ActiveX Internet Explorera może być rozpowszechniana bez żadnych ograniczeń?

    8. Jak nazywa się narzędzie służące do rejestrowania kontrolek ActiveX?

    9. Jak nazywa się firma dostarczająca komponenty internetowe wchodzące w skład Delphi?

    Ćwiczenia

    1. Napisz aplikację służącą do wysyłania poczty. Główny formularz aplikacji powinien zawierać pola przeznaczone dla adresu odbiorcy, nadawcy, tematu wiadomości i tekstu wiadomości.

    1. Do aplikacji EZ Web Browser dodaj dwa przyciski służące do poruszania się w przód i w tył i odpowiednio je oprogramuj.

    2. Ćwiczenie dodatkowe: Do aplikacji EZ Web Browser dodaj animację, dzięki której użytkownik będzie mógł stwierdzić, kiedy dokument jest wczytywany.


    Podsumowanie
    części III


    Był to niezwykle produktywny tydzień. Kontrolki COM i ActiveX, w przeciwieństwie do komponentów biblioteki VCL, mogą być używane przez szereg środowisk programistycznych. Delphi udostępnia najszybszy sposób tworzenia kontrolek ActiveX spośród wszelkich dostępnych obecnie środowisk programistycznych.

    Prawdopodobnie nie zdawałeś sobie sprawy z tego, że operacje na bazach danych mogą być tak łatwe. Jest to jednak rzecz względna. Nie posunąłbym się do stwierdzenia, że proces programowania baz danych jest procesem najprostszym z możliwych, ale dzięki Delphi jest on znacznie prostszy niż w przypadku innych środowisk programistycznych.

    W rozdziale dziewiętnastym zetknąłeś się z bibliotekami DLL. Niezależnie od tego, czy zdecydujesz się od razu z nich skorzystać, wiesz już, jakie zalety niesie ze sobą ich użycie i możesz podjąć uzasadnioną decyzję dotyczącą ich zastosowania we własnych aplikacjach. Jeżeli przewidujesz wywoływanie własnych formularzy Delphi z programów nie napisanych w tym środowisku, będziesz musiał skorzystać z bibliotek DLL. Ich użycie nie jest trudne, niemniej jednak nawet małe doświadczenie w tym zakresie okaże się przydatne.

    Z rozdziału dwudziestego dowiedziałeś się, w jaki sposób należy tworzyć własne komponenty. Albo pokochałeś to od razu, albo utknąłeś drapiąc się po głowie z braku zrozumienia. Nawet jeżeli miała miejsce ta druga sytuacja, nie warto się tym przejmować. Być może w ogóle nie będziesz musiał tworzyć własnych komponentów. Istnieje całe mnóstwo źródeł oferujących komponenty komercyjnej jakości. (Zajrzyj do dodatku B, „Internetowe zasoby Delphi”.) Oczywiście możesz zawsze powrócić do rozdziału dwudziestego po zgromadzeniu nowych doświadczeń w Delphi i spróbować jeszcze raz zmierzyć się z tym zagadnieniem. Jeżeli dobrze spędziłeś czas ucząc się tworzenia komponentów, trudnym do „przełknięcia” okazał się zapewne ostatni rozdział. W ciągu całego rozdziału dwudziestego miałem okazję przedstawić zaledwie drobną cząstkę zagadnienia pisania komponentów. Wiele rzeczy zostało jeszcze do nauczenia się, a niektóre z nich będzie można poznać jedynie przez doświadczenie. Cały rozdział jest jedynie wstępem, który umożliwi dalszą samodzielną pracę.

    W końcu, miałeś okazję przyjrzeć się Delphi i Builderowi C++, a także przekonać się, w jaki sposób są one w stanie współpracować ze sobą. Delphi i Builder C++ są doskonałymi produktami. Jeżeli wiesz, jak użytkować jedno z tych środowisk, nauka drugiego będzie bardzo łatwa. Im więcej wiesz, tym bardziej cenionym programistą się stajesz.

    lub czytając rozdział 30. książki „Delphi 4 Vademecum Profesjonalisty”, wyd. HELION 1999 (przyp. red.)

    836 Część III

    836 C:\Dokumenty\Roboczy\Delphi 4 dla kazdego\22.doc

    C:\Dokumenty\Roboczy\Delphi 4 dla kazdego\22.doc 817

    Rozdzia³ 22. Aplikacje internetowe 833

    Rozdział 22. Aplikacje internetowe 815

    Brak rysunku



    Wyszukiwarka

    Podobne podstrony:
    16, ## Documents ##, Delphi 4 dla każdego
    20, ## Documents ##, Delphi 4 dla każdego
    07, ## Documents ##, Delphi 4 dla każdego
    13, ## Documents ##, Delphi 4 dla każdego
    12, ## Documents ##, Delphi 4 dla każdego
    19, ## Documents ##, Delphi 4 dla każdego
    skoro, ## Documents ##, Delphi 4 dla każdego
    Części, ## Documents ##, Delphi 4 dla każdego
    11, ## Documents ##, Delphi 4 dla każdego
    a, ## Documents ##, Delphi 4 dla każdego
    Delphi 4 dla każdego, 01
    Delphi 7 dla każdego
    B, Informatyka, Delphi 4 dla każdego
    Delphi 4 dla każdego, 03
    Delphi 4 dla każdego, 04

    więcej podobnych podstron