Przedmiot: Programowanie usług internetowych - Delphi Przygotował: K. Strzałkowski Rok V. Semestr IX. Wydział ZiMK Ćwiczenie 1 Generowanie plików HTML 1. Przygotowanie aplikacji generującej prostą stronę. Przygotuj program wyświetlający formatkę jak na rysunku (w fazie projektowania): Przycisk pierwszy powinien powodować umieszczenie zapisu strony w komponencie Memo. Przycisk drugi powinien zapisywać tekst strony w pliku *.HTML, a następnie wyświetlać ją w przeglądarce. Realizacja zadania: Umieść na formatce komponenty: Memo, Label, Button i SaveDialog. Zdefiniuj właściwości Caption komponentów Label i Button wg rysunku. W kodzie modułu Unit1 zdefiniuj dwie metody - składowe komponentu formatki TForm1: procedure TForm1.naglowek(Str: TStrings; Tytul: String); Str.Add('<HTML> '); Str.Add( <HEAD> ); Str.Add( <TITLE> + tytul + </TITLE> ); Str.Add( </HEAD> ); Str.Add( <BODY> ); Str.Add( <H1><CENTER> + tytul + </CENTER></H1> ); Procedura powyższa powoduje zapamiętanie w parametrze Str zapisu nagłówka strony. Parametr ten jest typu obiektowego TStrings, który opisuje kolekcję wierszy tekstu. Typ ten jest wyposażony w szereg właściwości i metod obsługujących operacje na wierszach m. in.: 1
Add dopisanie wiersza Clear kasowanie całej zawartości procedure TForm1.stopka(Str: TStrings); Str.Add( <HR> ); Str.Add( Strona wygenerowana przez napisany w Delphi program: + ExtractFileName(Application.ExeName)); Str.Add( </BODY> ); Str.Add( </HTML> ); Procedura powyższa dopisuje do parametru Str zapis końca (stopki) strony. Zdefiniuj metodę obsługi zdarzenia OnClick pierwszego przycisku. Proponowany zapis metody: procedure TForm1.Button1Click(Sender: TObject); var Str: String; Memo1.Clear; Naglowek(Memo1.Lines, Strona przykładowa ); DateTimeToString(Str, yyyy-mm-dd, Now); Memo1.Lines.Add( <HR> Data generacji strony: + Str); { 1 } Stopka(Memo1.Lines); Zdefiniuj metodę obsługi zdarzenia OnClick drugiego przycisku. Proponowany zapis metody: procedure TForm1.Button2Click(Sender: TObject); if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.FileName); ShellExecute(Handle, open, PChar(SaveDialog1.FileName), nil, nil, sw_shownormal); Metoda powoduje nawiązanie dialogu w celu ustalenia nazwy pliku w którym zapisana będzie strona, a następnie wywołanie akcji systemu operacyjnego o nazwie open powodującej wyświetlenie pliku przez domyślny program. W przypadku rozszerzenia pliku, *.HTML lub *.HTM będzie to przeglądarka internetowa. Zastosowanie procedury ShellExecute wymaga dołączenia w klauzuli uses modułu ShellAPI. Zapisz projekt w oddzielnym katalogu P1 i przetestuj jego działanie. Wygenerowaną stronę zapisuj w katalogu projektu pod nazwą STRONA1.HTML. Przed zapisem w pliku i wyświetleniem strony zmieniaj jej postać edytując odpowiednio tekst wyświetlany w komponencie Memo. 2
2. Wyświetlanie na stronie zawartości tabeli bazy danych. Skopiuj opracowany projekt do nowego katalogu P2. Dołącz na formatce dwa nowe komponenty z zakładki dbexpress i ustaw ich właściwości dla uzyskania połączenia z tabelą bazy HURT.GDB: SQLConnection: ConnectionName: Params: Connected: wybierz IBConnection (wybranie tego połączenia spowoduje że Delphi ustawi inne właściwości zgodnie ze standardem InterBase) uruchom edytor właściwości, a następnie w wyświetlonej tabeli zmień pozycję DataBase wpisując nazwę pliku bazy (wraz ze ścieżką dostępu) wybierz True i wypełń odpowiednio okienko logowania do bazy SQLDataSet: SQLConnection: CommandType: CommandText: Active: wybierz SQLConnection1 wybierz cttable wybierz Katalog wybierz True Zmodyfikuj metodę obsługi zdarzenia OnClick dla przycisku pierwszego dodając deklaracje: var i, k: integer; oraz zastępując komentarz { 1 } zapisem: Memo1.Lines.Add( <HR> Tabela + SQLDataSet1.CommandText); Str:= <TABLE BORDER><TR> ; for i:=0 to SQLDataSet1.FieldCount - 1 do Str:=Str + <TD><B> + SQLDataSet1.Fields[i].FieldName + </B></TD> ; Memo1.Lines.Add(Str + </TR> ); SQLDataSet1.First; for k := 1 to SQLDataSet1.RecordCount do Str:= <TR> ; for i := 0 to SQLDataSet1.FieldCount - 1 do Str:=Str+ <TD> + SQLDataSet1.Fields[i].DisplayText + </TD> ; Memo1.Lines.Add(Str+ </TR> ); SQLDataSet1.Next; Memo1.Lines.Add( </TABLE> ); Przetestuj działanie programu. Program powinien wyświetlać w przeglądarce zawartość tabeli Katalog. 3. Zastosowanie komponentu PageProducer Skopiuj opracowany wg punktu 1 projekt P1 do nowego katalogu P3. Usuń z kodu modułu Unit1 definicje metod naglowek i stopka oraz ich zapowiedzi w definicji typu TForm1. Dołącz na formatce dwa komponenty do połączenia z bazą HURT.GDB i ustaw 3
ich właściwości jak w punkcie 2 dla uzyskania połączenia z tabelą bazy. Dla komponentu SQLDataSet ustaw odmiennie właściwości: CommandType: wybierz ctquery CommandText: wpisz zapytanie: SELECT KOD, NAZWA, TERMIN, ILOSC, CENA FROM KATALOG, STANY WHERE KOD=KOD_TOW Dołącz do formatki komponent PageProducer z zakładki Internet. Ustaw właściwość komponentu: HTMLDoc: wpisz szablon strony: <HTML> <HEAD> <TITLE>Tabela STANY</TITLE> </HEAD> <BODY> <H1><CENTER>Pozycja tabeli STANY</CENTER></H1> <HR><#p1><#p2><#p3><#p4><#p5><#p6><#p7 marza=10><#p8><hr> Strona wygenerowana przez Delphi dnia <#teraz><br> </BODY> </HTML> Wykasuj dotychczasowy zapis metody obsługi zdarzenia OnClick dla przycisku pierwszego i wpisz: procedure TForm1.Button1Click(Sender: TObject); Memo1.Clear; Memo1.Text:=PageProducer1.Content; Dołącz algorytm obsługi znaczników rozmieszczonych w szablonie strony: - Wygeneruj szkielet metody obsługi zdarzenia OnHTMLTag dla komponentu PageProducer. - Wpisz kod metody: procedure TForm1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag; const TagString: String; TagParams: TStrings; var ReplaceText: String); var Str: String; marza: integer; if TagString= teraz then DateTimeToString(Str, yyyy-mm-dd, Now); ReplaceText:=Str end else if TagString= p1 then ReplaceText:=SQLDataSet1.Fields[0].FieldName + : + SQLDataSet1.Fields[0].AsString + '<BR>' else if TagString='p2' then ReplaceText:=SQLDataSet1.Fields[1].FieldName + ' : ' + SQLDataSet1.Fields[1].AsString + '<BR>' 4
else if TagString='p3' then ReplaceText:=SQLDataSet1.Fields[2].FieldName + ' : ' + SQLDataSet1.Fields[2].AsString + '<BR>' else if TagString='p4' then ReplaceText:=SQLDataSet1.Fields[3].FieldName + ' : ' + SQLDataSet1.Fields[3].AsString + '<BR>' else if TagString='p5' then ReplaceText:=SQLDataSet1.Fields[4].FieldName + ' : ' + SQLDataSet1.Fields[4].AsString + '<BR>' else if TagString='p6' then ReplaceText:='Wartosc : ' + FloatToStr(SQLDataSet1.Fields[3].Value * SQLDataSet1.Fields[4].Value) + '<BR>' else if TagString='p7' then Str:=TagParams.Values['marza']; marza:=strtointdef(str, 0); ReplaceText:='Cena (marza = ' + Str + '%) : ' + FloatToStr(SQLDataSet1.Fields[4].Value * (100+marza)/100) + '<BR>' end else if TagString='p8' then ReplaceText:='Termin spozycia uplywa za dni :' + IntToStr(DaysBetween(Now,SQLDataSet1.Fields[2].Value)) + '<BR>'; Uwaga: wykorzystanie funkcji DaysBetween wymaga dołączenia do klauzuli uses modułu DateUtils Przetestuj działanie programu. Program powinien po naciśnięciu przycisku pierwszego wyświetlać w komponencie Memo zapis strony wygenerowanej na podstawie szablonu i uzupełnionej odpowiednimi zapisami wstawionymi w miejsce znaczników. Po naciśnięciu przycisku drugiego program powinien wyświetlać w przeglądarce internetowej zawartość jednego rekordu tabeli STANY uzupełnioną dodatkowymi informacjami: wysokość ceny hurtowej (tzn. z doliczeniem marży 10 proc) lub ilość dni do upływu terminu przydatności do spożycia. Wyświetlany będzie pierwszy rekord tabeli w uporządkowaniu wg klucza głównego (czyli informacje o Piwie tyskim w butelkach 0,3 litra). Uzupełnij zapis metody obsługi przycisku pierwszego o instrukcje (wpisane bezpośrednio po ): szukaj:=inputbox('wyszukiwanie rekordu', 'Podaj nazwe towaru', ' '); SQLDataSet1.Locate('Nazwa', szukaj, [lopartialkey]); Uzupełnij deklarację zmiennej szukaj: var szukaj: String; Zmiany powyższe umożliwiają wyświetlanie informacji o wybranym towarze. W wyświetlanym funkcją InputBox okienku należy podawać nazwę towaru (wystarczą pierwsze litery). Przenieś zapis szablonu strony do pliku SZABLON.HTML (utworzonego w katalogu projektu) kasując jednocześnie jego zapis we właściwości HTMLDoc komponentu PageProducer. We właściwości HTMLFile tego komponentu wskaż plik szablonu. Sprawdź, że po tych zmianach aplikacja działa identycznie. Przy takiej konfiguracji dla 5
dokonania zmian w zapisie strony wystarczy odmiennie zredagować szablon zmiany kodu źródłowego aplikacji ani nawet powtórna kompilacja nie są wymagane. Zmień zapis szablonu strony w pliku SZABLON.HTML w taki sposób żeby dodatkowo wyświetlana była wysokość ceny detalicznej (z marżą 20 proc) wstaw w odpowiednim miejscu znacznik: <#p7 marza=20>. Taki zapis znacznika powoduje wykonanie obliczeń ceny detalicznej dla wartości parametru marża równej 20. Sprawdź działanie aplikacji. ZADANIA 1. Zmodyfikuj aplikację z katalogu P2 w taki sposób by po naciśnięciu dodatkowego przycisku generować stronę z zapisem całej tabeli STANY. 2. Zmodyfikuj aplikację z katalogu P3 w taki sposób by w informacjach wyświetlanych znalazła się wartość towaru liczona w cenach detalicznych. 3. Opracuj aplikację która wyświetla zawartość tabeli KATALOG z wykorzystaniem komponentu PageProducer. Do redagowania zawartości wiersza tabeli wykorzystaj komponent DataSetPageProducer. Wskazówka: Rozmieszczone w szablonie HTML tego komponentu znaczniki o postaci <#NazwaPola> - gdzie NazwaPola jest identyfikatorem pola dołączonej do komponentu tabeli - są interpretowane automatycznie bez żadnych dodatkowych zabiegów. Ich wystąpienia zastępowane są wartościami pól pobieranymi z bieżącego rekordu tabeli. 4. Opracuj podobną aplikację z wykorzystaniem komponentu DataSetTableProducer. Wskazówka: Przeznaczenie poszczególnych właściwości komponentu: Caption kod HTML opisujący tytuł wyświetlanej tabeli DataSet komponent reprezentujący wyświetlaną tabelę Header HTMLowy zapis strony przed wyświetlaną tabelą Footer HTMLowy zapis strony za wyświetlaną tabelą MaxRows liczba wyświetlanych wierszy (-1 =wszystkie) Właściwości obiektowe: RowAttributes definiuje wygląd wierszy np. kolor zielony przez ustawienie właściwości: bgcolor=lime TableAttributes definiuje wygląd całej tabeli np. kolor niebieski (tylko dla nagłówka i obramowania bo wiersze będą zielone) szerokość równą 70% oraz wyśrodkowanie tabeli poprzez: bgcolor=blue, Width=70, Align=haCenter, Columns obsługiwana przez specjalizowany edytor właściwość pozwalająca na precyzyjne zdefiniowanie poszczególnych kolumn. W czasie ustawiania parametrów edytor na bieżąco wyświetla podgląd tabeli co pozwala na szybką korektę ewentualnych błędów. 6