Materiały dydaktyczne Języki programowania Semestr III Wykłady 1
Temat 1 (4 godziny): Języki programowania. Delphi 2010 omówienie środowiska Zagadnienia tematyczne: A. Delphi 2010 interfejs systemu programowania obiektowego i zdarzeniowego; B. BDE; C. Inne języki programowania; D. Zasady tworzenia aplikacji. Zagadnienie: 1.A Delphi 2010 interfejs systemu programowania obiektowego i zdarzeniowego Delphi jest środowiskiem programowania opartym o język programowania Pascal, wyposażonym w edytor, kompilator, debugger i kilka innych przydatnych funkcji. Interfejs użytkownika Delphi 2010 składa się z wielu części (rys. 1). Pasek szybkiego dostępu Pasek menu Okno Structure Okno Project Manager Okno Tool Palette Okno Object Inspector Czysty formularz Rys. 1. Interfejs Delphi 2010 2
Interfejs Delphi 2010 składa się z następujących części: paska menu (Menu Bar); paska szybkiego dostępu (Menu SpeedBar); palety składników (Component Paletee); kontrolera obiektów (Object Inspector); czystego formularza (Blank Form); menagera projektu (Projekt Manager); okna edycji kodu (Code Editing Window); i innych (Menu Designer, Alignment Palette). Pasek Menu Pasek ten umieszczony jest tuż poniżej niebieskiego paska zawierającego nazwę programu Delphi 2010 i daje możliwość dostępu do większości funkcji programu (rys. 1). W tabeli 1 zebrano najważniejsze elementy menu głównego programu Delphi 2010 i opisano ich funkcje. Funkcje elementów Menu Delphi 2010 Tabela 1 Nazwa elementu File Edit Search View Project Run Component Tools Help Najważniejsze funkcje Pozwala uruchomić nowy projekt, otwierać, zachowywać i zamykać pliki; dodawać i usuwać pliki do/z bieżącego projektu. Pozwala wycinać, kopiować i wklejać kod w oknie kodów, albo elementy w formularzu. Pozwala wykonywać operacje znajdowania i zastępowania kodu. Pozwala oglądać różne części interfejsu Delphi. Pozwala dodawać lub usuwać z projektu pliki i składniki. Daje również dostęp do kompilatora Delphi. Zapewnia dostęp do różnych funkcji w celu uruchamiania kodu w środowisku projektowym. Zapewnia funkcje zarządzania elementami zawartymi w projekcie i zarządzanie paletą składników. Pozwala ustawiać opcje i sterować wyglądem oraz działaniem środowiska projektowego. Daje dostęp do systemu pomocy Delphi. Pasek szybkiego dostępu Pasek ten pozwala na szybki dostęp do wielu najczęściej używanych funkcji Delphi 2010, m.in. do zachowywania pliku, uruchamiania aplikacji, dodawania nowego formularza do aplikacji czy przełączenia do okna edycji kodu programu. Delphi 2010 daje możliwość dowolnej konfiguracji paska szybkiego dostępu poprzez dodawanie lub usuwanie funkcji korzystając z edytora paska szybkiego dostępu. Paleta składników Paleta składników umożliwia szybki dostęp do wszystkich składników możliwych do wykorzystania do opracowywania interfejsu dowolnego programu. Paleta składników tworzy karty palet pogrupowanych tematycznie, z których najważniejsze przedstawiono w tabeli 2. 3
Najważniejsze karty składników na palecie składników Delphi 2010 Tabela 2 Nazwa karty Standard Additional Win32 System Win 3.1 Dialogs Data Access Data Controls Internet Funkcja Zawiera najczęściej używane składniki. Zawiera inne często używane składniki. Zawiera składniki zaprojektowane tak, aby były zgodne dla 32-bitowego środowiska Windows. Zawiera składniki, które dają dostęp do funkcji systemu Windows. Zawiera składniki do aplikacji pracujących w środowisku Windows 3.1, które mają podobne możliwości jak składniki Windows 95. Zawiera dostęp do pliku, drukarki, czcionek i innych pól dialogu. Zawiera składniki dołączane do baz danych. Zawiera składniki pozwalające poruszać się po bazach danych i manipulować danymi. Zawiera składniki realizujące obsługę funkcji związanych z Internetem. Kontroler obiektów Kontroler obiektów (Object Inspector) jest oknem pozwalającym kontrolować wygląd i funkcjonowanie każdego składnika w projekcie. Kontroler obiektów zawiera dwie karty, jedną właściwości (Properties) i drugą zdarzeń (Events) (rys. 2). W tabeli 3 przedstawiono wybrane właściwości i zdarzenia pustego formularza. Wybrane właściwości i zdarzenia pustego formularza Tabela 3 Właściwość Align AutoScroll BorderIcons Canvas Caption Color Enabled Font FormStyle Height Hide PopupMenu Position Visible Width Zdarzenie OnClick Opis Określa sposób wyrównania kontrolek w obrębie jej obiektu nadrzędnego. Określa, czy na obrzeżach formularza automatycznie będą wyświetlane paski przewijania. Określa, które przyciski mają być wyświetlane na pasku tytułu. Pozwala uzyskać dostęp do powierzchni rysunkowej formularza. Określa nazwę formularza. Określa kolor formularza. Określa, czy formularz jest czynny. Określa czcionkę używaną do tekstu widniejącego na formularzu. Określa styl formularza. Określa wysokość formularza. Pozwala ukryć formularz. Określa, czy menu podręczne jest skojarzone z formularzem. Określa położenie i rozmiar formularza zaraz po wyświetleniu. Określa czy formularz jest widoczny. Określa szerokość formularza. Opis Obsługuje zdarzenie w momencie kliknięcia przyciskiem myszy. 4
OnClose OnCreate OnDblClik OnDestroy OnHide OnKeyDown OnKeyPress OnKeyUp OnMouseDown OnMouseMove OnMouseUp OnPaint OnResize OnShow Obsługuje zdarzenie po zamknięciu formularza. Obsługuje zdarzenie po utworzeniu formularza. Obsługuje zdarzenie w momencie dwukrotnego kliknięcia przyciskiem myszy. Obsługuje zdarzenie po usunięciu formularza. Obsługuje zdarzenie po ukryciu formularza. Obsługuje zdarzenie w momencie naciśnięcia i przytrzymania klawisza. Obsługuje zdarzenie w momencie naciśnięcia klawisza. Obsługuje zdarzenie w momencie zwolnienia klawisza. Obsługuje zdarzenie w momencie gdy przycisk myszy zostanie wciśnięty i przytrzymany. Obsługuje zdarzenie w momencie gdy wskaźnik myszy jest przemieszczany po formularzu. Obsługuje zdarzenie w momencie gdy wskaźnik myszy jest zwalniany. Obsługuje zdarzenie w momencie odświeżania obszaru rysunku formularza. Obsługuje zdarzenie w momencie zmiany rozmiaru formularza. Obsługuje zdarzenie w momencie gdy formularz znajduje się w ognisku. Rys. 2. Kontroler obiektów (karta właściwości i zdarzeń) Okno edycji kodu Okno edycji kodu wyświetlane jest poprzez naciśnięcie ikony znajdującej się w pasku szybkiego dostępu, bądź klawiszem F12 na klawiaturze. Okno edycji kodu zawiera segmenty składowe formularza projektu, wśród których znajdują się wszystkie obiekty, zmienne, procedury (rys. 3). 5
Rys. 3. Okno edycji kodu pliku Unit1 Każdy moduł rozpoczyna się od nagłówka Unit zawierającego nazwę modułu. Następnie następuje sekcja Interface. Jest to część opisowa zawierająca następujące cześci: Uses - zawiera informacje z jakich bibliotek lub innych modułów korzystamy; const - zawiera deklaracje stałych; type - tutaj znajdują się deklaracje typów (np. TForm1 = class(tform) ), umieszczamy tu też nagłówki procedur i funkcji przeznaczonych do udostępnienia (np. procedure Button1Click(Sender: TObject); ); Private i Public - sekcje te informują kompilator że deklaracje w nich zawarte mają być tylko do użytku lokalnego (private) lub globalnego (public); var - tutaj deklarujemy zmienne; implementation - w tej sekcji zgromadzone są procedury i funkcje naszego programu; end. - "end z kropką" zawsze oznacza koniec modułu lub programu. Zagadnienie: 1.B BDE. Borland Database Engine Borland Database Engine (BDE) - oprogramowanie firmy Borland dla środowiska Windows, które daje dostęp do baz danych znajdujących się na rozmaitych platformach systemowych. Uzywając borlandowski interfejs IDAPI stwarza warstwę pośredniczącą między programem klienckim, a takimi bazami, jak dbase, Paradox, Oracle, SQL Server, DB2, Informix, InterBase i bazy zgodne z ODBC. BDE jest dostępne samodzielnie, ale jest też wbudowane w języki programowania Borlanda. Technologia BDE powstawała przez wiele lat i z czasem przyjęte w niej rozwiązania okazały się mało wygodne i mało nowoczesne obecnie. BDE łączy w sobie dwie starsze technologie bazodanowe oraz wprowadzało trzecią nową. Dokładniej chodzi tutaj o wykorzystanie ODBC oraz IDAPI stworzonych na początku lat 90-tych. Nowym rozwiązaniem w BDE były bezpośrednie sterowniki dla kilku najpopularniejszych w tamtych czasach serwerów (sterowniki te zostały nazwane SQL Link). Zarówno 6
ODBC jak IDAPI pozwalały wykorzystać plikowe bazy danych, a mechanizmy dostarczane w BDE umożliwiały wykorzystywanie ich w podobny sposób jak serwery SQL. Zagadnienie: 1.C Inne języki programowania Język programowania to ciąg symboli tworzonych według określonych zasad tworzący kod którego podstawowym zadaniem jest wykonywanie obliczeń i algorytmów oraz kontrolowanie/obsługa zewnętrznych urządzeń takich jak drukarek, robotów. Na świecie obecnie istnieją tysiące języków programowania i każdego roku powstają nowe. Wśród najpopularniejszych znajdują się: Java - to obiektowy język programowania stworzony przez grupę roboczą pod kierunkiem Jamesa Goslinga z firmy Sun Microsystems. C - imperatywny, strukturalny język programowania stworzony na początku lat siedemdziesiątych XX w. przez Dennisa Ritchiego do programowania systemów operacyjnych i innych zadań niskiego poziomu. C++ - został zaprojektowany przez Bjarne Stroustrupa jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych i silną statyczną kontrolę typów. Zachowanie zgodności z językiem C na poziomie kodu źródłowego pozostaje jednym z podstawowych celów projektowych kolejnych standardów języka. PHP - obiektowy, skryptowy język programowania zaprojektowany do generowania stron internetowych w czasie rzeczywistym. Visual Basic - to język programowania wysokiego poziomu i narzędzie programowania firmy Microsoft. Pyton - interpretowany, interaktywny język programowania stworzony przez Guido van Rossuma w 1990. Python posiada w pełni dynamiczny system typów i automatyczne zarządzanie pamięcią, jest zatem podobny do takich języków, jak Tcl, Perl, Scheme czy Ruby. Perl - to interpretowany język programowania autorstwa Larry'ego Walla przeznaczony głównie do pracy z danymi tekstowymi, używany także do innych zastosowań. Wzorowany na takich językach jak C, skryptowe: sed, awk i sh oraz na wielu innych. Objective-C - to rozszerzenie języka C o możliwości obiektowe, wzorowane na Smalltalku. Objective-C przyjął drogę całkowicie odmienną od C++. Jest używany głównie w frameworku Cocoa w systemie Mac OS X oraz w iphone OS. Delphi - język programowania, którego można używać w środowiskach firmy Borland, Embarcadero, Microsoft (Delphi Prism), oraz w środowisku Lazarus. Narzędzia te są zintegrowanymi środowiskami programistycznymi typu RAD, działającymi zgodnie z zasadą dwustronnej edycji. Dawniej język Delphi był nazywany Object Pascalem. Standard języka Delphi obejmuje wiele bogatych funkcjonalnie klas, których nie ma w standardzie Object Pascala, a ponadto umożliwia programowanie wizualne, czyli Object-Oriented Design. Object Pascal jest rozszerzeniem języka Pascal został on rozwinięty przez firmę Apple Computer przy współpracy Larry'ego Teslera, głównego architekta, i Niklausa Wirtha, wynalazcy Pascala (rys. 4). 7
Rys. 4. Drzewo genealogiczne języków programowania z którego wywodzi się Delphi Odpowiednik Delphi stworzony przez firmę Borland dla Linuksa nosił nazwę Kylix. Jego produkcja została zaniechana, gdyż charakteryzował się niską jakością. Obecnie rozwijane jest na licencji GNU GPL zintegrowane środowisko programistyczne (IDE) o nazwie Lazarus wzorowane na Delphi. Lazarus jest środowiskiem wieloplatformowym, dostępnym dla różnych systemów operacyjnych. Zagadnienie: 1.D Zasady tworzenia aplikacji W celu stworzenia poprawnego programu komputerowego tzw. aplikacji należy zastanowić się nad zadaniami jakie będzie wykonywał dany program oraz jak będzie wyglądał jego interfejs, a dodatkowo napisać poprawny kod programu i dodatkowo wykonać dokumentację programu. Przeanalizowanie zadań programu pozwoli określić kto będzie użytkownikiem programu oraz metodę wprowadzania i zapisywania danych, co bezpośrednio wpływa na wygląd programu, a tym samym na korzystanie z zaawansowanych technik programowania t.j. stosowania skrótów klawiszowych, pasków szybkiego dostępu, szybkiego menu i inne. Literatura 1. Todd Miller, David Powell. Delphi 3 Księga Eksperta Tom 1 i 2, Helion, 1998. 2. Marco Cantu, Delphi 6, Praktyka programowania Tom 1 i 2, Mikon, 2002. 3. Paul Kimmel, Delphi 6 dla profesjonalistów, RM, 2001. 4. P. Thurrott, G. Brent, R. Bagdazian, S. Tendon, Delphi 3, Arkana, 1998. 8
Temat 2 (3 godziny): Zmienne i pętle Zagadnienia tematyczne: A. Rodzaje zmiennych, podział zmiennych; B. Pętle, pętle zagnieżdżone; C. Metody wykrywania błędów. Zagadnienie: 2.A Rodzaje zmiennych, podział zmiennych Zmienną określamy daną, która może przyjmować i przechowywać informację różnego typu przypisanego lub określonego dla zmiennej, i dlatego ważnym zadaniem jest prawidłowe przypisanie dla zmiennej jego typu. Używane w Delphi zmienne przedstawiono w tabeli 4. Typy zmiennych uzywane w Delphi Tabela 4 Typ zmiennej Rozmiar Zakres w bajtach ShortInt 1 Liczby całkowite [-128, 127] Byte 1 Liczby całkowite [0, 255]. Char 1 Znaki pojedyncze + liczby z zakresu [0, 255]. WideChar 2 Znaki pojedyncze + liczby [0, 65535]. SmallInt 2 Liczby całkowite od [-32768, 32767]. Word 2 Liczby całkowite [0, 65535]. LongInt 4 Liczby całkowite [-2 147 483 648, 2 147 483 647]. Int64 8 Liczby całkowite [-9 223 372 036 854 775 808, 9 223 372 036 854 775 807]. Integer 4 Liczby całkowite [-2 147 483 648, 2 147 483 647]. Cardinal 4 Liczby całkowite [0, 4 294 967 295]. LongWord 4 Liczby całkowite [0, 4 294 967 295]. Single 4 Liczby rzeczywiste [1,5x10-45, 3,4x10 38 ]. Double 8 Liczby rzeczywiste [5,0x10-324, 1,7x10 308 ]. Real 8 Liczby rzeczywiste [5,0x10-324, 1,7x10 308 ]. Real148 6 Liczby rzeczywiste [2,9x10-39, 1,7x10 38 ]. Extended 10 Liczby rzeczywiste [3,4x10-4932, 1,1x10 4932 ]. Comp 8 Liczby rzeczywiste [-9 223 372 036 854 775 808, 9 233 372 036 854 775 807]. Currency 8 Liczby rzeczywiste [-9 223 372 036 854 775 808, 9 233 372 036 854 775 807]. Boolean 1 True albo False String do 2 GB Ciąg znaków ShortString - Ciąg znaków - maksimum 255 Variant 16 Zmienny 9
Zmienne w zależności od dostępności w programie dzielimy na: lokalne zmienne ograniczone tylko do pojedynczej procedury, używane wewnątrz tej procedury; zmienne w zakresie modułu dostępne dla wszystkich procedur zawartych wewnątrz tego modułu; globalne - dostępne dla całego programu, a także funkcji i procedur umieszczonych w aplikacji, pamięć dla zmiennych globalnych przydzielana jest w momencie uruchamiania aplikacji. Zagadnienie: 2.B Pętle, pętle zagnieżdżone Działanie każdego programu opiera się na możliwości podejmowania różnych decyzji na podstawie aktualnych w danym momencie parametrów. Kryteria te mogą zależeć od danych wprowadzonych przez użytkownika lub wewnętrznego stanu aplikacji. Sterowanie programem odbywa się dzięki instrukcjom warunkowym. W przypadku gdy, chcemy wielokrotnie wykonać sekwencję pewnych instrukcji stosuje się tzw. pętle. Delphi pozwala stosować trzy różne struktury pętli: For (dla); Repeat (powtórz); While (dopóki). Pętla For Pętli For używa się w programie wówczas, kiedy blok programu musi być powtórzony określoną ilość razy. Pętla For ma postać (rys. 5): zmienna := 1 zmienna := zmienna+1 instrukcja 1 zmienna <= 10 TAK NIE Rys. 5. Schemat blokowy pętli FOR Pętla For wykonywana jest w następujący sposób: najpierw zmiennej przypisywana jest wartość pierwszego (w tym wypadku dolnego) zakresu, następnie wartość zmiennej porównywana jest z wartością drugiego (górnego) zakresu i jeśli jest ona mniejsza lub równa, wykonywana jest instrukcja 10
stojąca po słowie kluczowym do. Po wykonaniu instrukcji, zmienna indeksująca zwiększana jest o 1 i ponownie porównywana z górnym zakresem. Zapis petli FOR: FOR i:=1 to 10 do {10 jest tu wartością końcową} Begin {instrukcja} End; W przypadku wykorzystania słowa kluczowego downto odwracany jest kierunek wykonania pętli zmienna indeksująca musi być większa lub równa niż drugi (w tym wypadku dolny) zakres, a w każdym kroku jest ona zmniejszana o 1. Pętla Repeat Pętla tworzona z wykorzystaniem instrukcji REPEAT UNTIL wykonywana jest co najmniej raz i kończy się wykonywać, jeśli jest spełniony występujący w niej warunek logiczny. Pętla tego rodzaju składa się ze słowa kluczowego repeat, po którym występuje sekwencja instrukcji zakończonych słowem kluczowym until i warunkiem logicznym. Ogólna postać pętli repeat przedstawiona jest poniżej, a schemat blokowy na rysunku 6: Repeat Begin {instrukcja1}; End; Until /warunek logiczny/ ; zmienna := 1 zmienna := zmienna+1 zmienna >= 10 NIE TAK Rys. 5. Schemat blokowy pętli REPEAT 11
Pętla While Pętla tworzona z wykorzystaniem instrukcji while jest najprostszym typem pętli. Pozwala ona na wykonywanie pewnej instrukcji tak długo, jak długo spełniony jest określony warunek logiczny. Pętla tego rodzaju składa się ze słowa kluczowego while, po którym występuje warunek logiczny, za nim pojawia się słowo kluczowe do oraz instrukcja, która ma być wykonywana. Ogólna postać pętli while przedstawiona jest w poniższym przykładzie (rys. 7): while /warunek logiczny/ do {instrukcja1}; zmienna := 1 zmienna := zmienna+1 zmienna <= 10 TAK NIE Rys. 7. Schemat blokowy pętli WHILE Pętle zagnieżdżone Wewnątrz każdej pętli można umieścić dowolne instrukcje, również kolejną pętlę. Mogą być więc one zagnieżdżane. Najczęściej zagnieżdżane są pętle for. W podobny sposób jak pętle for można zagnieżdżać pętle while, istnieje również możliwość mieszania typów zagnieżdżonych pętli, tzn. w pętli while może być zagnieżdżona pętla for i odwrotnie, w pętli for może być zagnieżdżona pętla while. Przykład zagnieżdżonej pętli przedstawia rysunek 8. 12
zmienna A zmienna B TAK A = B NIE TAK A > B NIE A = A B B = B A Rys. 8. Przykład pętli zagnieżdżonej Zagadnienie: 2.C Metody wykrywania błędów Najczęściej występującymi podczas programowania błędy to: błędy kompilacji (complier errors), które powodują, że program w ogóle nie będzie wykonywany; błędy wykonania (runtime errors), które spowodują zatrzymanie programu w środku jego wykonywania, albo jego nieprawidłowe wykonanie. Pojawienie się podczas kompilacji błędów najczęściej spowodowane jest nieprawidłową pisownią nazwy zmiennej lub obiektu, lub braku zdeklarowania zmiennej przed jej użyciem. Programując w Delphi w przypadku pojawienia się jakiegokolwiek błędu podczas kompilacji programu nastąpi samoczynne przerwanie programu i powiadomienie o występującym błędzie, wraz z podaną jego przyczyną. Błąd taki można natychmiast poprawić ponieważ jego wskazanie następuje w oknie Structure (rys. 9). Rys. 9. Komunikaty o błędach w oknie Structure 13
Najczęściej występujące błędy zestawiono w tabeli 5. Najczęstsze błędy kompilacji Tabela 5 Komunikat o błędzie Undeclared identifier Incompatible types \:=\ expected but \=\ found Unterminated string EDivByZero EOverflow ERangeError Możliwa przyczyna Nieprawidłowo wpisana nazwa zmiennej, obiektu lub procedury. Nie zdeklarowana zmienna. Brak nazwy modułu, zawierającego procedurę w klauzuli uses. Przypisanie lub porównanie zmiennych dwóch różnych typów. Wykonywanie operacji niedozwolonych dla danego typu zmiennych. Nieprawidłowo wpisany symbol = w instrukcji przypisanie. Poprawny operator przypisania to /:=/. Pominięcie jednego ze znaków apostrofa, który potrzebny jest przy strumieniu tekstu. Program próbował wykonać dzielenie przez zero. Podczas operacji zmiennopozycyjnej wystąpiło przepełnienie, oznacza to że wyliczona liczba nie mieści się w zakresie liczb, jakie kod potrafi obsłużyć. Liczba całkowita jest spoza dopuszczalnego zakresu wartości. Bardzo pomocnym narzędziem Delphi w wyszukiwaniu błędów jest Integrated Debugger. Pozwala on na wyszukiwaniu błędów w określonym obszarze kodu programu, do określonego punktu w programie, a dodatkowo śledzić i oceniać wartości zmiennych i wyrażeń oraz poprawnego wykonywania instrukcji podczas działania aplikacji. Literatura 1. Todd Miller, David Powell. Delphi 3 Księga Eksperta Tom 1 i 2, Helion, 1998. 2. Marco Cantu, Delphi 6, Praktyka programowania Tom 1 i 2, Mikon, 2002. 3. Paul Kimmel, Delphi 6 dla profesjonalistów, RM, 2001. 4. Andrzej Marciniak, Turbo Pascal 7.0 Część I, Wydawnictwo Nakom, 1996. 14
Temat 3 (3 godziny): Tworzenie aplikacji w Delphi Zagadnienia tematyczne: A. Zasady tworzenia interfejsu, programu; B. Komponenty, tworzenie komponentów, wykorzystanie komponentów. Zagadnienie: 3.A Zasady tworzenia interfejsu, programu Do stworzenia dowolnej aplikacji w Delphi zalecane jest stosowanie pięciu następujących etapów: planowanie programu czyli zdecydować w jakim celu dana aplikacja powstaje i kim będą jej użytkownicy, w jaki sposób do programu będą trafiać informacje i jaką postać będą miały dane wyjściowe z programu; projektowanie interfejsu wiedza o tym, kim będą użytkownicy programu pomaga określić wygląd interfejsu, oraz sposób wprowadzania i wyprowadzania danych. Projektowanie interfejsu wiąże się również z wykorzystaniem komponentów, które bezpośrednio wpływają na wygląd programu oraz umożliwiają użytkownikowi wprowadzenia teksu, dokonywanie wyborów, oglądanie i redagowanie grafiki czy inicjowanie czynności programu; definiowanie właściwości i zdarzeń składników programu umieszczone komponenty na formularzu wymagają określenia dla nich właściwości i zdarzeń. Właściwości każdego komponentu wykonuje się w kontrolerze obiektów (Object Inspector), zaś obsługa zdarzeń każdego komponentu wymaga uzupełnienie kodu programu w oknie edycji kodu. Poprawne działanie kodu programu wymaga dodatkowo zdefiniowanie zmiennych, które najlepiej wykonać na tym etapie tworzenia każdej aplikacji. testowanie programu w momencie gdy utworzyliśmy wszystkie elementy programu i przypisaliśmy wszystkim komponentów ich właściwości i obsługujące ich zdarzenia, możemy przetestować nasz program wybierając z paska szybkiego dostępu Run, lub naciskając klawisz funkcyjny F9. Wybranie tego polecenia spowoduje kompilację naszego programu oraz sprawdzenie poprawności jego składni, czyli wyszukanie błędów w kodzie. Błędy te mogą być najczęściej błędami składni poleceń lub błędami niezdeklarowanych zmiennych. W przypadku znalezienia błędu Delphi zatrzyma proces kompilacji i wskaże je w oknie Structure (rys. 9). Proces testowanie programu należy przeprowadzać tak długo, aż zostaną poprawione wszystkie błędy, a nasza aplikacja będzie działać poprawnie zgodnie z naszymi oczekiwaniami; tworzenie pliku wykonawczego w momencie kod programu nie zawiera błędów, a aplikacja działa poprawnie możemy wykonać plik wykonawczy (Executable File). Tworzenie takiego pliku odbywa się poprzez wybranie z paska menu Project a następnie Compile, lub naciśnięcie kombinacji klawiszy Ctrl+F9, co spowoduje utworzenie przez kompilator pliku wykonawczego z rozszerzeniem *.exe. Zagadnienie: 3.B Komponenty, tworzenie komponentów, wykorzystanie komponentów Komponenty, są to elementy Delphi, z których budowane są aplikacje dla Windows. Komponenty możemy podzielić na widoczne (np. przycisk klasy TButton, etykiety klasy Tlabel) lub niewidoczne 15
(TOpenDialog, TTimer). Komponenty widoczne to komponenty interfejsu widoczne na formularzu podczas fazy projektowania jak również w fazie wykonywania programu. Komponenty niewidoczne to elementy systemowe, które są widoczne tylko w fazie projektowania aplikacji, umożliwiają one dostęp do zdarzeń systemowych bądź dialogowych systemu Windows. Przeniesienie komponentu z palety na formularz następuje po kliknięciu składnika palety lewym przyciskiem myszy, a następnie kliknięciu w odpowiednim miejscu na formularzu lub dwukrotnym kliknięciu komponentu na palecie. Każdy umieszczony na formularzu komponent jest dopisywany do definicji klasy TForm1 pod nazwą standardową, która jest widoczna obok właściwości Name w okienku Inspektora obiektów. Nazwę tę można zmienić na inną i powinno się to zrobić zaraz po wstawieniu komponentu. Standardowe właściwości i zdarzenia komponentów zostały zamieszczone w tabeli 3. Delphi daje możliwość tworzenia nowych komponentów i instalacji istniejących już komponentów. Do stworzenia nowego komponentu jak również instalacji nowych komponentów służy polecenie New Component. Tworzeniem nowego komponentu rozpoczynamy poprzez wybranie polecenia New Component z menu Component. Na ekranie zobaczymy wówczas okienko (rys. 10A), z listy rozwijalnej należy wybrać komponent, który będzie stanowił klasę bazową dla naszego nowego obiektu, dla którego następnie możemy wpisać dowolną nazwę (Class Name), określić w jakiej palecie zostanie zainstalowany (Palette Page) oraz wskazać gdzie zostaną zapisane nowe pliki związane z komponentem (Unit name) (rys. 10B). Rys. 10. Zasady tworzenia nowego komponentu Po naciśnięciu przycisku Next pojawi się nam końcowe okno które pozwoli zakończyć proces tworzenia się komponentu bądź instalacji utworzonych już wcześniej komponentów. Literatura 1. Todd Miller, David Powell. Delphi 3 Księga Eksperta Tom 1 i 2, Helion, 1998. 2. Marco Cantu, Delphi 6, Praktyka programowania Tom 1 i 2, Mikon, 2002. 3. Paul Kimmel, Delphi 6 dla profesjonalistów, RM, 2001. 4. P. Thurrott, G. Brent, R. Bagdazian, S. Tendon, Delphi 3, Arkana, 1998. 16
Temat 4 (3 godziny): Programowanie grafiki i multimediów Zagadnienia tematyczne: A. Tworzenie aplikacji multimedialnych, wykorzystanie płótna, rysowanie wykresów, schematów, obsługa plików graficznych; B. Operacje na plikach. Zagadnienie: 4.A Tworzenie aplikacji multimedialnych, wykorzystanie płótna, rysowanie wykresów, schematów, obsługa plików graficznych Delphi daje dwa sposoby obsługi grafiki: składniki graficzne (graphics components): wykorzystywane w aplikacji w czasie projektowania, ale można je zmieniać przez kod programu, tak jak wszystkie inne składniki; metody graficzne (graphics methods): czyli, wiersze kodu, które działają tylko w czasie działania programu. Stosując metody graficzne używa się graficznego systemu współrzędnych (graphics coordinate system), który jest parą liczb. Pierwsza liczba z tej pary określa odległość punktu od lewej krawędzi składnika, w którym punkt jest umieszczony, zaś druga liczba odległość między punktem, a górną krawędzią składnika. Delphi obsługuje dwa rodzaje typów grafiki: obrazki (pictures): obrazy, które przechowywane są w postaci plików na dysku. Wyświetlenie dowolnego obrazka (o rozszerzeniu *.gif, *.png, *.jpg, *.jpeg, *.bmp, *.tif, *.tiff, *.wmf, *.ico, *.emf) możliwe jest poprzez zastosowanie komponentu Image i skorzystanie z właściwości Picture z okna Object Inspector. W przypadku gdy załadowany obraz nie mieści się w ramach kontrolki TImage, to zostaje obcięty na jej granicach lub dopasowany automatycznie do jej rozmiarów, może być również powiększany lub zmniejszany w stosunku do oryginalnych rozmiarów. rysunki (drawings): grafika tworzona rzeczywiście przez stworzony program za pomocą metod obiektu Canvas (płótno). Wybrane metody obiektu TCanvas przedstawiono w tabeli 6. Wybrane metody obiektu TCanvas Tabela 6 Metoda Kolor:=Canvas.pixels[x, y] Canvas.pixels[x, y]:=clred MoveTo[x, y] LineTo[x, y] Rectangle[x 1, y 1, x 2, y 2 ] Ellipse[x 1, y 1, x 2, y 2 ] Polyline([Point(x 1, y 1 ), Znaczenie Za pomocą funkcji Pixels można odczytać kolor piksela w miejscu o współrzędnych (x, y). Ta sama funkcja wywołana w ten sposób powoduje wyświetlenie na formularzu czerwonego punktu w współrzędnych (x, y). Przenosi kursor graficzny do punktu o współrzędnych (x, y). Rysuje linię od bieżącej pozycji kursora graficznego do punktu o współrzędnych (x, y). Procedura rysuje prostokąt. Procedura rysuje elipsę parametrami są współrzędne dwóch przeciwległych wierzchołków prostokąta, w który elipsa jest wpisana. Procedura rysuje linię łamaną lub wielokąt. 17
Point(x 2, y 2 ), Point(x 3, y 3 )]) Polygon([Point(x 1, y 1 ), Point(x 2, y 2 ), Point(x 3, y 3 )]) Refresh Arc(x 1, y 1,x 2, y 2,x 3, y 3, x 4, y 4 ) Pie(x 1, y 1,x 2, y 2,x 3, y 3, x 4, y 4 ) RoundRect(x 1,y 1,x 2,y 2,x 3,y 3 ) TextOut(x, y) Procedura umożliwia narysowanie wielokąta wypełnionego bieżącym kolorem i stylem pędzla. Procedura odświeżą formularz kasuje wszystkie obiekty rysowane za pomocą metod obiektu Canvas i nieumieszczanie w procedurze obsługi zdarzenia OnPaint. Procedura rysuje krzywą eliptyczną w prostokącie o współrzędnych (x 1, y 1 ; x 2, y 2 ) od punktu (x 3, y 3 ), do punktu (x 4, y 4 ). Procedura rysuje wycinek koła. Procedura rysuje prostokąt z zaokrąglonymi narożnikami. Procedura wyświetla napis. Zagadnienie: 4.B Operacje na plikach Podstawowymi operacjami na plikach są: kopiowanie, usuwanie, przenoszenie, zmiana nazwy oraz tworzenie ich. Procedury i funkcje służące do operowania na plikach przedstawiono w tabeli 7. Wybrane procedury i funkcje służące do operowania na plikach Tabela 7 Nazwa Append AssignFile BlockRead BlockWrite ChDir CloseFile CreateDir DeleteFile DirectoryExists Eof Eoln Erase FileClose FileCreate FileOpen FileExists FileMode FilePos FileRead FileSearch FileSeek FileSetAttr FileSetDate FileSetReadOnly FileWrite FindClose Opis Otwiera plik i ustawia się na samym końcu. Kojarzy zmienną plikową z danym plikiem. Odczytuje dane z plików typowanych lub binarnych. Zapisuje dane do plików typowanych lub binarnych. Ustawia aktualny katalog. Zamyka uprzednio otwarty plik. Tworzy katalog określony w parametrze. Usuwa określony plik. Sprawdza czy dany katalog istnieje. Zwraca True jeżeli otwarty plik został odczytany do końca. Zwraca True jeżeli pozycja tekstu wskazuje na koniec linii. Usuwa plik. Zamyka uprzednio otwarty plik. Na podstawie ścieżki tworzy nowy plik. Otwiera plik na podstawie podanej ścieżki. Sprawdza czy dany plik istnieje. Określa sposób otwarcia pliku. Pobiera aktualną pozycję w pliku. Odczytuje dane z otwartego pliku. Wyszukuje pliku w określonym katalogu. Umożliwia przemieszczanie się po otwartym pliku. Ustawia atrybuty pliku. Ustawia datę ostatniej modyfikacji pliku. Ustawia plik jedynie do odczytu. Zapisuje dane do pliku. "Zamyka wyszukiwanie" uprzednio otwarte procedurą. 18
FindFirst FindNext ForceDirectories MkDir Read Readln RemoveDir Rename RenameFile Reset ReWrite RmDir Seek SeekEof SeekEoln SetCurrentDir Truncate Write Writeln Wyszukuje pliki pasujące do danej maski. Jeśli plik został znaleziony, procedura nakazuje szukać dalej. Tworzy nowe katalogi. Tworzy nowy katalog. Odczytuje zawartość pliku tekstowego lub binarnego. Odczytuje kolejną linię z pliku tekstowego. Usuwa katalog. Zmienia nazwę pliku. Zmienia nazwę pliku lub katalogu. Otwiera plik celem odczytania zawartości. Otwiera plik do zapisu. Usuwa katalog. Przesuwa na daną pozycję pliku amorficznego lub typowanego. Sprawdza czy kursor wskazuje na koniec pliku. Sprawdza czy kursor wskazuje na koniec linii. Ustawia aktualny katalog. Usuwa zawartość pliku znajdującą się za "kursorem". Zapisuje dane binarne lub tekstowe do pliku. Zapisuje nową linię do pliku tekstowego. Przykłady składni najczęściej stosowanych poleceń operacji na plikach. Kopiowanie pliku Bardzo prosta funkcja kopiowania ma postać: CopyFile(IpExistingFileName:PansiChar; IpNewFileName:PansiChar; bfailifexists:longbool); IpExistingFileName - scieżka pliku, który chcemy skopiować IpNewFileName - ścieżka, gdzie chcemy skopiować plik BFailIfExists - jeżeli posiada wartość true to nie nadpisuje pliku jeżeli ten istnieje Przykład: Chcę skopiować plik 'C:\a.txt' do folderu 'D:\Pliki' CopyFile('C:\a.txt','D:\Pliki\a.txt',true); Usuwanie pliku Funkcja usuń ma postać: DeleteFile(const FileName:string); const FileName - ścieżka pliku, który chcemy skasować Przykład: Chcę skasować plik 'C:\a.txt' DeleteFile('C:\a.txt'); Przenoszenie pliku Plik można przenieść funkcją: MoveFile(IpExistingFileName:PansiChar;IpNewFileName:PansiChar); IpExistingFileName - scieżka pliku, który chcemy przenieść, 19