SlideShare a Scribd company logo
1 of 38
Download to read offline
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI   ABC Delphi 6
           KATALOG KSI¥¯EK
                                         Autor: Andrzej Daniluk
                      KATALOG ONLINE     ISBN: 83-7197-504-X
                                         Format: B5, stron: 136
       ZAMÓW DRUKOWANY KATALOG           Przyk³ady na ftp: 1002 kB


              TWÓJ KOSZYK
                    DODAJ DO KOSZYKA     Delphi 6 to kolejna wersja popularnego rodowiska programistycznego firmy Borland,
                                         s³u¿¹cego do szybkiego tworzenia aplikacji za pomoc¹ jêzyka ObjectPascal. W Delphi
                                         napisano ju¿ wiele profesjonalnych aplikacji, co nie oznacza, i¿ jest ono rodowiskiem
         CENNIK I INFORMACJE             wy³¹cznie dla zawodowców. Wrêcz przeciwnie, dziêki prostocie obs³ugi i zaletom
                                         wzorowanego na Pascalu jêzyka ObjectPascal, jest ono doskona³ym narzêdziem dla
                   ZAMÓW INFORMACJE      pocz¹tkuj¹cych programistów, tak¿e dla tych, którzy nie mieli wcze niej wiele
                     O NOWO CIACH        wspólnego z programowaniem obiektowym.
                                         Dla nich w³a nie przeznaczona jest ta ksi¹¿ka omawiaj¹ca:
                       ZAMÓW CENNIK        •   Podstawy programowania w jêzyku ObjectPascal
                                           •   Projektowanie zorientowane obiektowo (OOD)
                                           •   Zintegrowane rodowisko programistyczne
                 CZYTELNIA                 •   ObjectPascal w wydaniu Delphi 6
                                           •   Biblioteki VCL i CLX
          FRAGMENTY KSI¥¯EK ONLINE         •   Tworzenie w³asnych komponentów
                                           •   Biblioteki DLL
                                         Pomoc¹ w zg³êbianiu tajników Delphi 6 jest 19 kompletnych przyk³adowych projektów,
                                         ilustruj¹cych najwa¿niejsze æwiczenia. Po przeczytaniu „ABC Delphi 6”, bêdziesz móg³
                                         samodzielnie pisaæ aplikacje dzia³aj¹ce w rodowisku Windows. Ksi¹¿ka stanowi tak¿e
                                         doskona³y wstêp do innych, bardziej zaawansowanych pozycji, omawiaj¹cych Delphi.




Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treści
               Wstęp ............................................................................................... 5
Rozdział 1. Elementarz Object Pascala................................................................. 7
               Moduły ................................................................................................................................7
               Program główny ..................................................................................................................8
               Stałe...................................................................................................................................10
               Zmienne.............................................................................................................................11
               Typy całkowite..................................................................................................................12
               Typy rzeczywiste...............................................................................................................12
               Typ Currency.....................................................................................................................13
               Typy logiczne....................................................................................................................13
               Typy znakowe ...................................................................................................................13
               Typy łańcuchowe ..............................................................................................................14
               Literały łańcuchowe ..........................................................................................................14
               Tablice...............................................................................................................................15
               Rekordy .............................................................................................................................16
               Typ okrojony .....................................................................................................................18
               Typ mnogościowy .............................................................................................................18
               Typ wyliczeniowy .............................................................................................................19
               Typ Variant .......................................................................................................................19
               Operatory...........................................................................................................................20
               Wskazania i adresy............................................................................................................21
               Instrukcje sterujące przebiegiem programu ......................................................................22
                   Instrukcja warunkowa If...Then ..................................................................................22
                   Instrukcja warunkowa Case...Of.................................................................................23
                   Instrukcja iteracyjna Repeat...Until ............................................................................24
                   Instrukcja iteracyjna While...Do .................................................................................25
                   Instrukcja iteracyjna For...To...Do..............................................................................26
                   Procedura przerwania programu Break ......................................................................26
                   Procedura przerwania programu Exit .........................................................................27
                   Procedura wyjścia z programu Halt............................................................................27
                   Procedura zatrzymania programu RunError ...............................................................27
                   Procedura kontynuacji programu Continue ................................................................28
               Procedury ..........................................................................................................................28
                   Parametry formalne.....................................................................................................29
               Funkcje ..............................................................................................................................31
               Moduły na powa nie .........................................................................................................32
               Podsumowanie ..................................................................................................................34
4                                                                                                                                ABC Delphi 6


Rozdział 2. Projektowanie obiektowe OOD ......................................................... 35
                   Klasa ...........................................................................................................................35
                   Obiekt..........................................................................................................................35
                   Metody ........................................................................................................................36
                   Widoczność obiektów.................................................................................................36
                   Współdziałanie obiektów............................................................................................36
                   Implementacja obiektu................................................................................................36
                   Dziedziczenie..............................................................................................................36
                Podsumowanie ..................................................................................................................36
Rozdział 3. Środowisko programisty — IDE ........................................................ 37
                Biblioteka VCL .................................................................................................................39
                   Karta Standard ............................................................................................................40
                   Karta Additional..........................................................................................................41
                   Karta Win32................................................................................................................43
                   Karta System...............................................................................................................45
                   Karta Dialogs ..............................................................................................................46
                Biblioteka CLX .................................................................................................................47
                   Karta Additional..........................................................................................................48
                   Karta Dialogs ..............................................................................................................48
                Podsumowanie ..................................................................................................................48
Rozdział 4. Object Pascal w wydaniu Delphi ....................................................... 49
                Formularz ..........................................................................................................................49
                Zdarzenia...........................................................................................................................51
                Wykorzystujemy własne funkcje i procedury...................................................................56
                Metody przecią ane...........................................................................................................58
                Wyjątki ..............................................................................................................................60
                Operacje na plikach...........................................................................................................65
                Strukturalna obsługa wyjątków.........................................................................................71
                Tablice otwarte..................................................................................................................72
                Tablice dynamiczne...........................................................................................................73
                Typ OleVariant..................................................................................................................74
                Rekordy w Delphi .............................................................................................................76
                Podsumowanie ..................................................................................................................83
Rozdział 5. Biblioteka VCL................................................................................. 85
                Komponenty TActionList, TImageList, TOpenDialog, TSaveDialog i TMainMenu ......85
                Komponenty TActionManager i TActionMainMenuBar .................................................91
                Komponenty TFrame, TSpinEdit i TStaticText................................................................96
                Hierarchia własności obiektów. Właściciele i rodzice....................................................100
                   Konstruktor i Destruktor ...........................................................................................102
                Podsumowanie ................................................................................................................103
Rozdział 6. Biblioteka CLX............................................................................... 105
                Komponenty TTimer i TLCDNumber ............................................................................105
                Podsumowanie ................................................................................................................109
Rozdział 7. Tworzymy własne komponenty ....................................................... 111
                Podsumowanie ................................................................................................................117
Rozdział 8. Biblioteki DLL ................................................................................ 119
                Podsumowanie ................................................................................................................126
                Skorowidz...................................................................................... 127
Rozdział 4.
Object Pascal
w wydaniu Delphi
   Rozdział ten poświęcony jest omówieniu praktycznych sposobów wykorzystania po-
   znanych wcześniej elementów języka Object Pascal w graficznym środowisku Delphi 6.
   Zapoznamy się tutaj m. in. z pojęciem formularza, wyjątku czy procedury obsługi zda-
   rzenia. Poznamy równie metody wykorzystania w aplikacji własnych funkcji i proce-
   dur. Zastosowanie omówionych elementów Delphi zostanie zilustrowane odpowied-
   nimi ćwiczeniami.



Formularz
   Formularz jest pierwszym obiektem, z którym spotykamy się, rozpoczynając pisanie
   aplikacji. Po dwukrotnym kliknięciu w obszarze formularza dostajemy się do okna
   edycji kodu modułu Unit1.pas, który pokazany jest na rysunku 4.1.

   Object Pascal oferuje nam słowo kluczowe ENCUU, pozwalające na tworzenie obiektów.
   Przykładowa definicja klasy formularza wygląda następująco:
     V[RG
       6(QTO  ENCUU
6(QTO
         RTQEGFWTG (QTO%TGCVG
5GPFGT 61DLGEV
       RTKXCVG
         ] 2TKXCVG FGENCTCVKQPU _
       RWDNKE
         ] 2WDNKE FGENCTCVKQPU _
       GPF

   Zdefiniowana klasa dziedziczy własności bazowej klasy formularza TForm, natomiast
   sam formularz, traktowany jako zmienna obiektowa, deklarowany jest jako:
     XCT
       (QTO 6(QTO
50                                                                             ABC Delphi 6


Rysunek 4.1.
Okno edycji kodu
głównego modułu
aplikacji




        Z zapisu tego odczytamy, i formularz jest zmienną obiektową, natomiast nazwa kla-
        sy stała się nowym specyfikatorem typu danych.

        W definicji klasy mo emy zauwa yć procedurę:
           RTQEGFWTG (QTO%TGCVG
5GPFGT 61DLGEV

        Delphi odpowiednio inicjuje formularz (tylko jeden raz), kiedy jest on tworzony po
        raz pierwszy. Sender jest pewną zmienną typu TObject, wołaną przez wartość. W rze-
        czywistości Sender reprezentuje pewną właściwość, polegającą na tym, i ka dy
        obiekt łącznie z formularzem (oraz ka dy obiekt VCL i CLX) musi być w pewien
        sposób poinformowany o przyszłym przypisaniu mu pewnego zdarzenia (w przypad-
        ku formularza zdarzenie to polega na jego inicjalizacji).

           TObject jest bezwzględnym przodkiem wszystkich komponentów i obiektów VCL
           oraz CLX i umieszczony jest na samym szczycie hierarchii obiektów.


        Z rysunku 4.1 mo emy odczytać, i standardowa definicja klasy składa się z kilku czę-
        ści. Sekcja public słu y do deklarowania funkcji i procedur (czyli metod) oraz zmien-
        nych (zwanych polami), które w przyszłości mogą być udostępniane innym. Zasadni-
        czą ró nicą pomiędzy metodami a zwykłymi funkcjami czy procedurami jest to, e
        ka da metoda posiada niejawny parametr Self, wskazujący na obiekt będący przed-
        miotem wywołania tej metody. Sekcję public często nazywamy interfejsem obiektu.
        Sekcja private przeznaczona jest dla pól i metod widzianych jedynie wewnątrz klasy.
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                                              51


        Oprócz elementów wymienionych, definicja klasy mo e posiadać jeszcze sekcje pro-
        tected oraz published. W części protected mo na definiować pola i metody widoczne
        dla macierzystej klasy i klas po niej dziedziczących. Deklaracje zawarte w sekcji pu-
        blished (publikowanej) pełnią taką samą rolę, jak deklaracje umieszczone w sekcji
        public (publicznej). Ró nica pomiędzy nimi polega na tym, i te pierwsze nie tworzą
        tzw. informacji czasu wykonania.



Zdarzenia
        Zdarzenie (ang. event) określane jest jako zmiana, która występuje w aktualnym sta-
        nie obiektu i jest źródłem odpowiednich komunikatów, przekazywanych do aplikacji
        lub bezpośrednio do systemu. Reakcja obiektu na wystąpienie zdarzenia udostępniana
        jest aplikacji poprzez procedurę obsługi zdarzeń (ang. event procedure) będącą wy-
        dzieloną częścią kodu. Rolę zdarzeń w aplikacji najlepiej jest prześledzić, wykonując
        praktyczne ćwiczenie.

        Tradycyjnie ju zało ymy na dysku nowy katalog. Po uruchomieniu Delphi 6 znany-
        mi nam ju poleceniami menu zapiszmy w nim główny moduł aplikacji, który na-
        zwiemy Unit_08.pas. Zapiszmy równie projekt aplikacji pod nazwą Projekt_08.dpr.

        Rozmiary formularza ustalimy, korzystając z cech Height (wysokość) i Width (szero-
        kość), znajdujących się w karcie właściwości (Properties) Inspektora Obiektów. Je eli
        chcemy, aby po uruchomieniu formularz nie „rozpływał” się po ekranie w odpowie-
        dzi na kliknięcie pola maksymalizacji, w Inspektorze Obiektów rozwińmy cechę Con-
        straints (ograniczenie) i we właściwe miejsca wpiszmy ądane rozmiary formularza
        (w pikselach), tak jak pokazano na rysunku 4.2.

Rysunek 4.2.
Ograniczenie
rozmiarów
formularza

        Przejdźmy następnie do cechy Position i wybierzmy poScreenCenter. Wybrane przy-
        pisanie spowoduje, e w momencie uruchomienia aplikacji formularz pozostanie
        w centrum ekranu (ale nie pulpitu poDesktopCenter); je eli oczywiście w Inspektorze
        Obiektów cechy Align (zakotwiczenie) nie ustawiliśmy inaczej ni w pozycji alNone.

        Na tak przygotowanym formularzu umieśćmy teraz dwa komponenty reprezentujące
        klasę TButton z karty Standard. Korzystając z Inspektora Obiektów oraz z karty wła-
        ściwości, cechy Caption przycisków Button1 oraz Button2 zmieńmy odpowiednio na
        Zamknij i Tekst. Znak , który występuje w nazwach przycisków, spowoduje, e
        litera, występująca bezpośrednio za nim, stanowić będzie klawisz szybkiego dostępu
        do procedury obsługi wybranego zdarzenia. W podobny sposób mo emy zmienić ce-
        chy Font wybranych przycisków. Dla ka dego z przycisków stworzymy procedurę
        obsługi odpowiedniego zdarzenia. Klikając dwukrotnie przycisk Zamknij lub w wido-
        ku drzewa obiektów (Object TreeView) odpowiednio oznaczony komponent, dosta-
        niemy się do wnętrza właściwej procedury obsługi zdarzenia:
52                                                                          ABC Delphi 6


       RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
       DGIKP
       GPF

     Ju w tym miejscu mo emy zauwa yć, i w definicji klasy program Delphi wygene-
     rował automatycznie deklarację przycisku oraz deklarację procedury obsługującego
     go zdarzenia. Korzystając z notacji kropkowej, kompilator automatycznie został poin-
     formowany, do której klasy nale y wywoływana procedura.

     U ycie notacji kropkowej stanowi informację dla kompilatora, e przykładowa pro-
     cedura Button1Click() nale y do przykładowej klasy TForm1 (jest metodą zdefinio-
     waną w klasie TForm1).

     Nale y zawsze pamiętać, i szkielety procedur obsługi odpowiednich zdarzeń, np. ta-
     kich jak $WVVQP%NKEM
, zostaną automatycznie wygenerowane przez Delphi w od-
     powiedzi na dwukrotne kliknięcie danego przycisku. W adnym wypadku procedur
     tych nie nale y wpisywać samodzielnie.

     Omawianą procedurę obsługi zdarzenia wypełnimy przedstawionym poni ej kodem,
     co spowoduje, e po naciśnięciu wybranego przycisku aplikacja zostanie zamknięta.
       RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
       DGIKP
         #RRNKECVKQP6GTOKPCVG

       GPF

     Ka dy standardowy program Delphi (oparty na formularzu) zawiera pewną zmienną
     globalną o nazwie Application typu TApplication. W czasie tworzenia nowego pro-
     jektu Delphi konstruuje obiekt aplikacji i przypisuje mu właśnie zmienną Application.
     Obiekty klasy TApplication przechowują informacje odnośnie zasad współpracy apli-
     kacji z systemem operacyjnym. Informacje te dotyczą np. rozpoczynania i kończenia
     działania aplikacji czy tworzenia okna głównego programu. Istnieje wiele metod kla-
     sy TApplication. Jedną z nich jest 6GTOKPCVG
, umo liwiająca zamknięcie aplikacji.

     Zajmiemy się teraz zaprojektowaniem procedury obsługi zdarzenia przycisku Button2,
     który nazwaliśmy Tekst. Po kliknięciu tego przycisku, bezpośrednio na formularzu
     zostanie wyświetlony prosty tekst. Skorzystamy z tego, i formularz, będący w istocie
     te komponentem, posiada swoje własne płótno (ang. canvas), reprezentowane przez
     klasę TCanvas, posiadającą właściwość Canvas. Procedura obsługi naszego zdarzenia
     będzie wyglądać następująco:
       RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
       DGIKP
         %CPXCU(QPV%QNQTEN$NWG
         %CPXCU(QPV*GKIJV
         %CPXCU6GZV1WV
%NKGPV*GKIJV FKX %NKGPV9KFVJ FKX 
                          2KGTYUC CRNKMCELC Y GNRJK  
       GPF

     Powy szy przykład ilustruje sposób odwoływania się do obszaru płótna poprzez wła-
     ściwość Canvas klasy TCanvas z wykorzystaniem właściwości czcionka (Font). Za-
     stosowana metoda 6GZV1WV
:
       RTQEGFWTG 6GZV1WV
: ; +PVGIGT EQPUV 6GZV UVTKPI
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                                            53


        pozwala na umieszczenie dowolnego tekstu identyfikowanego przez stałą Text
        w miejscu formularza o współrzędnych X, Y (odległość liczona jest w pikselach, na-
        tomiast lewy górny róg formularza posiada współrzędne 0, 0).

        Mo e równie zdarzyć się i taka sytuacja, w której zechcemy zamknąć formularz, ko-
        rzystając bezpośrednio z jego pola zamknięcia (por. rysunek 3.2). Zamykając w ten
        sposób działającą aplikację, nale y mieć na uwadze fakt, i w Windows 9x bezpo-
        średni sposób zamknięcia działającego programu mo e nie działać w pełni poprawnie
        (nie dotyczy to Win 2000, NT i XP). Aby mieć pewność, e w momencie zamknięcia
        aplikacji wszystkie jej zasoby zostaną prawidłowo zwolnione, skorzystamy ze zda-
        rzenia 1P%NQUG. Klikając (tylko raz) w obszar formularza w inspektorze obiektów,
        przejdźmy do zakładki Events (zdarzenia). Zdarzenie 1P%NQUG określmy jako (QTO%NQ
        UG (rysunek 4.3) i potwierdźmy klawiszem Enter.

Rysunek 4.3.
Zdarzenie OnClose




        W ten sposób Delphi automatycznie wygeneruje procedurę obsługi zdarzenia
          (QTO%NQUG
5GPFGT 61DLGEV XCT #EVKQP 6%NQUG#EVKQP

        Zmiennej #EVKQP (akcja) mo na tutaj przypisać jeden z elementów typu wyliczeniowego
          V[RG
          6%NQUG#EVKQP  
EC0QPG EC*KFG EC(TGG EC/KPKOKG

        gdzie:
             EC0QPG oznacza, e formularz nie zostanie zamknięty;
             EC*KFG oznacza, e formularz nie zostanie zamknięty, lecz ukryty;
             EC(TGG oznacza, e formularz zostanie zamknięty z jednoczesnym
             zwolnieniem wszystkich zasobów pamięci, z których aktualnie korzysta;
             EC/KPKOKG oznacza, e formularz zostanie zminimalizowany.
54                                                                            ABC Delphi 6


        Procedurę obsługi zdarzenia (QTO%NQUG
 wypełnimy następującym kodem:
           RTQEGFWTG 6(QTO(QTO%NQUG
5GPFGT 61DLGEV
           XCT #EVKQP 6%NQUG#EVKQP
           DGIKP
             ECUG 
/GUUCIG$QZ
 COMPKúEKG CRNKMCELK !  7YCIC 
                   /$A;'501 QT /$A+%1037'56+10 QH
                +A;'5
                   #EVKQP  EC(TGG
                +A01
                   #EVKQP  EC0QPG
             GPF
           GPF

        Skorzystaliśmy tutaj z omawianej wcześniej instrukcji %CUG1H oraz z funkcji /GU
        UCIG$QZ
, wyświetlającej odpowiedni komunikat w okienku dialogowym.

        Projekt aplikacji Projekt_08.dpr, wykorzystującej omawiane zdarzenia, znajduje się
        w katalogu Kody08, natomiast na wydruku 4.1 zamieszczono kod źródłowy modułu
        Unit_08.pas.

Wydruk 4.1. Moduł Unit_08.pas projektu Projekt_08.dpr
           WPKV 7PKVA

           KPVGTHCEG

           WUGU
           9KPFQYU /GUUCIGU 5[U7VKNU %NCUUGU
           )TCRJKEU %QPVTQNU (QTOU $WVVQPU
           5VF%VTNU

           V[RG
           6(QTO  ENCUU
6(QTO
           $WVVQP 6$WVVQP
           $WVVQP 6$WVVQP
           RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV
           RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV

           RTQEGFWTG (QTO%NQUG
5GPFGT 61DLGEV XCT #EVKQP 6%NQUG#EVKQP

           RTKXCVG
           ] 2TKXCVG FGENCTCVKQPU _
           RWDNKE
           ] 2WDNKE FGENCTCVKQPU _
           GPF

           XCT
           (QTO 6(QTO

           KORNGOGPVCVKQP

           ] 4
(/_

           
           RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
           DGIKP
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                                              55


            %CPXCU(QPV%QNQTEN$NWG
            %CPXCU(QPV*GKIJV
            %CPXCU6GZV1WV
%NKGPV*GKIJV FKX %NKGPV9KFVJ FKX 
                             2KGTYUC CRNKMCELC Y GNRJK  
          GPF
          
          RTQEGFWTG 6(QTO(QTO%NQUG
5GPFGT 61DLGEV XCT #EVKQP 6%NQUG#EVKQP
          DGIKP
            ECUG 
/GUUCIG$QZ
 COMPKúEKG CRNKMCELK !  7YCIC 
                  /$A;'501 QT /$A+%1037'56+10 QH
               +A;'5
                 #EVKQP  EC(TGG
               +A01
                 #EVKQP  EC0QPG
            GPF
          GPF
          
          RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
          DGIKP
             #RRNKECVKQP6GTOKPCVG

          GPF
          
          GPF


        Zajrzyjmy teraz do katalogu, w którym został zapisany nasz projekt. Oprócz plików,
        wymienionych w rozdziale 1, pojawiły się tam 3 dodatkowe:
            .dpp — plik Diagram Delphi Page. Mo na w nim zapisać diagramy będące
            wizualizacją logicznych relacji pomiędzy widocznymi i niewidocznymi
            komponentami, składającymi się na całość projektu. Relacje takie mo na
            uzyskać, korzystając z zakładki Diagram.
            .dfm — plik zawierający opis formularza. Dyrektywa kompilatora ] 4_
            lub ] 4'5174%'_ dołącza do projektu zewnętrzny plik zasobów, zawierający
            opis formularza. Plik zasobów jest włączany do końcowego pliku
            wynikowego .exe w czasie łączenia projektu.
            .res — plik zasobów Windows.

         adnego z nich nie powinnyśmy utracić.

        Plik projektu Delphi .dpr środowiska graficznego ró ni się nieco od swojego odpowied-
        nika aplikacji konsolowych. Programy Delphi są bardzo krótkie. Wynika to z faktu, i
        aplikacje z interfejsem graficznym zazwyczaj wywołują procedurę inicjalizacyjną #R
        RNKECVKQP+PKVKCNKG
, następnie tworzony jest formularz (lub formularze) Applica-
        tion.CreateForm(TForm1,Form1), w którym uruchamiane są procedury obsługi zdarzeń
        #RRNKECVKQP4WP
. Aplikacja zamykana jest poprzez główny formularz w odpowiedzi
        na wywołanie procedury obsługi odpowiedniego zdarzenia #RRNKECVKQP6GTOKPCVG

        (patrz wydruk 4.1). Typowy plik kodu źródłowego projektu Delphi przedstawiony jest
        na wydruku 4.2.
56                                                                            ABC Delphi 6


Wydruk 4.2. Typowy plik programu Delphi
           RTQITCO 2TQLGMVA

           WUGU
           (QTOU
           7PKVA KP 7PKVARCU ](QTO_

           ] 4
4'5_

           DGIKP
             #RRNKECVKQP+PKVKCNKG
             #RRNKECVKQP%TGCVG(QTO
6(QTO (QTO
             #RRNKECVKQP4WP
           GPF


        Deklaracja WUGU tworzy listę modułów wchodzących w skład programu. Nazwa modułu
        mo e być poprzedzona dyrektywą KP, specyfikującą nazwę pliku. Moduły bez dyrek-
        tywy KP są modułami bibliotecznymi i nie stanowią części kodu źródłowego projektu.



Wykorzystujemy własne funkcje
i procedury
        Własne procedury i funkcje mo emy umieszczać w programie Delphi na parę sposobów.
        Zapoznamy się teraz z dwoma sposobami — najprostszymi i najczęściej stosowanymi.

        Definicję funkcji lub procedury umieszczamy bezpośrednio w kodzie programu w sekcji
        implementacji modułu:
           XCT
             (QTO 6(QTO
           KORNGOGPVCVKQP
           ] 4
FHO_
           RTQEGFWTG 2QYGTVQ0
XCT Z +PVGIGT [ +PVGIGT
           XCT
             K +PVGIGT
           DGIKP
             
             HQT K VQ [ FQ
              DGIKP
Z
                (QTO/GOQ.KPGU#FF
+PV6Q5VT
Z
 FQ RQVúIK 
                                +PV6Q5VT
K
  
+PV6Q5VT

              GPF
           GPF

        Wyświetlanie kolejnych liczb całkowitych, będących kolejnymi potęgami całkowitego
        parametru x, dokonywane jest w komponencie edycyjnym Memo1, będącym reprezen-
        tantem klasy TMemo z karty Standard. Poniewa nasza procedura nie została zadeklaro-
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                                             57


        wana w definicji klasy formularza, więc odwołanie się w jej wnętrzu do odpowiedniego
        komponentu edycyjnego wymaga, aby jawnie wskazać, i komponent ten nale y do
        formularza Form1. Wyświetlanie kolejnych liczb całkowitych dokonywane jest za po-
        średnictwem funkcji +PV6Q5VT
 formatującej wartość liczbową (wartość w postaci
        liczby całkowitej) na odpowiedni łańcuch znaków.

        Du o subtelniejszym (ale nie zawsze opłacalnym sposobem) jest uczynienie funkcji
        lub procedury jawnym obiektem klasy formularza TForm1. Nale y wówczas definicję
        nagłówkową funkcji lub procedury uzupełnić o nazwę klasy, do której ma przynale-
         eć. Musimy ponadto omawiane funkcje lub procedury zadeklarować w definicji klasy
        w jednej z sekcji, np.
          V[RG
            6(QTO  ENCUU
6(QTO
              $WVVQP 6$WVVQP
              /GOQ 6/GOQ
              $WVVQP 6$WVVQP
              $WVVQP 6$WVVQP
              RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV
              RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV
              RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV
            RTKXCVG
              ] 2TKXCVG FGENCTCVKQPU _
              RTQEGFWTG 2QYGTVQ0
Z [ %CTFKPCN
          RWDNKE
              ] 2WDNKE FGENCTCVKQPU _
            GPF
          XCT
            (QTO 6(QTO
          KORNGOGPVCVKQP
          ] 4
FHO_
          
          RTQEGFWTG 6(QTO2QYGTVQ0
Z [ %CTFKPCN
          XCT
            K  %CTFKPCN
          DGIKP
            
            HQT K VQ [ FQ
             DGIKP
Z
               /GOQ.KPGU#FF
+PV6Q5VT
Z
 FQ RQVúIK 
                               +PV6Q5VT
K
  
+PV6Q5VT

             GPF
          GPF

        Korzystając z tego sposobu definiowania własnej funkcji lub procedury, mo emy we-
        wnątrz nich bez problemów odwoływać się do innych obiektów formularza. Wszystkie
        własności, cechy, zdarzenia i metody właściwe tym obiektom będą widoczne w na-
        szej funkcji lub procedurze.
58                                                                               ABC Delphi 6



Metody przeciążane
        Chocia mo na przypuszczać, i pojęcia procedur lub funkcji przecią anych (przeła-
        dowywanych) nale y wprowadzać na bardziej zaawansowanym kursie programowa-
        nia, to jednak wydaje się, i w sytuacji kiedy środowiska programistyczne stają się
        coraz bardziej rozbudowane, powinniśmy posiadać pewne wiadomości na ten temat.
        Jest to szczególnie wa ne w momencie, kiedy zechcemy samodzielnie posługiwać się
        plikami pomocy.

        Pisząc programy w Delphi, mo emy zadeklarować wiele funkcji czy procedur o tej
        samej nazwie, ale o ró nej postaci argumentów. W momencie wywołania danej proce-
        dury czy funkcji kompilator powinien je rozró niać. Do deklaracji procedur (funkcji)
        przeładowywanych słu y dyrektywa QXGTNQCF (przeładowanie). Najlepszym (i jedy-
        nym) sposobem zapoznania się z ideą funkcji (procedur) przeładowywanych jest samo-
        dzielne napisanie prostej aplikacji, w której funkcje te zostaną wykorzystane. Stworzy-
        my program wykorzystujący znane nam ju procedury obliczające kolejne całkowite
        potęgi wybranej liczby, ale w ten sposób, by jednocześnie mo na było korzystać z pro-
        cedur, których parametry wołane są przez zmienną i przez wartość. Przy okazji zapo-
        znamy się z podstawowymi własnościami komponentu edycyjnego TMemo.

        W skład formularza projektu Kody09Projekt_09.dpr będą wchodzić trzy przyciski
        będące reprezentantami klasy TButton oraz jeden reprezentant klasy TMemo. Umie-
        śćmy je na formularzu w sposób pokazany na rysunku 4.4. W inspektorze obiektów
        właściwość Caption formularza Form1 zmieńmy na Projekt_09.

Rysunek 4.4.
Podstawowe
elementy formularza
projektu Projekt_
09.dpr




        W inspektorze obiektów własności Caption komponentów Button1, Button2 i Button3
        zmieńmy odpowiednio na Oblicz — wywołanie przez zmienną, Zamknij i Oblicz
        — wywołanie przez wartość. Mo na równie skorzystać z ich własności Font, aby
        dobrać odpowiednią czcionkę. Nale y oczywiście pamiętać o uprzednim zaznaczeniu
        wybranego komponentu, np. poprzez pojedyncze kliknięcie go myszą.

        Poniewa nale y się spodziewać, i w komponencie edycyjnym Memo1 będą wyświe-
        tlane kolejne liczby, musimy zadbać o mo liwość pionowego przewijania zawartości
        tego komponentu. W tym celu w inspektorze obiektów jego właściwość ScrollBars
        ustalmy jako ssVertical. Je eli zechcemy, aby zawartość komponentu mogła być prze-
        wijana zarówno w pionie, jak i w poziomie, wystarczy wybrać ssBoth.
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                                            59


        W momencie wybrania reprezentanta klasy TMemo, w oknie edycji zobaczymy jego
        nazwę. Aby nie była ona wyświetlana, nale y skorzystać z własności Lines i poprzez
        TStrings w oknie edytora skasować napis Memo1. Kiedy wszystkie potrzebne kom-
        ponenty zostaną ju rozmieszczone na formularzu, mo emy jego rozmiary odpowied-
        nio do nich dopasować. W tym celu w inspektorze obiektów jego własności AutoSize
        wystarczy przypisać wartość True.

        Po tych wstępnych czynnościach nie pozostaje nam nic innego jak zaimplementować
        w programie dwie procedury 2QYGT:VQ;
 obliczające kolejne całkowite potęgi Y wy-
        branej liczby całkowitej X. Musimy równie wypełnić treści procedur odpowiednich
        zdarzeń, podobnie jak zostało to pokazane na wydruku 4.3.

Wydruk 4.3. Kod głównego modułu Unit_09.pas projektu Projekt_09.dpr, wykorzystującego
przecią ane procedury
           WPKV 7PKVA

           KPVGTHCEG

           WUGU
             9KPFQYU /GUUCIGU 5[U7VKNU 8CTKCPVU
             %NCUUGU )TCRJKEU %QPVTQNU (QTOU
             KCNQIU 5VF%VTNU

           V[RG
             6(QTO  ENCUU
6(QTO
               $WVVQP 6$WVVQP
               /GOQ 6/GOQ
               $WVVQP 6$WVVQP
               $WVVQP 6$WVVQP
               RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV
               RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV
               RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV
             RTKXCVG
               ] 2TKXCVG FGENCTCVKQPU _
               RTQEGFWTG 2QYGT:VQ;
Z [ %CTFKPCNQXGTNQCF
               RTQEGFWTG 2QYGT:VQ;
XCT Z [ +PVGIGTQXGTNQCF
             RWDNKE
               ] 2WDNKE FGENCTCVKQPU _
             GPF

           XCT
             (QTO 6(QTO

           KORNGOGPVCVKQP

           ] 4
FHO_

           RTQEGFWTG 6(QTO2QYGT:VQ;
XCT Z [ +PVGIGT
           XCT
             K +PVGIGT
           DGIKP
             
             HQT K VQ [ FQ
              DGIKP
Z
60                                                                       ABC Delphi 6


            /GOQ.KPGU#FF
+PV6Q5VT
Z
 FQ RQVúIK 
                            +PV6Q5VT
K
  
+PV6Q5VT

          GPF
       GPF
       
       RTQEGFWTG 6(QTO2QYGT:VQ;
Z [ %CTFKPCN
       XCT
         K %CTFKPCN
       DGIKP
         
         HQT K VQ [ FQ
          DGIKP
Z
            /GOQ.KPGU#FF
+PV6Q5VT
Z
 FQ RQVúIK 
                            +PV6Q5VT
K
  
+PV6Q5VT

          GPF
       GPF
       
       RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
       XCT C D +PVGIGT
       DGIKP
         /GOQ%NGCT

         C D
         2QYGT:VQ;
C D Y[YQ CPKG RTG OKGPPæ
       GPF
       
       RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
       DGIKP
         /GOQ%NGCT

         2QYGT:VQ;
  Y[YQ CPKG RTG YCTVQ è
       GPF
       
       RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
       DGIKP
          #RRNKECVKQP6GTOKPCVG

       GPF
       GPF


     Program skompilujemy, korzystając z klawisza F9 lub opcji menu Run, Run. Śledząc
     kod programu, mo emy te zauwa yć, i w celu skasowania zawartości komponentu
     Memo1 posługujemy się metodą %NGCT
.



Wyjątki
     Podobnie jak w przypadku metod przecią anych, ktoś mógłby powątpiewać w celowość
     wprowadzania pojęcia wyjątku w kursie programowania, przeznaczonym dla osób
     mniej zaawansowanych. Nale y jednak zdawać sobie sprawę z faktu, i wyjątki jako
     obiekty pełnią bardzo wa ną rolę we wszystkich współczesnych systemach operacyj-
     nych oraz środowiskach programowania i pewne własności kompilatora, które jeszcze
     do niedawna uwa ano za bardzo zaawansowane, obecnie ju takimi być przestają.
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                                            61


        Wyjątki pozwalają osobie piszącej kod na uwzględnienie sytuacji, w której program
        w jakimś momencie wykonywania mo e ulec niekontrolowanemu zakończeniu. Wy-
        jątek mo e być umiejscowiony w dowolnej metodzie. W Delphi podstawową klasą,
        zajmującą się obsługą wyjątków, jest Exception (ang. wyjątek). Klasa ta wywodzi się
        bezpośrednio z klasy TObject. Z kolei z Exception (chodź nie bezpośrednio) wywodzi
        się klasa EMathError, będąca z kolei nadklasą (klasą bazową) dla zbioru niezwykle
        u ytecznych klas, obsługujących wyjątki, powstałe przy wykryciu przez kompilator
        błędów operacji matematycznych na liczbach zmiennopozycyjnych (liczbach dzie-
        siętnych). Wyjątki dziedziczące z EMathError zostały przedstawione w tabeli 4.1.

Tabela 4.1. Klasy dziedziczące z EMathError
 Klasa wyjątku           Znaczenie
 '+PXCNKF#TIWOGPV        Przekroczenie zakresu zmienności zadeklarowanego typu danych
 '+PXCNKF1R              Nieprawidłowa operacja zmiennoprzecinkowa
 '1XGTHNQY               Przekroczenie zakresu typu zmiennoprzecinkowego
 '7PFGTHNQY              Wartość typu zmiennoprzecinkowego jest zbyt mała
 'GTQKXKFG             Zmiennoprzecinkowe dzielenie przez zero

        Delphi posługuje się dwoma wyra eniami przeznaczonymi do obsługi wyjątków.
        Z pierwszym, a zarazem podstawowym z nich, zapoznamy się obecnie. Wyra enie
        VT[GZEGRVGPF uaktywnia procedurę obsługi wyjątku przejmującą kontrolę nad
        dalszym wykonywaniem programu, w przypadku gdy zostanie wykonana jakaś nie-
        dozwolona operacja. Jako przykład niech nam posłu y prosty algorytm wykonujący
        operację zmiennopozycyjnego dzielenia dwóch liczb, które wprowadzimy do odpo-
        wiednich komponentów edycyjnych. Bez trudu mo emy przewidzieć, i wyjątek po-
        wstanie przy próbie wykonania dzielenia na znakach nie będących liczbami lub przy
        próbie dzielenia przez zero.

        Zaprojektujmy bardzo prostą aplikację, wykonującą zmiennopozycyjne dzielenie dwóch
        liczb, wprowadzanych z klawiatury do dwóch nowoczesnych komponentów edycyj-
        nych LabeledEdit1 i LabeledEdit2. Wynik będzie przechowywany w komponencie
        LabeledEdit3.

        Stwórzmy nowy formularz projektu Projekt_10.dpr, w skład którego wchodzić będą
        dwa przyciski (reprezentujące klasę TButton) oraz trzy komponenty edycyjne (repre-
        zentujące klasę TLabeledEdit z karty Additional). W inspektorze obiektów właściwo-
        ściom Text komponentów LabeledEdit1 i LabeledEdit2 przypiszmy wartości 0,0, aby
        ich cechy Text nie posiadały wartości nieokreślonej. Cechę Text komponentu Labele-
        dEdit3 wykasujmy. Komponenty reprezentujące klasę TLabeledEdit posiadają mo -
        liwość automatycznego ich opisu. Są one jakby połączeniem komponentów z klas
        TLabel i TEdit. Rozwijając w inspektorze obiektów opcje właściwości EditLabel
        komponentu LabeledEdit1 (obok nazwy właściwości w inspektorze obiektów pojawi
        się znaczek „–”) opiszmy jego cechę Caption jako Liczba 1. Podobnie opiszemy
        wszystkie komponenty edycyjne, tak jak przedstawiono to na rysunku 4.5.
62                                                                               ABC Delphi 6


Rysunek 4.5.
Rozmieszczenie i opis
komponentów
reprezentujących
klasę TLabeledEdit




         Bardzo często korzystanie z ró nego rodzaju komponentów ułatwiają nam dymki
         podpowiedzi (ang. hint). Je eli zechcemy je zastosować na potrzeby naszych okienek
         edycji, musimy zamknąć opcje właściwości EditLabel (obok nazwy tej właściwości
         w inspektorze obiektów pojawi się znaczek „+”). Zaznaczmy myszką wybrany kom-
         ponent i odszukajmy w inspektorze obiektów jego właściwość Hint, którą opiszemy
         jako Podaj pierwszą liczbę. Aby dymek podpowiedzi był rzeczywiście widoczny w trak-
         cie działania programu, właściwości ShowHint nale y nadać wartość 6TWG. Analo-
         gicznie postąpimy z następnym komponentem edycyjnym.

         Przystąpmy obecnie do wypełniania głównego modułu Unit_10.pas naszego formula-
         rza odpowiednim kodem. W sekcji implementacji modułu zadeklarujmy własną klasę
         EFloatingPointError (wyjątek dzielenia zmiennopozycyjnego) przechwytującą wy-
         jątki, która będzie dziedziczyć po klasie EMathError. Dodatkowo zastosujmy dwie
         deklaracje TGUQWTEGUVTKPI, przechowujące odpowiednie komunikaty, informujące
         o powstaniu wyjątku podczas zmiennopozycyjnego dzielenia dwóch liczb:
            KORNGOGPVCVKQP
            ] 4
FHO_
            V[RG
               '(NQCVKPI2QKPV'TTQT  ENCUU
'/CVJ'TTQT
            TGUQWTEGUVTKPI
               /UI  $ æF QRGTCELK OKGPPQRQ[E[LP[EJ U 
               /UI  2TÎDC FKGNGPKC RTG GTQ U 

         W tym wypadku znaki formatowania U pozwalają na zduplikowanie komunikatów
         w języku polskim i angielskim.

         Procedurę obsługi zdarzenia $WVVQP%NKEM
, uruchamianego przyciskiem Oblicz,
         wypełnimy następującym kodem:
            RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
            DGIKP
               VT[
                 .CDGNGF'FKV6GZV(NQCV6Q5VT
5VT6Q(NQCV
.CDGNGF'FKV6GZV
                                               5VT6Q(NQCV
.CDGNGF'FKV6GZV
               GZEGRV
                 QP 'Z '+PXCNKF1R FQ
                   TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV
/UI ='Z/GUUCIG?
                 QP 'Z 'GTQKXKFG FQ
                   TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV
/UI ='Z/GUUCIG?
               GPF
            GPF
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                                               63


        W klauzuli VT[GZEGRV, przeznaczonej do obsługi błędów, umieściliśmy zapis właści-
        wej operacji dzielenia dwóch liczb. Funkcje 5VT6Q(NQCV
 dokonują konwersji ciągu zna-
        ków, przechowywanych w cechach Text komponentów LabeledEdit1 oraz LabeledE-
        dit2, na zmiennopozycyjną postać numeryczną, czyli po prostu na liczby z przecinkami.
        U ywając operatora dzielenia zmiennopozycyjnego „/”, te dwie liczby podzielimy
        przez siebie, natomiast wynik dzielenia zostanie z kolei przypisany cesze Text kom-
        ponentu edycyjnego reprezentowanego przez LabeledEdit3. Aby postać numeryczna
        liczby mogła być wyświetlana w oknie edycyjnym, musi zostać zamieniona na łań-
        cuch znaków (w tym wypadku typu string). Dokonujemy tego, stosując funkcję (NQ
        CV6Q5VT
 konwertującą postać numeryczną liczby na odpowiedni łańcuch znaków.

        Ka de wyra enie VT[GZEGRVGPF mo e posiadać jedną lub więcej sekcji on: 'Z
        MNCUC Y[LæVMW FQ, z których ka da deklaruje odrębną klasę wyjątku. Delphi prze-
        szukuje sekcję QP w zapisanym porządku (od góry do dołu), poszukując aktualnie pa-
        sującej klasy wyjątku odpowiadającego występującemu błędowi.

        Ogólnie rzecz biorąc, ka dy kod potencjalnie mogący wygenerować wyjątek (w na-
        szym przypadku dzielenie zmiennopozycyjne) powinien mieć mo liwość przekazania
        jego obiektu do wyra enia raise (zakańczać, zbierać). W tym miejscu nale y wyko-
        rzystać własną klasę wyjątku '(NQCVKPI2QKPV'TTQT %TGCVG(OV
 z konstruktorem
        konwertującym komunikat egzemplarza wyjątku na łańcuch znaków
          EQPUVTWEVQT %TGCVG(OV 
EQPUV /UI UVTKPI EQPUV #TIU CTTC[ QH EQPUV

        gdzie argument Args jest tzw. wariantową tablicą otwartą (array of const), pozwalają-
        cą na przekazywanie niejednorodnych komunikatów (Messages).

        Mo e zdarzyć się i taka sytuacja, w której kompilator w sekcji VT[ GZEGRVGPF
        nie znajdzie pasującego obiektu wyjątku. Wówczas nale y u yć konstrukcji VT[
        GZEGRVGNUGTCKUGGPF:
          RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
          DGIKP
             VT[
               .CDGNGF'FKV6GZV(NQCV6Q5VT
5VT6Q(NQCV
.CDGNGF'FKV6GZV
                                             5VT6Q(NQCV
.CDGNGF'FKV6GZV
             GZEGRV
               QP 'Z '+PXCNKF1R FQ
                 TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV
/UI ='Z/GUUCIG?
               QP 'Z 'GTQKXKFG FQ
                 TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV
/UI ='Z/GUUCIG?
               GNUG
                 TCKUG
             GPF
          GPF

        Mamy nadzieję, i przedstawione w poprzednim punkcie rozwa ania nie są zbyt
        skomplikowane dla mniej zaawansowanych Czytelników. Je eli jednak ktoś czuje się
        nieco zagubiony pośród tych pojęć, zawsze mo na przedstawioną wy ej konstrukcję
        znacznie uprościć poprzez wyświetlanie komunikatu wyjątku poprzez okno dialogo-
        we MessageBox():
64                                                                              ABC Delphi 6


           RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
           DGIKP
              VT[
                .CDGNGF'FKV6GZV(NQCV6Q5VT
5VT6Q(NQCV
.CDGNGF'FKV6GZV
                                              5VT6Q(NQCV
.CDGNGF'FKV6GZV
              GZEGRV
                QP 'Z '+PXCNKF1R FQ
                  /GUUCIG$QZ
 $ æF QRGTCELK OKGPPQRQ[E[LP[EJ  7YCIC 
                             /$A1-
                QP 'Z 'GTQKXKFG FQ
                  /GUUCIG$QZ
 2TÎDC FKGNGPKC RTG GTQ  7YCIC  /$A1-
                GNUG
                  TCKUG
              GPF
           GPF

        Na wydruku 4.4 przedstawiono kompletny kod źródłowy głównego modułu aplikacji,
        wykorzystującej obiekty wyjątków powstałych podczas operacji zmiennopozycyjnego
        dzielenia dwóch liczb.

Wydruk 4.4. Kod głównego modułu Unit_10.pas projektu KODY10Projekt_10.dpr,
wykorzystującego przykładowe klasy wyjątków
           WPKV 7PKVA
           KPVGTHCEG
           WUGU
             9KPFQYU /GUUCIGU 5[U7VKNU 8CTKCPVU
             %NCUUGU )TCRJKEU %QPVTQNU (QTOU
             KCNQIU 5VF%VTNU 'ZV%VTNU

           V[RG
             6(QTO  ENCUU
6(QTO
               $WVVQP 6$WVVQP
               .CDGNGF'FKV 6.CDGNGF'FKV
               .CDGNGF'FKV 6.CDGNGF'FKV
               .CDGNGF'FKV 6.CDGNGF'FKV
               $WVVQP 6$WVVQP
               RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV
               RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV
             RTKXCVG
               ] 2TKXCVG FGENCTCVKQPU _
             RWDNKE
               ] 2WDNKE FGENCTCVKQPU _
             GPF

           XCT
             (QTO 6(QTO

           KORNGOGPVCVKQP

           ] 4
FHO_

           V[RG
              '(NQCVKPI2QKPV'TTQT  ENCUU
'/CVJ'TTQT
           TGUQWTEGUVTKPI
              /UI  $ æF QRGTCELK OKGPPQRQ[E[LP[EJ U 
              /UI  2TÎDC FKGNGPKC RTG GTQ U
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                                             65


          RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
          DGIKP
             VT[
               .CDGNGF'FKV6GZV(NQCV6Q5VT
5VT6Q(NQCV
.CDGNGF'FKV6GZV
                                             5VT6Q(NQCV
.CDGNGF'FKV6GZV
             GZEGRV
               QP 'Z '+PXCNKF1R FQ
                 TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV
/UI ='Z/GUUCIG?
               /GUUCIG$QZ
 $ æF QRGTCELK OKGPPQRQ[E[LP[EJ  7YCIC 
                            /$A1-
               QP 'Z 'GTQKXKFG FQ
                 TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV
/UI ='Z/GUUCIG?
               /GUUCIG$QZ
 2TÎDC FKGNGPKC RTG GTQ  7YCIC  /$A1-
               GNUG
                 TCKUG
             GPF
          GPF
          
          RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
          DGIKP
             #RRNKECVKQP6GTOKPCVG

          GPF
          GPF


        Powy szy algorytm najlepiej jest testować, uruchamiając program wynikowy Pro-
        jekt_10.exe.



Operacje na plikach
        Zarówno w Windows, jak i Linux wszelkie operacje wejścia-wyjścia realizowane są
        za pomocą czytania z plików lub pisania do plików. Wszystkie urządzenia zewnętrzne,
        łącznie z końcówką u ytkownika, traktowane są jako pliki wchodzące w skład szero-
        kiego systemu plików. Niniejszy podrozdział poświęcony jest pewnym aspektom re-
        alizacji przez Delphi ró nego rodzaju operacji na plikach.

        Większość operacji plikowych, pochodzących ze standardowego Pascala, działa rów-
        nie w graficznym środowisku Delphi 6. Przypomnijmy, i standardowo nazwa pliku
        mo e być zmienną typu File lub TextFile. Wywołaniem procedury
          RTQEGFWTG #UUKIP(KNG
XCT ( (KNG0COG UVTKPI

        dokonujemy przypisania nazwy pliku do zmiennej plikowej. Procedura
          RTQEGFWTG 4GUGV
XCT ( = (KNG 4GE5KG 9QTF ? 

        otwiera istniejący plik. Tryb otwarcia pliku zale y od przypisania zmiennej FileMode
        odpowiedniej wartości. Domyślnie przyjmowana jest wartość 2 pozwalająca na od-
        czyt i zapis do pliku. Przypisanie zmiennej FileMode wartości 0 przed wywołaniem
        procedury 4GUGV
 spowoduje otwarcie pliku w trybie tylko do odczytu danych, na-
        tomiast wartości 1 — w trybie tylko do zapisu. Z kolei procedura
          RTQEGFWTG 4GYTKVG
XCT ( (KNG = 4GEUKG 9QTF ?
66                                                                             ABC Delphi 6


        tworzy nowy plik z jednoczesnym jego otwarciem. Plik zamykamy, wywołując pro-
        cedurę:
           RTQEGFWTG %NQUG(KNG
XCT (

        Zaprojektujmy aplikację, której zadaniem będzie wczytanie pliku tekstowego z dysku
        oraz jego ponowne zapisanie po ewentualnej modyfikacji.

        Umieśćmy na formularzu po jednym reprezentancie klas TRichEdit i TCoolBar z karty
        Win32. Dodatkowo uzupełnimy go trzema komponentami reprezentującymi klasę
        TSpeedButton z karty Additional oraz po jednym komponencie z klas TMainMenu
        i TButton z karty Standard oraz TOpenDialog i TSaveDialog z karty Dialogs. Sposób
        rozmieszczenia wymienionych komponentów na formularzu obrazuje rysunek 4.6.

Rysunek 4.6.
Sposób
rozmieszczenia
komponentów
na formularzu
projektu
Projekt_11.dpr




        Zaprojektujmy proste menu, dzięki któremu będziemy mogli utworzyć nowy plik,
        wczytać istniejący i ewentualnie powtórnie zapisać na dysku w wybranym katalogu.
        Aby dostać się do okna słu ącego do tworzenia menu głównego, nale y zaznaczyć
        komponent MainMenu1, a następnie dwukrotnie kliknąć myszką pole Items karty zda-
        rzeń inspektora obiektów (oczywiście, ten sam efekt otrzymamy, klikając dwukrotnie
        samą ikonę na formularzu). Zmieńmy cechę Caption (nagłówek) na Plik, pojawi się
        wówczas nowe pole obok naszej opcji. W ten sposób mo emy tworzyć nawet bardzo
        rozbudowane menu, ale o tym wszystkim jeszcze sobie powiemy w dalszej części ksią ki.
        Teraz jednak wska my pole poni ej i cesze Caption przypiszmy Nowy, następnie
        przejdźmy do karty Events inspektora obiektów i zdarzeniu OnClick przypiszmy
        NewFileClick. Klikając teraz dwa razy pole Nowy, od razu znajdziemy się wewnątrz
        procedury obsługi zdarzenia 0GY(KNG%NKEM
. Powróćmy do okna Form1.MainMenu1
        i przejdźmy ni ej. Następną opcję zatytułujmy Otwórz. W karcie zdarzeń inspektora
        obiektów jej cechę Name zmieńmy na OpenFile, natomiast w karcie zdarzeń zdarze-
        niu OnClick przypiszmy FileOpenClick. Dwukrotnie klikając, dostaniemy się do
        wnętrza procedury obsługi zdarzenia (KNG1RGP%NKEM
. Procedurę tę wypełnimy od-
        powiednim kodem:
           RTQEGFWTG 6(QTO(KNG1RGP%NKEM
5GPFGT 61DLGEV
           XCT
             +P(KNG 6GZV(KNG
             CVC UVTKPI
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                                             67


           DGIKP
             4KEJ'FKV.KPGU%NGCT

             KH 1RGPKCNQI'ZGEWVG VJGP
               DGIKP
                 #UUKIP(KNG
+P(KNG 1RGPKCNQI(KNG0COG
                 4GUGV
+P(KNG
                 YJKNG PQV '1(
+P(KNG FQ
                   DGIKP
                     4GCF.P
+P(KNG CVC
                     4KEJ'FKV.KPGU#FF
CVC
                   GPF
                 %NQUG(KNG
+P(KNG
                 (QTO%CRVKQP 'F[ELC = 
 1RGPKCNQI(KNG0COG 
 ? 
               GPF
           GPF

        W bardzo podobny sposób zaprojektujmy pozostałe części składowe menu, tak jak
        pokazano na rysunku 4.7.

Rysunek 4.7.
Elementy składowe
głównego menu
projektu
Projekt_11.dpr




        W omawianym programie menu Plik, Otwórz będzie zdublowane jednym z przycisków
        TSpeedButton. Najpierw na formularzu umieśćmy komponent TCoolBar, natomiast
        bezpośrednio na nim kolejno komponenty TSpeedButton. Ich cechy Name zmieńmy,
        posługując się inspektorem obiektów, odpowiednio na FileOpen, CopyText, PasteText,
        CutText. Korzystając z właściwości Glyph, rozwińmy opcję TBitmap i umieśćmy na
        ka dym z przycisków TSpeedButton odpowiednią mapę bitową, tak jak przedstawio-
        no na rysunku 4.6. Rysunek taki mo emy wykonać samodzielnie, korzystając z Edy-
        tora Graficznego Delphi (menu Tools, Image Editor), którego obsługa nie ró ni się
        w istocie od zasad obsługi programu graficznego, jakim jest Paint.

        Aby przycisk FileOpen obsługiwał znaną nam ju procedurę obsługi zdarzenia (KNG
        1RGP%NKEM
, wystarczy w karcie zdarzeń inspektora obiektów jego zdarzeniu OnC-
        lick przypisać FileOpenClick().

        Na wydruku 4.5 zamieszczono kompletny kod aplikacji Projekt_11.dpr. W funkcji (QTO
        %TGCVG
 wykorzystaliśmy właściwość InitialDir obiektów TOpenDialog i TSaveDialog.
        Właściwość ta ju w momencie uruchomienia aplikacji pozwala ustalić odpowiednią
        ście kę dostępu do aktualnego katalogu. Z kolei wykorzystując właściwość Filter (ry-
        sunek 4.8) tych obiektów, zapewnimy mo liwość odczytania plików posiadających
        wymagane przez nas rozszerzenia.
68                                                                            ABC Delphi 6


Rysunek 4.8.
Właściwość Filter
klas TOpenDialog
i TSaveDialog




        Dymki podpowiedzi do poszczególnych przycisków uzyskamy, korzystając z właści-
        wości Hint oraz ShowHint. Śledząc poni szy wydruk, zauwa ymy te , e aby kompo-
        nenty TOpenDialog i TSaveDialog, niewidoczne przecie w trakcie uruchomienia
        programu, generowały zdarzenia, polegające na wyświetleniu odpowiednich okien
        dialogowych, nale y w funkcjach odpowiednich zdarzeń skorzystać z metody 'ZGEW
        VG
. Plik zapisujemy na dysku, korzystając z procedury obsługi zdarzenia 5CXG(KNG
        #U%NKEM
.

        Procedury zdarzeniowe %WV6GZV%NKEM
, 2CUVG6GZV%NKEM
, %QR[6GZV%NKEM
, zaim-
        plementowane w odpowiednich przyciskach, zgrupowanych w panelu CoolBar1, ko-
        rzystają z metody 4KEJ'FKV%WV6Q%NKRDQCTF
, 4KEJ'FKV 2CUVG(TQO%NKRDQCTF
,
        4KEJ'FKV%QR[6Q%NKRDQCTF
, zapewniając mo liwość usunięcia fragmentu tekstu,
        wstawienia fragmentu tekstu znajdującego się w schowku (ang. clipboard) oraz skopio-
        wania fragmentu tekstu do schowka. Mo liwe jest równie zaznaczenie całości tekstu
        przy wykorzystaniu metody 4KEJ'FKV5GNGEV#NN
. Aby powtórzyć ostatnio wyko-
        naną (na tekście) operację, nale y skorzystać z metody 4KEJ'FKV*CPFNG#NNQECVGF
,
        którą mo emy ju samodzielnie zastosować.

Wydruk 4.5. Kod głównego modułu Unit_11.pas projektu Projekt_11.dpr
           WPKV 7PKVA
           KPVGTHCEG

           WUGU
             9KPFQYU /GUUCIGU 5[U7VKNU %NCUUGU )TCRJKEU
             %QPVTQNU (QTOU KCNQIU 5VF%VTNU %QO%VTNU
             (KNG%VTN 6QQN9KP $WVVQPU /GPWU

           V[RG
             6(QTO  ENCUU
6(QTO
               $WVVQP 6$WVVQP
               4KEJ'FKV 64KEJ'FKV
               5CXGKCNQI 65CXGKCNQI
               %QQN$CT 6%QQN$CT
               %QR[6GZV 65RGGF$WVVQP
               2CUVG6GZV 65RGGF$WVVQP
               %WV6GZV 65RGGF$WVVQP
               /CKP/GPW 6/CKP/GPW
               1RGPKCNQI 61RGPKCNQI
               5CXG(KNG#U 6/GPW+VGO
               1RGP(KNG 6/GPW+VGO
               0GY(KNG 6/GPW+VGO
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                            69


              %NQUG#RRNKECVKQP 6/GPW+VGO
              RTQEGFWTG $WVVQP%NKEM
5GPFGT 61DLGEV
              RTQEGFWTG (QTO%TGCVG
5GPFGT 61DLGEV
              RTQEGFWTG %QR[6GZV%NKEM
5GPFGT 61DLGEV
              RTQEGFWTG 2CUVG6GZV%NKEM
5GPFGT 61DLGEV
              RTQEGFWTG %WV6GZV%NKEM
5GPFGT 61DLGEV
              RTQEGFWTG (KNG1RGP%NKEM
5GPFGT 61DLGEV
              RTQEGFWTG 0GY(KNG%NKEM
5GPFGT 61DLGEV
              RTQEGFWTG 5CXG(KNG#U%NKEM
5GPFGT 61DLGEV
              RTQEGFWTG (QTO%NQUG
5GPFGT 61DLGEV
                                  XCT #EVKQP 6%NQUG#EVKQP
              RTQEGFWTG (QTO%NQUG3WGT[
5GPFGT 61DLGEV
                                       XCT %CP%NQUG $QQNGCP

            RTKXCVG
              ] 2TKXCVG FGENCTCVKQPU _
              U(KNG 5VTKPI
              RTQEGFWTG (QTO%CRVKQP
EQPUV U(KNGAU 5VTKPI
            RWDNKE
              ] 2WDNKE FGENCTCVKQPU _
            GPF

          XCT
            (QTO 6(QTO

          KORNGOGPVCVKQP

          ] 4
(/_

          TGUQWTEGUVTKPI
            U  7YCIC 
            U  COMPKúEKG CRNKMCELK 
          
          RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
          DGIKP
             ECUG 
/GUUCIG$QZ
 2%JCT
U 2%JCT
U
                   /$A;'501 QT /$A+%1037'56+10 QH
               +A;'5
                  #RRNKECVKQP6GTOKPCVG

               +A01 #DQTV

              GPF
          GPF
          
          RTQEGFWTG 6(QTO(QTO%TGCVG
5GPFGT 61DLGEV
          DGIKP
            1RGPKCNQI+PKVKCNKT  'ZVTCEV(KNG2CVJ
2CTCO5VT

            5CXGKCNQI+PKVKCNKT  1RGPKCNQI+PKVKCNKT
          GPF
          
          RTQEGFWTG 6(QTO%QR[6GZV%NKEM
5GPFGT 61DLGEV
          DGIKP
            4KEJ'FKV%QR[6Q%NKRDQCTF

          GPF
          
          RTQEGFWTG 6(QTO2CUVG6GZV%NKEM
5GPFGT 61DLGEV
          DGIKP
            4KEJ'FKV2CUVG(TQO%NKRDQCTF

          GPF
70                                                                 ABC Delphi 6


     
     RTQEGFWTG 6(QTO%WV6GZV%NKEM
5GPFGT 61DLGEV
     DGIKP
       4KEJ'FKV%WV6Q%NKRDQCTF

     GPF
     
     RTQEGFWTG 6(QTO(QTO%CRVKQP
EQPUV U(KNGAU 5VTKPI
     DGIKP
       U(KNG  U(KNGAU
       %CRVKQP  (QTOCV
 U  U  ='ZVTCEV(KNG0COG
U(KNGAU
                         #RRNKECVKQP6KVNG?
     GPF
     
     RTQEGFWTG 6(QTO(KNG1RGP%NKEM
5GPFGT 61DLGEV
     XCT
       +P(KNG 6GZV(KNG
       CVC UVTKPI
     DGIKP
       4KEJ'FKV.KPGU%NGCT

       KH 1RGPKCNQI'ZGEWVG VJGP
         DGIKP
           #UUKIP(KNG
+P(KNG 1RGPKCNQI(KNG0COG
           4GUGV
+P(KNG
           YJKNG PQV '1(
+P(KNG FQ
             DGIKP
               4GCF.P
+P(KNG CVC
               4KEJ'FKV.KPGU#FF
CVC
             GPF
           %NQUG(KNG
+P(KNG
           (QTO%CRVKQP 'F[ELC = 
 1RGPKCNQI(KNG0COG 
 ? 
         GPF
     GPF
     
     RTQEGFWTG 6(QTO0GY(KNG%NKEM
5GPFGT 61DLGEV
     DGIKP
       (QTO%CRVKQP
 $G PCY[ 
       4KEJ'FKV.KPGU%NGCT

       4KEJ'FKV/QFKHKGF  (#.5'
     GPF
     
     RTQEGFWTG 6(QTO5CXG(KNG#U%NKEM
5GPFGT 61DLGEV
     XCT
       1WV(KNG 6GZV(KNG
     DGIKP
       KH 5CXGKCNQI'ZGEWVG VJGP
         DGIKP
           #UUKIP(KNG
1WV(KNG 5CXGKCNQI(KNG0COG
           4GYTKVG
1WV(KNG
           9TKVG.P
1WV(KNG 4KEJ'FKV6GZV
           %NQUG(KNG
1WV(KNG
           (QTO%CRVKQP CRKUCP[ = 
5CXGKCNQI(KNG0COG
 ? 
           4KEJ'FKV/QFKHKGF  (#.5'
         GPF
     GPF
     
     RTQEGFWTG 6(QTO(QTO%NQUG
5GPFGT 61DLGEV
                                 XCT #EVKQP 6%NQUG#EVKQP
Rozdział 4. ♦ Object Pascal w wydaniu Delphi                                           71


          DGIKP
            #EVKQPEC(TGG
          GPF
          
          RTQEGFWTG 6(QTO(QTO%NQUG3WGT[
5GPFGT 61DLGEV
                                     XCT %CP%NQUG $QQNGCP
          DGIKP
             ECUG 
/GUUCIG$QZ
 2%JCT
U 2%JCT
U
                   /$A;'501 QT /$A+%1037'56+10 QH
               OT;'5
                 %CP%NQUG647'
               OT01
                 %CP%NQUG(#.5'
             GPF
          GPF
          
          GPF




Strukturalna obsługa wyjątków
        Być mo e temat niniejszego podrozdziału mo e się wydawać mało adekwatny w ksią -
        ce traktującej o podstawach programowania w Delphi, jednak przekonamy się, i jest
        on naturalnym rozwinięciem poruszanych uprzednio zagadnień i wcale nie takim trud-
        nym pojęciowo, jak ktoś mógłby sądzić.

        Oprócz wyra enia VT[GZEGRVGPF Delphi mo e posługiwać się równie konstruk-
        cją VT[HKPCNN[GPF. Ró nica pomiędzy nimi polega na tym, i wyra enie VT[
        HKPCNN[ nie jest traktowane przez kompilator jako jawna konstrukcja obsługująca
        wyjątki pozwala natomiast na wykonanie części programu, występującego po słowie
        HKPCNN[, nawet w przypadku wcześniejszego wykrycia jakiegoś wyjątku. W celu wy-
        jaśnienia przedstawionego problemu posłu ymy się przykładem procedury obsługi
        zdarzenia czytającego określony plik, który powinien znajdować się na dysku. Plik
        przeczytamy metodą „znak po znaku” za pomocą zmiennej %JCTCEVGT typu %JCT.
          RTQEGFWTG 6(QTO$WVVQP%NKEM
5GPFGT 61DLGEV
          XCT
            +P(KNG 6GZV(KNG
            (0COG UVTKPI
            %JCTCEVGT %JCT
          DGIKP
            4KEJ'FKV.KPGU%NGCT

            (0COG 2NKMVZV 
            #UUKIP(KNG
+P(KNG (0COG
            VT[
              4GUGV
+P(KNG
              VT[
                YJKNG PQV '1(
+P(KNG FQ
                  DGIKP
                    4GCF
+P(KNG %JCTCEVGT
                    4KEJ'FKV.KPGU#FF
%JCTCEVGT
                  GPF
               HKPCNN[

More Related Content

What's hot

Praktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie IIPraktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie IIWydawnictwo Helion
 
Flash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowyFlash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowyWydawnictwo Helion
 
Kylix. Vademecum profesjonalisty
Kylix. Vademecum profesjonalistyKylix. Vademecum profesjonalisty
Kylix. Vademecum profesjonalistyWydawnictwo Helion
 
Flash 8. Techniki zaawansowane. Klatka po klatce
Flash 8. Techniki zaawansowane. Klatka po klatceFlash 8. Techniki zaawansowane. Klatka po klatce
Flash 8. Techniki zaawansowane. Klatka po klatceWydawnictwo Helion
 
CorelDRAW 11. Vademecum profesjonalisty. Tom 1
CorelDRAW 11. Vademecum profesjonalisty. Tom 1CorelDRAW 11. Vademecum profesjonalisty. Tom 1
CorelDRAW 11. Vademecum profesjonalisty. Tom 1Wydawnictwo Helion
 
PHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowaniaPHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowaniaWydawnictwo Helion
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programistyWydawnictwo Helion
 
Delphi 2005. Ćwiczenia praktyczne
Delphi 2005. Ćwiczenia praktyczneDelphi 2005. Ćwiczenia praktyczne
Delphi 2005. Ćwiczenia praktyczneWydawnictwo Helion
 
Flash MX 2004 ActionScript. Ćwiczenia praktyczne
Flash MX 2004 ActionScript. Ćwiczenia praktyczneFlash MX 2004 ActionScript. Ćwiczenia praktyczne
Flash MX 2004 ActionScript. Ćwiczenia praktyczneWydawnictwo Helion
 
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...Wydawnictwo Helion
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIWydawnictwo Helion
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowaneWydawnictwo Helion
 

What's hot (20)

Po prostu QuarkXPress 5
Po prostu QuarkXPress 5Po prostu QuarkXPress 5
Po prostu QuarkXPress 5
 
Praktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie IIPraktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie II
 
Praktyczny kurs Java
Praktyczny kurs JavaPraktyczny kurs Java
Praktyczny kurs Java
 
JavaScript. Projekty
JavaScript. ProjektyJavaScript. Projekty
JavaScript. Projekty
 
ActionScript. Receptury
ActionScript. RecepturyActionScript. Receptury
ActionScript. Receptury
 
Delphi 7 dla każdego
Delphi 7 dla każdegoDelphi 7 dla każdego
Delphi 7 dla każdego
 
Flash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowyFlash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowy
 
Kylix. Vademecum profesjonalisty
Kylix. Vademecum profesjonalistyKylix. Vademecum profesjonalisty
Kylix. Vademecum profesjonalisty
 
Flash 8. Techniki zaawansowane. Klatka po klatce
Flash 8. Techniki zaawansowane. Klatka po klatceFlash 8. Techniki zaawansowane. Klatka po klatce
Flash 8. Techniki zaawansowane. Klatka po klatce
 
C#. Ćwiczenia
C#. ĆwiczeniaC#. Ćwiczenia
C#. Ćwiczenia
 
CorelDRAW 11. Vademecum profesjonalisty. Tom 1
CorelDRAW 11. Vademecum profesjonalisty. Tom 1CorelDRAW 11. Vademecum profesjonalisty. Tom 1
CorelDRAW 11. Vademecum profesjonalisty. Tom 1
 
PHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowaniaPHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowania
 
CorelDraw X3 PL. Kurs
CorelDraw X3 PL. KursCorelDraw X3 PL. Kurs
CorelDraw X3 PL. Kurs
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programisty
 
Delphi 2005. Ćwiczenia praktyczne
Delphi 2005. Ćwiczenia praktyczneDelphi 2005. Ćwiczenia praktyczne
Delphi 2005. Ćwiczenia praktyczne
 
Flash MX 2004 ActionScript. Ćwiczenia praktyczne
Flash MX 2004 ActionScript. Ćwiczenia praktyczneFlash MX 2004 ActionScript. Ćwiczenia praktyczne
Flash MX 2004 ActionScript. Ćwiczenia praktyczne
 
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
RS 232C - praktyczne programowanie. Od Pascala i C++ do Delphi i Buildera. Wy...
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie II
 
Java 2. Podstawy
Java 2. PodstawyJava 2. Podstawy
Java 2. Podstawy
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowane
 

Viewers also liked

Oracle. Optymalizacja wydajności
Oracle. Optymalizacja wydajnościOracle. Optymalizacja wydajności
Oracle. Optymalizacja wydajnościWydawnictwo Helion
 
Mathcad. Ćwiczenia. Wydanie II
Mathcad. Ćwiczenia. Wydanie IIMathcad. Ćwiczenia. Wydanie II
Mathcad. Ćwiczenia. Wydanie IIWydawnictwo Helion
 
Projektowanie baz danych XML. Vademecum profesjonalisty
Projektowanie baz danych XML. Vademecum profesjonalistyProjektowanie baz danych XML. Vademecum profesjonalisty
Projektowanie baz danych XML. Vademecum profesjonalistyWydawnictwo Helion
 
Joomla! System zarządzania treścią
Joomla! System zarządzania treściąJoomla! System zarządzania treścią
Joomla! System zarządzania treściąWydawnictwo Helion
 
JavaScript. Ćwiczenia praktyczne. Wydanie II
JavaScript. Ćwiczenia praktyczne. Wydanie IIJavaScript. Ćwiczenia praktyczne. Wydanie II
JavaScript. Ćwiczenia praktyczne. Wydanie IIWydawnictwo Helion
 
Microsoft SQL Server 2000. Księga eksperta
Microsoft SQL Server 2000. Księga ekspertaMicrosoft SQL Server 2000. Księga eksperta
Microsoft SQL Server 2000. Księga ekspertaWydawnictwo Helion
 
ASP.NET. Vademecum profesjonalisty
ASP.NET. Vademecum profesjonalistyASP.NET. Vademecum profesjonalisty
ASP.NET. Vademecum profesjonalistyWydawnictwo Helion
 
C# 3.0 i .NET 3.5. Technologia LINQ
C# 3.0 i .NET 3.5. Technologia LINQC# 3.0 i .NET 3.5. Technologia LINQ
C# 3.0 i .NET 3.5. Technologia LINQWydawnictwo Helion
 

Viewers also liked (15)

Oracle. Optymalizacja wydajności
Oracle. Optymalizacja wydajnościOracle. Optymalizacja wydajności
Oracle. Optymalizacja wydajności
 
Mathcad. Ćwiczenia. Wydanie II
Mathcad. Ćwiczenia. Wydanie IIMathcad. Ćwiczenia. Wydanie II
Mathcad. Ćwiczenia. Wydanie II
 
Mandriva. Ćwiczenia
Mandriva. ĆwiczeniaMandriva. Ćwiczenia
Mandriva. Ćwiczenia
 
Projektowanie baz danych XML. Vademecum profesjonalisty
Projektowanie baz danych XML. Vademecum profesjonalistyProjektowanie baz danych XML. Vademecum profesjonalisty
Projektowanie baz danych XML. Vademecum profesjonalisty
 
.NET CLR. Księga eksperta
.NET CLR. Księga eksperta.NET CLR. Księga eksperta
.NET CLR. Księga eksperta
 
Joomla! System zarządzania treścią
Joomla! System zarządzania treściąJoomla! System zarządzania treścią
Joomla! System zarządzania treścią
 
JavaScript. Ćwiczenia praktyczne. Wydanie II
JavaScript. Ćwiczenia praktyczne. Wydanie IIJavaScript. Ćwiczenia praktyczne. Wydanie II
JavaScript. Ćwiczenia praktyczne. Wydanie II
 
VB .NET. Almanach
VB .NET. AlmanachVB .NET. Almanach
VB .NET. Almanach
 
Microsoft SQL Server 2000. Księga eksperta
Microsoft SQL Server 2000. Księga ekspertaMicrosoft SQL Server 2000. Księga eksperta
Microsoft SQL Server 2000. Księga eksperta
 
TCP/IP. Księga eksperta
TCP/IP. Księga ekspertaTCP/IP. Księga eksperta
TCP/IP. Księga eksperta
 
sendmail. Receptury
sendmail. Recepturysendmail. Receptury
sendmail. Receptury
 
ASP.NET. Vademecum profesjonalisty
ASP.NET. Vademecum profesjonalistyASP.NET. Vademecum profesjonalisty
ASP.NET. Vademecum profesjonalisty
 
Windows XP PL. Biblia
Windows XP PL. BibliaWindows XP PL. Biblia
Windows XP PL. Biblia
 
C# 3.0 i .NET 3.5. Technologia LINQ
C# 3.0 i .NET 3.5. Technologia LINQC# 3.0 i .NET 3.5. Technologia LINQ
C# 3.0 i .NET 3.5. Technologia LINQ
 
ABC Photoshop 7
ABC Photoshop 7ABC Photoshop 7
ABC Photoshop 7
 

Similar to ABC Delphi 6

Similar to ABC Delphi 6 (19)

Delphi 2005
Delphi 2005Delphi 2005
Delphi 2005
 
Delphi 2005. 303 gotowe rozwiązania
Delphi 2005. 303 gotowe rozwiązaniaDelphi 2005. 303 gotowe rozwiązania
Delphi 2005. 303 gotowe rozwiązania
 
Po prostu CorelDRAW 11
Po prostu CorelDRAW 11Po prostu CorelDRAW 11
Po prostu CorelDRAW 11
 
Delphi 7. Kompendium programisty
Delphi 7. Kompendium programistyDelphi 7. Kompendium programisty
Delphi 7. Kompendium programisty
 
C++Builder 6. Ćwiczenia
C++Builder 6. ĆwiczeniaC++Builder 6. Ćwiczenia
C++Builder 6. Ćwiczenia
 
Delphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneDelphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowane
 
ArchiCAD 10
ArchiCAD 10ArchiCAD 10
ArchiCAD 10
 
PHP5. Zaawansowane programowanie
PHP5. Zaawansowane programowaniePHP5. Zaawansowane programowanie
PHP5. Zaawansowane programowanie
 
Praktyczny kurs Delphi
Praktyczny kurs DelphiPraktyczny kurs Delphi
Praktyczny kurs Delphi
 
PHP5. Obiekty, wzorce, narzędzia
PHP5. Obiekty, wzorce, narzędziaPHP5. Obiekty, wzorce, narzędzia
PHP5. Obiekty, wzorce, narzędzia
 
Programuje W Delphi I C Builder
Programuje W Delphi I C BuilderProgramuje W Delphi I C Builder
Programuje W Delphi I C Builder
 
Programuje W Delphi I C Builder
Programuje W Delphi I C BuilderProgramuje W Delphi I C Builder
Programuje W Delphi I C Builder
 
Prolog. Programowanie
Prolog. ProgramowanieProlog. Programowanie
Prolog. Programowanie
 
eXtreme programming
eXtreme programmingeXtreme programming
eXtreme programming
 
Visual Basic .NET. Ćwiczenia
Visual Basic .NET. ĆwiczeniaVisual Basic .NET. Ćwiczenia
Visual Basic .NET. Ćwiczenia
 
Mandrake Linux. Ćwiczenia zaawansowane
Mandrake Linux. Ćwiczenia zaawansowaneMandrake Linux. Ćwiczenia zaawansowane
Mandrake Linux. Ćwiczenia zaawansowane
 
Perl. Ćwiczenia
Perl. ĆwiczeniaPerl. Ćwiczenia
Perl. Ćwiczenia
 
Adobe Illustrator 10. Ćwiczenia
Adobe Illustrator 10. ĆwiczeniaAdobe Illustrator 10. Ćwiczenia
Adobe Illustrator 10. Ćwiczenia
 
OpenOffice. Ćwiczenia
OpenOffice. ĆwiczeniaOpenOffice. Ćwiczenia
OpenOffice. Ćwiczenia
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

ABC Delphi 6

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI ABC Delphi 6 KATALOG KSI¥¯EK Autor: Andrzej Daniluk KATALOG ONLINE ISBN: 83-7197-504-X Format: B5, stron: 136 ZAMÓW DRUKOWANY KATALOG Przyk³ady na ftp: 1002 kB TWÓJ KOSZYK DODAJ DO KOSZYKA Delphi 6 to kolejna wersja popularnego rodowiska programistycznego firmy Borland, s³u¿¹cego do szybkiego tworzenia aplikacji za pomoc¹ jêzyka ObjectPascal. W Delphi napisano ju¿ wiele profesjonalnych aplikacji, co nie oznacza, i¿ jest ono rodowiskiem CENNIK I INFORMACJE wy³¹cznie dla zawodowców. Wrêcz przeciwnie, dziêki prostocie obs³ugi i zaletom wzorowanego na Pascalu jêzyka ObjectPascal, jest ono doskona³ym narzêdziem dla ZAMÓW INFORMACJE pocz¹tkuj¹cych programistów, tak¿e dla tych, którzy nie mieli wcze niej wiele O NOWO CIACH wspólnego z programowaniem obiektowym. Dla nich w³a nie przeznaczona jest ta ksi¹¿ka omawiaj¹ca: ZAMÓW CENNIK • Podstawy programowania w jêzyku ObjectPascal • Projektowanie zorientowane obiektowo (OOD) • Zintegrowane rodowisko programistyczne CZYTELNIA • ObjectPascal w wydaniu Delphi 6 • Biblioteki VCL i CLX FRAGMENTY KSI¥¯EK ONLINE • Tworzenie w³asnych komponentów • Biblioteki DLL Pomoc¹ w zg³êbianiu tajników Delphi 6 jest 19 kompletnych przyk³adowych projektów, ilustruj¹cych najwa¿niejsze æwiczenia. Po przeczytaniu „ABC Delphi 6”, bêdziesz móg³ samodzielnie pisaæ aplikacje dzia³aj¹ce w rodowisku Windows. Ksi¹¿ka stanowi tak¿e doskona³y wstêp do innych, bardziej zaawansowanych pozycji, omawiaj¹cych Delphi. Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
  • 2. Spis treści Wstęp ............................................................................................... 5 Rozdział 1. Elementarz Object Pascala................................................................. 7 Moduły ................................................................................................................................7 Program główny ..................................................................................................................8 Stałe...................................................................................................................................10 Zmienne.............................................................................................................................11 Typy całkowite..................................................................................................................12 Typy rzeczywiste...............................................................................................................12 Typ Currency.....................................................................................................................13 Typy logiczne....................................................................................................................13 Typy znakowe ...................................................................................................................13 Typy łańcuchowe ..............................................................................................................14 Literały łańcuchowe ..........................................................................................................14 Tablice...............................................................................................................................15 Rekordy .............................................................................................................................16 Typ okrojony .....................................................................................................................18 Typ mnogościowy .............................................................................................................18 Typ wyliczeniowy .............................................................................................................19 Typ Variant .......................................................................................................................19 Operatory...........................................................................................................................20 Wskazania i adresy............................................................................................................21 Instrukcje sterujące przebiegiem programu ......................................................................22 Instrukcja warunkowa If...Then ..................................................................................22 Instrukcja warunkowa Case...Of.................................................................................23 Instrukcja iteracyjna Repeat...Until ............................................................................24 Instrukcja iteracyjna While...Do .................................................................................25 Instrukcja iteracyjna For...To...Do..............................................................................26 Procedura przerwania programu Break ......................................................................26 Procedura przerwania programu Exit .........................................................................27 Procedura wyjścia z programu Halt............................................................................27 Procedura zatrzymania programu RunError ...............................................................27 Procedura kontynuacji programu Continue ................................................................28 Procedury ..........................................................................................................................28 Parametry formalne.....................................................................................................29 Funkcje ..............................................................................................................................31 Moduły na powa nie .........................................................................................................32 Podsumowanie ..................................................................................................................34
  • 3. 4 ABC Delphi 6 Rozdział 2. Projektowanie obiektowe OOD ......................................................... 35 Klasa ...........................................................................................................................35 Obiekt..........................................................................................................................35 Metody ........................................................................................................................36 Widoczność obiektów.................................................................................................36 Współdziałanie obiektów............................................................................................36 Implementacja obiektu................................................................................................36 Dziedziczenie..............................................................................................................36 Podsumowanie ..................................................................................................................36 Rozdział 3. Środowisko programisty — IDE ........................................................ 37 Biblioteka VCL .................................................................................................................39 Karta Standard ............................................................................................................40 Karta Additional..........................................................................................................41 Karta Win32................................................................................................................43 Karta System...............................................................................................................45 Karta Dialogs ..............................................................................................................46 Biblioteka CLX .................................................................................................................47 Karta Additional..........................................................................................................48 Karta Dialogs ..............................................................................................................48 Podsumowanie ..................................................................................................................48 Rozdział 4. Object Pascal w wydaniu Delphi ....................................................... 49 Formularz ..........................................................................................................................49 Zdarzenia...........................................................................................................................51 Wykorzystujemy własne funkcje i procedury...................................................................56 Metody przecią ane...........................................................................................................58 Wyjątki ..............................................................................................................................60 Operacje na plikach...........................................................................................................65 Strukturalna obsługa wyjątków.........................................................................................71 Tablice otwarte..................................................................................................................72 Tablice dynamiczne...........................................................................................................73 Typ OleVariant..................................................................................................................74 Rekordy w Delphi .............................................................................................................76 Podsumowanie ..................................................................................................................83 Rozdział 5. Biblioteka VCL................................................................................. 85 Komponenty TActionList, TImageList, TOpenDialog, TSaveDialog i TMainMenu ......85 Komponenty TActionManager i TActionMainMenuBar .................................................91 Komponenty TFrame, TSpinEdit i TStaticText................................................................96 Hierarchia własności obiektów. Właściciele i rodzice....................................................100 Konstruktor i Destruktor ...........................................................................................102 Podsumowanie ................................................................................................................103 Rozdział 6. Biblioteka CLX............................................................................... 105 Komponenty TTimer i TLCDNumber ............................................................................105 Podsumowanie ................................................................................................................109 Rozdział 7. Tworzymy własne komponenty ....................................................... 111 Podsumowanie ................................................................................................................117 Rozdział 8. Biblioteki DLL ................................................................................ 119 Podsumowanie ................................................................................................................126 Skorowidz...................................................................................... 127
  • 4. Rozdział 4. Object Pascal w wydaniu Delphi Rozdział ten poświęcony jest omówieniu praktycznych sposobów wykorzystania po- znanych wcześniej elementów języka Object Pascal w graficznym środowisku Delphi 6. Zapoznamy się tutaj m. in. z pojęciem formularza, wyjątku czy procedury obsługi zda- rzenia. Poznamy równie metody wykorzystania w aplikacji własnych funkcji i proce- dur. Zastosowanie omówionych elementów Delphi zostanie zilustrowane odpowied- nimi ćwiczeniami. Formularz Formularz jest pierwszym obiektem, z którym spotykamy się, rozpoczynając pisanie aplikacji. Po dwukrotnym kliknięciu w obszarze formularza dostajemy się do okna edycji kodu modułu Unit1.pas, który pokazany jest na rysunku 4.1. Object Pascal oferuje nam słowo kluczowe ENCUU, pozwalające na tworzenie obiektów. Przykładowa definicja klasy formularza wygląda następująco: V[RG 6(QTO ENCUU 6(QTO RTQEGFWTG (QTO%TGCVG 5GPFGT 61DLGEV RTKXCVG ] 2TKXCVG FGENCTCVKQPU _ RWDNKE ] 2WDNKE FGENCTCVKQPU _ GPF Zdefiniowana klasa dziedziczy własności bazowej klasy formularza TForm, natomiast sam formularz, traktowany jako zmienna obiektowa, deklarowany jest jako: XCT (QTO 6(QTO
  • 5. 50 ABC Delphi 6 Rysunek 4.1. Okno edycji kodu głównego modułu aplikacji Z zapisu tego odczytamy, i formularz jest zmienną obiektową, natomiast nazwa kla- sy stała się nowym specyfikatorem typu danych. W definicji klasy mo emy zauwa yć procedurę: RTQEGFWTG (QTO%TGCVG 5GPFGT 61DLGEV Delphi odpowiednio inicjuje formularz (tylko jeden raz), kiedy jest on tworzony po raz pierwszy. Sender jest pewną zmienną typu TObject, wołaną przez wartość. W rze- czywistości Sender reprezentuje pewną właściwość, polegającą na tym, i ka dy obiekt łącznie z formularzem (oraz ka dy obiekt VCL i CLX) musi być w pewien sposób poinformowany o przyszłym przypisaniu mu pewnego zdarzenia (w przypad- ku formularza zdarzenie to polega na jego inicjalizacji). TObject jest bezwzględnym przodkiem wszystkich komponentów i obiektów VCL oraz CLX i umieszczony jest na samym szczycie hierarchii obiektów. Z rysunku 4.1 mo emy odczytać, i standardowa definicja klasy składa się z kilku czę- ści. Sekcja public słu y do deklarowania funkcji i procedur (czyli metod) oraz zmien- nych (zwanych polami), które w przyszłości mogą być udostępniane innym. Zasadni- czą ró nicą pomiędzy metodami a zwykłymi funkcjami czy procedurami jest to, e ka da metoda posiada niejawny parametr Self, wskazujący na obiekt będący przed- miotem wywołania tej metody. Sekcję public często nazywamy interfejsem obiektu. Sekcja private przeznaczona jest dla pól i metod widzianych jedynie wewnątrz klasy.
  • 6. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 51 Oprócz elementów wymienionych, definicja klasy mo e posiadać jeszcze sekcje pro- tected oraz published. W części protected mo na definiować pola i metody widoczne dla macierzystej klasy i klas po niej dziedziczących. Deklaracje zawarte w sekcji pu- blished (publikowanej) pełnią taką samą rolę, jak deklaracje umieszczone w sekcji public (publicznej). Ró nica pomiędzy nimi polega na tym, i te pierwsze nie tworzą tzw. informacji czasu wykonania. Zdarzenia Zdarzenie (ang. event) określane jest jako zmiana, która występuje w aktualnym sta- nie obiektu i jest źródłem odpowiednich komunikatów, przekazywanych do aplikacji lub bezpośrednio do systemu. Reakcja obiektu na wystąpienie zdarzenia udostępniana jest aplikacji poprzez procedurę obsługi zdarzeń (ang. event procedure) będącą wy- dzieloną częścią kodu. Rolę zdarzeń w aplikacji najlepiej jest prześledzić, wykonując praktyczne ćwiczenie. Tradycyjnie ju zało ymy na dysku nowy katalog. Po uruchomieniu Delphi 6 znany- mi nam ju poleceniami menu zapiszmy w nim główny moduł aplikacji, który na- zwiemy Unit_08.pas. Zapiszmy równie projekt aplikacji pod nazwą Projekt_08.dpr. Rozmiary formularza ustalimy, korzystając z cech Height (wysokość) i Width (szero- kość), znajdujących się w karcie właściwości (Properties) Inspektora Obiektów. Je eli chcemy, aby po uruchomieniu formularz nie „rozpływał” się po ekranie w odpowie- dzi na kliknięcie pola maksymalizacji, w Inspektorze Obiektów rozwińmy cechę Con- straints (ograniczenie) i we właściwe miejsca wpiszmy ądane rozmiary formularza (w pikselach), tak jak pokazano na rysunku 4.2. Rysunek 4.2. Ograniczenie rozmiarów formularza Przejdźmy następnie do cechy Position i wybierzmy poScreenCenter. Wybrane przy- pisanie spowoduje, e w momencie uruchomienia aplikacji formularz pozostanie w centrum ekranu (ale nie pulpitu poDesktopCenter); je eli oczywiście w Inspektorze Obiektów cechy Align (zakotwiczenie) nie ustawiliśmy inaczej ni w pozycji alNone. Na tak przygotowanym formularzu umieśćmy teraz dwa komponenty reprezentujące klasę TButton z karty Standard. Korzystając z Inspektora Obiektów oraz z karty wła- ściwości, cechy Caption przycisków Button1 oraz Button2 zmieńmy odpowiednio na Zamknij i Tekst. Znak , który występuje w nazwach przycisków, spowoduje, e litera, występująca bezpośrednio za nim, stanowić będzie klawisz szybkiego dostępu do procedury obsługi wybranego zdarzenia. W podobny sposób mo emy zmienić ce- chy Font wybranych przycisków. Dla ka dego z przycisków stworzymy procedurę obsługi odpowiedniego zdarzenia. Klikając dwukrotnie przycisk Zamknij lub w wido- ku drzewa obiektów (Object TreeView) odpowiednio oznaczony komponent, dosta- niemy się do wnętrza właściwej procedury obsługi zdarzenia:
  • 7. 52 ABC Delphi 6 RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP GPF Ju w tym miejscu mo emy zauwa yć, i w definicji klasy program Delphi wygene- rował automatycznie deklarację przycisku oraz deklarację procedury obsługującego go zdarzenia. Korzystając z notacji kropkowej, kompilator automatycznie został poin- formowany, do której klasy nale y wywoływana procedura. U ycie notacji kropkowej stanowi informację dla kompilatora, e przykładowa pro- cedura Button1Click() nale y do przykładowej klasy TForm1 (jest metodą zdefinio- waną w klasie TForm1). Nale y zawsze pamiętać, i szkielety procedur obsługi odpowiednich zdarzeń, np. ta- kich jak $WVVQP%NKEM , zostaną automatycznie wygenerowane przez Delphi w od- powiedzi na dwukrotne kliknięcie danego przycisku. W adnym wypadku procedur tych nie nale y wpisywać samodzielnie. Omawianą procedurę obsługi zdarzenia wypełnimy przedstawionym poni ej kodem, co spowoduje, e po naciśnięciu wybranego przycisku aplikacja zostanie zamknięta. RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP #RRNKECVKQP6GTOKPCVG GPF Ka dy standardowy program Delphi (oparty na formularzu) zawiera pewną zmienną globalną o nazwie Application typu TApplication. W czasie tworzenia nowego pro- jektu Delphi konstruuje obiekt aplikacji i przypisuje mu właśnie zmienną Application. Obiekty klasy TApplication przechowują informacje odnośnie zasad współpracy apli- kacji z systemem operacyjnym. Informacje te dotyczą np. rozpoczynania i kończenia działania aplikacji czy tworzenia okna głównego programu. Istnieje wiele metod kla- sy TApplication. Jedną z nich jest 6GTOKPCVG , umo liwiająca zamknięcie aplikacji. Zajmiemy się teraz zaprojektowaniem procedury obsługi zdarzenia przycisku Button2, który nazwaliśmy Tekst. Po kliknięciu tego przycisku, bezpośrednio na formularzu zostanie wyświetlony prosty tekst. Skorzystamy z tego, i formularz, będący w istocie te komponentem, posiada swoje własne płótno (ang. canvas), reprezentowane przez klasę TCanvas, posiadającą właściwość Canvas. Procedura obsługi naszego zdarzenia będzie wyglądać następująco: RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP %CPXCU(QPV%QNQTEN$NWG %CPXCU(QPV*GKIJV %CPXCU6GZV1WV %NKGPV*GKIJV FKX %NKGPV9KFVJ FKX 2KGTYUC CRNKMCELC Y GNRJK GPF Powy szy przykład ilustruje sposób odwoływania się do obszaru płótna poprzez wła- ściwość Canvas klasy TCanvas z wykorzystaniem właściwości czcionka (Font). Za- stosowana metoda 6GZV1WV : RTQEGFWTG 6GZV1WV : ; +PVGIGT EQPUV 6GZV UVTKPI
  • 8. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 53 pozwala na umieszczenie dowolnego tekstu identyfikowanego przez stałą Text w miejscu formularza o współrzędnych X, Y (odległość liczona jest w pikselach, na- tomiast lewy górny róg formularza posiada współrzędne 0, 0). Mo e równie zdarzyć się i taka sytuacja, w której zechcemy zamknąć formularz, ko- rzystając bezpośrednio z jego pola zamknięcia (por. rysunek 3.2). Zamykając w ten sposób działającą aplikację, nale y mieć na uwadze fakt, i w Windows 9x bezpo- średni sposób zamknięcia działającego programu mo e nie działać w pełni poprawnie (nie dotyczy to Win 2000, NT i XP). Aby mieć pewność, e w momencie zamknięcia aplikacji wszystkie jej zasoby zostaną prawidłowo zwolnione, skorzystamy ze zda- rzenia 1P%NQUG. Klikając (tylko raz) w obszar formularza w inspektorze obiektów, przejdźmy do zakładki Events (zdarzenia). Zdarzenie 1P%NQUG określmy jako (QTO%NQ UG (rysunek 4.3) i potwierdźmy klawiszem Enter. Rysunek 4.3. Zdarzenie OnClose W ten sposób Delphi automatycznie wygeneruje procedurę obsługi zdarzenia (QTO%NQUG 5GPFGT 61DLGEV XCT #EVKQP 6%NQUG#EVKQP Zmiennej #EVKQP (akcja) mo na tutaj przypisać jeden z elementów typu wyliczeniowego V[RG 6%NQUG#EVKQP EC0QPG EC*KFG EC(TGG EC/KPKOKG gdzie: EC0QPG oznacza, e formularz nie zostanie zamknięty; EC*KFG oznacza, e formularz nie zostanie zamknięty, lecz ukryty; EC(TGG oznacza, e formularz zostanie zamknięty z jednoczesnym zwolnieniem wszystkich zasobów pamięci, z których aktualnie korzysta; EC/KPKOKG oznacza, e formularz zostanie zminimalizowany.
  • 9. 54 ABC Delphi 6 Procedurę obsługi zdarzenia (QTO%NQUG wypełnimy następującym kodem: RTQEGFWTG 6(QTO(QTO%NQUG 5GPFGT 61DLGEV XCT #EVKQP 6%NQUG#EVKQP DGIKP ECUG /GUUCIG$QZ COMPKúEKG CRNKMCELK ! 7YCIC /$A;'501 QT /$A+%1037'56+10 QH +A;'5 #EVKQP EC(TGG +A01 #EVKQP EC0QPG GPF GPF Skorzystaliśmy tutaj z omawianej wcześniej instrukcji %CUG1H oraz z funkcji /GU UCIG$QZ , wyświetlającej odpowiedni komunikat w okienku dialogowym. Projekt aplikacji Projekt_08.dpr, wykorzystującej omawiane zdarzenia, znajduje się w katalogu Kody08, natomiast na wydruku 4.1 zamieszczono kod źródłowy modułu Unit_08.pas. Wydruk 4.1. Moduł Unit_08.pas projektu Projekt_08.dpr WPKV 7PKVA KPVGTHCEG WUGU 9KPFQYU /GUUCIGU 5[U7VKNU %NCUUGU )TCRJKEU %QPVTQNU (QTOU $WVVQPU 5VF%VTNU V[RG 6(QTO ENCUU 6(QTO $WVVQP 6$WVVQP $WVVQP 6$WVVQP RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG (QTO%NQUG 5GPFGT 61DLGEV XCT #EVKQP 6%NQUG#EVKQP RTKXCVG ] 2TKXCVG FGENCTCVKQPU _ RWDNKE ] 2WDNKE FGENCTCVKQPU _ GPF XCT (QTO 6(QTO KORNGOGPVCVKQP ] 4
  • 10. (/_ RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP
  • 11. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 55 %CPXCU(QPV%QNQTEN$NWG %CPXCU(QPV*GKIJV %CPXCU6GZV1WV %NKGPV*GKIJV FKX %NKGPV9KFVJ FKX 2KGTYUC CRNKMCELC Y GNRJK GPF RTQEGFWTG 6(QTO(QTO%NQUG 5GPFGT 61DLGEV XCT #EVKQP 6%NQUG#EVKQP DGIKP ECUG /GUUCIG$QZ COMPKúEKG CRNKMCELK ! 7YCIC /$A;'501 QT /$A+%1037'56+10 QH +A;'5 #EVKQP EC(TGG +A01 #EVKQP EC0QPG GPF GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP #RRNKECVKQP6GTOKPCVG GPF GPF Zajrzyjmy teraz do katalogu, w którym został zapisany nasz projekt. Oprócz plików, wymienionych w rozdziale 1, pojawiły się tam 3 dodatkowe: .dpp — plik Diagram Delphi Page. Mo na w nim zapisać diagramy będące wizualizacją logicznych relacji pomiędzy widocznymi i niewidocznymi komponentami, składającymi się na całość projektu. Relacje takie mo na uzyskać, korzystając z zakładki Diagram. .dfm — plik zawierający opis formularza. Dyrektywa kompilatora ] 4_ lub ] 4'5174%'_ dołącza do projektu zewnętrzny plik zasobów, zawierający opis formularza. Plik zasobów jest włączany do końcowego pliku wynikowego .exe w czasie łączenia projektu. .res — plik zasobów Windows. adnego z nich nie powinnyśmy utracić. Plik projektu Delphi .dpr środowiska graficznego ró ni się nieco od swojego odpowied- nika aplikacji konsolowych. Programy Delphi są bardzo krótkie. Wynika to z faktu, i aplikacje z interfejsem graficznym zazwyczaj wywołują procedurę inicjalizacyjną #R RNKECVKQP+PKVKCNKG , następnie tworzony jest formularz (lub formularze) Applica- tion.CreateForm(TForm1,Form1), w którym uruchamiane są procedury obsługi zdarzeń #RRNKECVKQP4WP . Aplikacja zamykana jest poprzez główny formularz w odpowiedzi na wywołanie procedury obsługi odpowiedniego zdarzenia #RRNKECVKQP6GTOKPCVG (patrz wydruk 4.1). Typowy plik kodu źródłowego projektu Delphi przedstawiony jest na wydruku 4.2.
  • 12. 56 ABC Delphi 6 Wydruk 4.2. Typowy plik programu Delphi RTQITCO 2TQLGMVA WUGU (QTOU 7PKVA KP 7PKVARCU ](QTO_ ] 4
  • 13. 4'5_ DGIKP #RRNKECVKQP+PKVKCNKG #RRNKECVKQP%TGCVG(QTO 6(QTO (QTO #RRNKECVKQP4WP GPF Deklaracja WUGU tworzy listę modułów wchodzących w skład programu. Nazwa modułu mo e być poprzedzona dyrektywą KP, specyfikującą nazwę pliku. Moduły bez dyrek- tywy KP są modułami bibliotecznymi i nie stanowią części kodu źródłowego projektu. Wykorzystujemy własne funkcje i procedury Własne procedury i funkcje mo emy umieszczać w programie Delphi na parę sposobów. Zapoznamy się teraz z dwoma sposobami — najprostszymi i najczęściej stosowanymi. Definicję funkcji lub procedury umieszczamy bezpośrednio w kodzie programu w sekcji implementacji modułu: XCT (QTO 6(QTO KORNGOGPVCVKQP ] 4
  • 14. FHO_ RTQEGFWTG 2QYGTVQ0 XCT Z +PVGIGT [ +PVGIGT XCT K +PVGIGT DGIKP HQT K VQ [ FQ DGIKP
  • 15. Z (QTO/GOQ.KPGU#FF +PV6Q5VT Z FQ RQVúIK +PV6Q5VT K +PV6Q5VT GPF GPF Wyświetlanie kolejnych liczb całkowitych, będących kolejnymi potęgami całkowitego parametru x, dokonywane jest w komponencie edycyjnym Memo1, będącym reprezen- tantem klasy TMemo z karty Standard. Poniewa nasza procedura nie została zadeklaro-
  • 16. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 57 wana w definicji klasy formularza, więc odwołanie się w jej wnętrzu do odpowiedniego komponentu edycyjnego wymaga, aby jawnie wskazać, i komponent ten nale y do formularza Form1. Wyświetlanie kolejnych liczb całkowitych dokonywane jest za po- średnictwem funkcji +PV6Q5VT formatującej wartość liczbową (wartość w postaci liczby całkowitej) na odpowiedni łańcuch znaków. Du o subtelniejszym (ale nie zawsze opłacalnym sposobem) jest uczynienie funkcji lub procedury jawnym obiektem klasy formularza TForm1. Nale y wówczas definicję nagłówkową funkcji lub procedury uzupełnić o nazwę klasy, do której ma przynale- eć. Musimy ponadto omawiane funkcje lub procedury zadeklarować w definicji klasy w jednej z sekcji, np. V[RG 6(QTO ENCUU 6(QTO $WVVQP 6$WVVQP /GOQ 6/GOQ $WVVQP 6$WVVQP $WVVQP 6$WVVQP RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTKXCVG ] 2TKXCVG FGENCTCVKQPU _ RTQEGFWTG 2QYGTVQ0 Z [ %CTFKPCN RWDNKE ] 2WDNKE FGENCTCVKQPU _ GPF XCT (QTO 6(QTO KORNGOGPVCVKQP ] 4
  • 17. FHO_ RTQEGFWTG 6(QTO2QYGTVQ0 Z [ %CTFKPCN XCT K %CTFKPCN DGIKP HQT K VQ [ FQ DGIKP
  • 18. Z /GOQ.KPGU#FF +PV6Q5VT Z FQ RQVúIK +PV6Q5VT K +PV6Q5VT GPF GPF Korzystając z tego sposobu definiowania własnej funkcji lub procedury, mo emy we- wnątrz nich bez problemów odwoływać się do innych obiektów formularza. Wszystkie własności, cechy, zdarzenia i metody właściwe tym obiektom będą widoczne w na- szej funkcji lub procedurze.
  • 19. 58 ABC Delphi 6 Metody przeciążane Chocia mo na przypuszczać, i pojęcia procedur lub funkcji przecią anych (przeła- dowywanych) nale y wprowadzać na bardziej zaawansowanym kursie programowa- nia, to jednak wydaje się, i w sytuacji kiedy środowiska programistyczne stają się coraz bardziej rozbudowane, powinniśmy posiadać pewne wiadomości na ten temat. Jest to szczególnie wa ne w momencie, kiedy zechcemy samodzielnie posługiwać się plikami pomocy. Pisząc programy w Delphi, mo emy zadeklarować wiele funkcji czy procedur o tej samej nazwie, ale o ró nej postaci argumentów. W momencie wywołania danej proce- dury czy funkcji kompilator powinien je rozró niać. Do deklaracji procedur (funkcji) przeładowywanych słu y dyrektywa QXGTNQCF (przeładowanie). Najlepszym (i jedy- nym) sposobem zapoznania się z ideą funkcji (procedur) przeładowywanych jest samo- dzielne napisanie prostej aplikacji, w której funkcje te zostaną wykorzystane. Stworzy- my program wykorzystujący znane nam ju procedury obliczające kolejne całkowite potęgi wybranej liczby, ale w ten sposób, by jednocześnie mo na było korzystać z pro- cedur, których parametry wołane są przez zmienną i przez wartość. Przy okazji zapo- znamy się z podstawowymi własnościami komponentu edycyjnego TMemo. W skład formularza projektu Kody09Projekt_09.dpr będą wchodzić trzy przyciski będące reprezentantami klasy TButton oraz jeden reprezentant klasy TMemo. Umie- śćmy je na formularzu w sposób pokazany na rysunku 4.4. W inspektorze obiektów właściwość Caption formularza Form1 zmieńmy na Projekt_09. Rysunek 4.4. Podstawowe elementy formularza projektu Projekt_ 09.dpr W inspektorze obiektów własności Caption komponentów Button1, Button2 i Button3 zmieńmy odpowiednio na Oblicz — wywołanie przez zmienną, Zamknij i Oblicz — wywołanie przez wartość. Mo na równie skorzystać z ich własności Font, aby dobrać odpowiednią czcionkę. Nale y oczywiście pamiętać o uprzednim zaznaczeniu wybranego komponentu, np. poprzez pojedyncze kliknięcie go myszą. Poniewa nale y się spodziewać, i w komponencie edycyjnym Memo1 będą wyświe- tlane kolejne liczby, musimy zadbać o mo liwość pionowego przewijania zawartości tego komponentu. W tym celu w inspektorze obiektów jego właściwość ScrollBars ustalmy jako ssVertical. Je eli zechcemy, aby zawartość komponentu mogła być prze- wijana zarówno w pionie, jak i w poziomie, wystarczy wybrać ssBoth.
  • 20. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 59 W momencie wybrania reprezentanta klasy TMemo, w oknie edycji zobaczymy jego nazwę. Aby nie była ona wyświetlana, nale y skorzystać z własności Lines i poprzez TStrings w oknie edytora skasować napis Memo1. Kiedy wszystkie potrzebne kom- ponenty zostaną ju rozmieszczone na formularzu, mo emy jego rozmiary odpowied- nio do nich dopasować. W tym celu w inspektorze obiektów jego własności AutoSize wystarczy przypisać wartość True. Po tych wstępnych czynnościach nie pozostaje nam nic innego jak zaimplementować w programie dwie procedury 2QYGT:VQ; obliczające kolejne całkowite potęgi Y wy- branej liczby całkowitej X. Musimy równie wypełnić treści procedur odpowiednich zdarzeń, podobnie jak zostało to pokazane na wydruku 4.3. Wydruk 4.3. Kod głównego modułu Unit_09.pas projektu Projekt_09.dpr, wykorzystującego przecią ane procedury WPKV 7PKVA KPVGTHCEG WUGU 9KPFQYU /GUUCIGU 5[U7VKNU 8CTKCPVU %NCUUGU )TCRJKEU %QPVTQNU (QTOU KCNQIU 5VF%VTNU V[RG 6(QTO ENCUU 6(QTO $WVVQP 6$WVVQP /GOQ 6/GOQ $WVVQP 6$WVVQP $WVVQP 6$WVVQP RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTKXCVG ] 2TKXCVG FGENCTCVKQPU _ RTQEGFWTG 2QYGT:VQ; Z [ %CTFKPCNQXGTNQCF RTQEGFWTG 2QYGT:VQ; XCT Z [ +PVGIGTQXGTNQCF RWDNKE ] 2WDNKE FGENCTCVKQPU _ GPF XCT (QTO 6(QTO KORNGOGPVCVKQP ] 4
  • 21. FHO_ RTQEGFWTG 6(QTO2QYGT:VQ; XCT Z [ +PVGIGT XCT K +PVGIGT DGIKP HQT K VQ [ FQ DGIKP
  • 22. Z
  • 23. 60 ABC Delphi 6 /GOQ.KPGU#FF +PV6Q5VT Z FQ RQVúIK +PV6Q5VT K +PV6Q5VT GPF GPF RTQEGFWTG 6(QTO2QYGT:VQ; Z [ %CTFKPCN XCT K %CTFKPCN DGIKP HQT K VQ [ FQ DGIKP
  • 24. Z /GOQ.KPGU#FF +PV6Q5VT Z FQ RQVúIK +PV6Q5VT K +PV6Q5VT GPF GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV XCT C D +PVGIGT DGIKP /GOQ%NGCT C D 2QYGT:VQ; C D Y[YQ CPKG RTG OKGPPæ GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP /GOQ%NGCT 2QYGT:VQ; Y[YQ CPKG RTG YCTVQ è GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP #RRNKECVKQP6GTOKPCVG GPF GPF Program skompilujemy, korzystając z klawisza F9 lub opcji menu Run, Run. Śledząc kod programu, mo emy te zauwa yć, i w celu skasowania zawartości komponentu Memo1 posługujemy się metodą %NGCT . Wyjątki Podobnie jak w przypadku metod przecią anych, ktoś mógłby powątpiewać w celowość wprowadzania pojęcia wyjątku w kursie programowania, przeznaczonym dla osób mniej zaawansowanych. Nale y jednak zdawać sobie sprawę z faktu, i wyjątki jako obiekty pełnią bardzo wa ną rolę we wszystkich współczesnych systemach operacyj- nych oraz środowiskach programowania i pewne własności kompilatora, które jeszcze do niedawna uwa ano za bardzo zaawansowane, obecnie ju takimi być przestają.
  • 25. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 61 Wyjątki pozwalają osobie piszącej kod na uwzględnienie sytuacji, w której program w jakimś momencie wykonywania mo e ulec niekontrolowanemu zakończeniu. Wy- jątek mo e być umiejscowiony w dowolnej metodzie. W Delphi podstawową klasą, zajmującą się obsługą wyjątków, jest Exception (ang. wyjątek). Klasa ta wywodzi się bezpośrednio z klasy TObject. Z kolei z Exception (chodź nie bezpośrednio) wywodzi się klasa EMathError, będąca z kolei nadklasą (klasą bazową) dla zbioru niezwykle u ytecznych klas, obsługujących wyjątki, powstałe przy wykryciu przez kompilator błędów operacji matematycznych na liczbach zmiennopozycyjnych (liczbach dzie- siętnych). Wyjątki dziedziczące z EMathError zostały przedstawione w tabeli 4.1. Tabela 4.1. Klasy dziedziczące z EMathError Klasa wyjątku Znaczenie '+PXCNKF#TIWOGPV Przekroczenie zakresu zmienności zadeklarowanego typu danych '+PXCNKF1R Nieprawidłowa operacja zmiennoprzecinkowa '1XGTHNQY Przekroczenie zakresu typu zmiennoprzecinkowego '7PFGTHNQY Wartość typu zmiennoprzecinkowego jest zbyt mała 'GTQKXKFG Zmiennoprzecinkowe dzielenie przez zero Delphi posługuje się dwoma wyra eniami przeznaczonymi do obsługi wyjątków. Z pierwszym, a zarazem podstawowym z nich, zapoznamy się obecnie. Wyra enie VT[GZEGRVGPF uaktywnia procedurę obsługi wyjątku przejmującą kontrolę nad dalszym wykonywaniem programu, w przypadku gdy zostanie wykonana jakaś nie- dozwolona operacja. Jako przykład niech nam posłu y prosty algorytm wykonujący operację zmiennopozycyjnego dzielenia dwóch liczb, które wprowadzimy do odpo- wiednich komponentów edycyjnych. Bez trudu mo emy przewidzieć, i wyjątek po- wstanie przy próbie wykonania dzielenia na znakach nie będących liczbami lub przy próbie dzielenia przez zero. Zaprojektujmy bardzo prostą aplikację, wykonującą zmiennopozycyjne dzielenie dwóch liczb, wprowadzanych z klawiatury do dwóch nowoczesnych komponentów edycyj- nych LabeledEdit1 i LabeledEdit2. Wynik będzie przechowywany w komponencie LabeledEdit3. Stwórzmy nowy formularz projektu Projekt_10.dpr, w skład którego wchodzić będą dwa przyciski (reprezentujące klasę TButton) oraz trzy komponenty edycyjne (repre- zentujące klasę TLabeledEdit z karty Additional). W inspektorze obiektów właściwo- ściom Text komponentów LabeledEdit1 i LabeledEdit2 przypiszmy wartości 0,0, aby ich cechy Text nie posiadały wartości nieokreślonej. Cechę Text komponentu Labele- dEdit3 wykasujmy. Komponenty reprezentujące klasę TLabeledEdit posiadają mo - liwość automatycznego ich opisu. Są one jakby połączeniem komponentów z klas TLabel i TEdit. Rozwijając w inspektorze obiektów opcje właściwości EditLabel komponentu LabeledEdit1 (obok nazwy właściwości w inspektorze obiektów pojawi się znaczek „–”) opiszmy jego cechę Caption jako Liczba 1. Podobnie opiszemy wszystkie komponenty edycyjne, tak jak przedstawiono to na rysunku 4.5.
  • 26. 62 ABC Delphi 6 Rysunek 4.5. Rozmieszczenie i opis komponentów reprezentujących klasę TLabeledEdit Bardzo często korzystanie z ró nego rodzaju komponentów ułatwiają nam dymki podpowiedzi (ang. hint). Je eli zechcemy je zastosować na potrzeby naszych okienek edycji, musimy zamknąć opcje właściwości EditLabel (obok nazwy tej właściwości w inspektorze obiektów pojawi się znaczek „+”). Zaznaczmy myszką wybrany kom- ponent i odszukajmy w inspektorze obiektów jego właściwość Hint, którą opiszemy jako Podaj pierwszą liczbę. Aby dymek podpowiedzi był rzeczywiście widoczny w trak- cie działania programu, właściwości ShowHint nale y nadać wartość 6TWG. Analo- gicznie postąpimy z następnym komponentem edycyjnym. Przystąpmy obecnie do wypełniania głównego modułu Unit_10.pas naszego formula- rza odpowiednim kodem. W sekcji implementacji modułu zadeklarujmy własną klasę EFloatingPointError (wyjątek dzielenia zmiennopozycyjnego) przechwytującą wy- jątki, która będzie dziedziczyć po klasie EMathError. Dodatkowo zastosujmy dwie deklaracje TGUQWTEGUVTKPI, przechowujące odpowiednie komunikaty, informujące o powstaniu wyjątku podczas zmiennopozycyjnego dzielenia dwóch liczb: KORNGOGPVCVKQP ] 4
  • 27. FHO_ V[RG '(NQCVKPI2QKPV'TTQT ENCUU '/CVJ'TTQT TGUQWTEGUVTKPI /UI $ æF QRGTCELK OKGPPQRQ[E[LP[EJ U /UI 2TÎDC FKGNGPKC RTG GTQ U W tym wypadku znaki formatowania U pozwalają na zduplikowanie komunikatów w języku polskim i angielskim. Procedurę obsługi zdarzenia $WVVQP%NKEM , uruchamianego przyciskiem Oblicz, wypełnimy następującym kodem: RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP VT[ .CDGNGF'FKV6GZV(NQCV6Q5VT 5VT6Q(NQCV .CDGNGF'FKV6GZV 5VT6Q(NQCV .CDGNGF'FKV6GZV GZEGRV QP 'Z '+PXCNKF1R FQ TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV /UI ='Z/GUUCIG? QP 'Z 'GTQKXKFG FQ TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV /UI ='Z/GUUCIG? GPF GPF
  • 28. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 63 W klauzuli VT[GZEGRV, przeznaczonej do obsługi błędów, umieściliśmy zapis właści- wej operacji dzielenia dwóch liczb. Funkcje 5VT6Q(NQCV dokonują konwersji ciągu zna- ków, przechowywanych w cechach Text komponentów LabeledEdit1 oraz LabeledE- dit2, na zmiennopozycyjną postać numeryczną, czyli po prostu na liczby z przecinkami. U ywając operatora dzielenia zmiennopozycyjnego „/”, te dwie liczby podzielimy przez siebie, natomiast wynik dzielenia zostanie z kolei przypisany cesze Text kom- ponentu edycyjnego reprezentowanego przez LabeledEdit3. Aby postać numeryczna liczby mogła być wyświetlana w oknie edycyjnym, musi zostać zamieniona na łań- cuch znaków (w tym wypadku typu string). Dokonujemy tego, stosując funkcję (NQ CV6Q5VT konwertującą postać numeryczną liczby na odpowiedni łańcuch znaków. Ka de wyra enie VT[GZEGRVGPF mo e posiadać jedną lub więcej sekcji on: 'Z MNCUC Y[LæVMW FQ, z których ka da deklaruje odrębną klasę wyjątku. Delphi prze- szukuje sekcję QP w zapisanym porządku (od góry do dołu), poszukując aktualnie pa- sującej klasy wyjątku odpowiadającego występującemu błędowi. Ogólnie rzecz biorąc, ka dy kod potencjalnie mogący wygenerować wyjątek (w na- szym przypadku dzielenie zmiennopozycyjne) powinien mieć mo liwość przekazania jego obiektu do wyra enia raise (zakańczać, zbierać). W tym miejscu nale y wyko- rzystać własną klasę wyjątku '(NQCVKPI2QKPV'TTQT %TGCVG(OV z konstruktorem konwertującym komunikat egzemplarza wyjątku na łańcuch znaków EQPUVTWEVQT %TGCVG(OV EQPUV /UI UVTKPI EQPUV #TIU CTTC[ QH EQPUV gdzie argument Args jest tzw. wariantową tablicą otwartą (array of const), pozwalają- cą na przekazywanie niejednorodnych komunikatów (Messages). Mo e zdarzyć się i taka sytuacja, w której kompilator w sekcji VT[ GZEGRVGPF nie znajdzie pasującego obiektu wyjątku. Wówczas nale y u yć konstrukcji VT[ GZEGRVGNUGTCKUGGPF: RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP VT[ .CDGNGF'FKV6GZV(NQCV6Q5VT 5VT6Q(NQCV .CDGNGF'FKV6GZV 5VT6Q(NQCV .CDGNGF'FKV6GZV GZEGRV QP 'Z '+PXCNKF1R FQ TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV /UI ='Z/GUUCIG? QP 'Z 'GTQKXKFG FQ TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV /UI ='Z/GUUCIG? GNUG TCKUG GPF GPF Mamy nadzieję, i przedstawione w poprzednim punkcie rozwa ania nie są zbyt skomplikowane dla mniej zaawansowanych Czytelników. Je eli jednak ktoś czuje się nieco zagubiony pośród tych pojęć, zawsze mo na przedstawioną wy ej konstrukcję znacznie uprościć poprzez wyświetlanie komunikatu wyjątku poprzez okno dialogo- we MessageBox():
  • 29. 64 ABC Delphi 6 RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP VT[ .CDGNGF'FKV6GZV(NQCV6Q5VT 5VT6Q(NQCV .CDGNGF'FKV6GZV 5VT6Q(NQCV .CDGNGF'FKV6GZV GZEGRV QP 'Z '+PXCNKF1R FQ /GUUCIG$QZ $ æF QRGTCELK OKGPPQRQ[E[LP[EJ 7YCIC /$A1- QP 'Z 'GTQKXKFG FQ /GUUCIG$QZ 2TÎDC FKGNGPKC RTG GTQ 7YCIC /$A1- GNUG TCKUG GPF GPF Na wydruku 4.4 przedstawiono kompletny kod źródłowy głównego modułu aplikacji, wykorzystującej obiekty wyjątków powstałych podczas operacji zmiennopozycyjnego dzielenia dwóch liczb. Wydruk 4.4. Kod głównego modułu Unit_10.pas projektu KODY10Projekt_10.dpr, wykorzystującego przykładowe klasy wyjątków WPKV 7PKVA KPVGTHCEG WUGU 9KPFQYU /GUUCIGU 5[U7VKNU 8CTKCPVU %NCUUGU )TCRJKEU %QPVTQNU (QTOU KCNQIU 5VF%VTNU 'ZV%VTNU V[RG 6(QTO ENCUU 6(QTO $WVVQP 6$WVVQP .CDGNGF'FKV 6.CDGNGF'FKV .CDGNGF'FKV 6.CDGNGF'FKV .CDGNGF'FKV 6.CDGNGF'FKV $WVVQP 6$WVVQP RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTKXCVG ] 2TKXCVG FGENCTCVKQPU _ RWDNKE ] 2WDNKE FGENCTCVKQPU _ GPF XCT (QTO 6(QTO KORNGOGPVCVKQP ] 4
  • 30. FHO_ V[RG '(NQCVKPI2QKPV'TTQT ENCUU '/CVJ'TTQT TGUQWTEGUVTKPI /UI $ æF QRGTCELK OKGPPQRQ[E[LP[EJ U /UI 2TÎDC FKGNGPKC RTG GTQ U
  • 31. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 65 RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP VT[ .CDGNGF'FKV6GZV(NQCV6Q5VT 5VT6Q(NQCV .CDGNGF'FKV6GZV 5VT6Q(NQCV .CDGNGF'FKV6GZV GZEGRV QP 'Z '+PXCNKF1R FQ TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV /UI ='Z/GUUCIG? /GUUCIG$QZ $ æF QRGTCELK OKGPPQRQ[E[LP[EJ 7YCIC /$A1- QP 'Z 'GTQKXKFG FQ TCKUG '(NQCVKPI2QKPV'TTQT%TGCVG(OV /UI ='Z/GUUCIG? /GUUCIG$QZ 2TÎDC FKGNGPKC RTG GTQ 7YCIC /$A1- GNUG TCKUG GPF GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP #RRNKECVKQP6GTOKPCVG GPF GPF Powy szy algorytm najlepiej jest testować, uruchamiając program wynikowy Pro- jekt_10.exe. Operacje na plikach Zarówno w Windows, jak i Linux wszelkie operacje wejścia-wyjścia realizowane są za pomocą czytania z plików lub pisania do plików. Wszystkie urządzenia zewnętrzne, łącznie z końcówką u ytkownika, traktowane są jako pliki wchodzące w skład szero- kiego systemu plików. Niniejszy podrozdział poświęcony jest pewnym aspektom re- alizacji przez Delphi ró nego rodzaju operacji na plikach. Większość operacji plikowych, pochodzących ze standardowego Pascala, działa rów- nie w graficznym środowisku Delphi 6. Przypomnijmy, i standardowo nazwa pliku mo e być zmienną typu File lub TextFile. Wywołaniem procedury RTQEGFWTG #UUKIP(KNG XCT ( (KNG0COG UVTKPI dokonujemy przypisania nazwy pliku do zmiennej plikowej. Procedura RTQEGFWTG 4GUGV XCT ( = (KNG 4GE5KG 9QTF ? otwiera istniejący plik. Tryb otwarcia pliku zale y od przypisania zmiennej FileMode odpowiedniej wartości. Domyślnie przyjmowana jest wartość 2 pozwalająca na od- czyt i zapis do pliku. Przypisanie zmiennej FileMode wartości 0 przed wywołaniem procedury 4GUGV spowoduje otwarcie pliku w trybie tylko do odczytu danych, na- tomiast wartości 1 — w trybie tylko do zapisu. Z kolei procedura RTQEGFWTG 4GYTKVG XCT ( (KNG = 4GEUKG 9QTF ?
  • 32. 66 ABC Delphi 6 tworzy nowy plik z jednoczesnym jego otwarciem. Plik zamykamy, wywołując pro- cedurę: RTQEGFWTG %NQUG(KNG XCT ( Zaprojektujmy aplikację, której zadaniem będzie wczytanie pliku tekstowego z dysku oraz jego ponowne zapisanie po ewentualnej modyfikacji. Umieśćmy na formularzu po jednym reprezentancie klas TRichEdit i TCoolBar z karty Win32. Dodatkowo uzupełnimy go trzema komponentami reprezentującymi klasę TSpeedButton z karty Additional oraz po jednym komponencie z klas TMainMenu i TButton z karty Standard oraz TOpenDialog i TSaveDialog z karty Dialogs. Sposób rozmieszczenia wymienionych komponentów na formularzu obrazuje rysunek 4.6. Rysunek 4.6. Sposób rozmieszczenia komponentów na formularzu projektu Projekt_11.dpr Zaprojektujmy proste menu, dzięki któremu będziemy mogli utworzyć nowy plik, wczytać istniejący i ewentualnie powtórnie zapisać na dysku w wybranym katalogu. Aby dostać się do okna słu ącego do tworzenia menu głównego, nale y zaznaczyć komponent MainMenu1, a następnie dwukrotnie kliknąć myszką pole Items karty zda- rzeń inspektora obiektów (oczywiście, ten sam efekt otrzymamy, klikając dwukrotnie samą ikonę na formularzu). Zmieńmy cechę Caption (nagłówek) na Plik, pojawi się wówczas nowe pole obok naszej opcji. W ten sposób mo emy tworzyć nawet bardzo rozbudowane menu, ale o tym wszystkim jeszcze sobie powiemy w dalszej części ksią ki. Teraz jednak wska my pole poni ej i cesze Caption przypiszmy Nowy, następnie przejdźmy do karty Events inspektora obiektów i zdarzeniu OnClick przypiszmy NewFileClick. Klikając teraz dwa razy pole Nowy, od razu znajdziemy się wewnątrz procedury obsługi zdarzenia 0GY(KNG%NKEM . Powróćmy do okna Form1.MainMenu1 i przejdźmy ni ej. Następną opcję zatytułujmy Otwórz. W karcie zdarzeń inspektora obiektów jej cechę Name zmieńmy na OpenFile, natomiast w karcie zdarzeń zdarze- niu OnClick przypiszmy FileOpenClick. Dwukrotnie klikając, dostaniemy się do wnętrza procedury obsługi zdarzenia (KNG1RGP%NKEM . Procedurę tę wypełnimy od- powiednim kodem: RTQEGFWTG 6(QTO(KNG1RGP%NKEM 5GPFGT 61DLGEV XCT +P(KNG 6GZV(KNG CVC UVTKPI
  • 33. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 67 DGIKP 4KEJ'FKV.KPGU%NGCT KH 1RGPKCNQI'ZGEWVG VJGP DGIKP #UUKIP(KNG +P(KNG 1RGPKCNQI(KNG0COG 4GUGV +P(KNG YJKNG PQV '1( +P(KNG FQ DGIKP 4GCF.P +P(KNG CVC 4KEJ'FKV.KPGU#FF CVC GPF %NQUG(KNG +P(KNG (QTO%CRVKQP 'F[ELC = 1RGPKCNQI(KNG0COG ? GPF GPF W bardzo podobny sposób zaprojektujmy pozostałe części składowe menu, tak jak pokazano na rysunku 4.7. Rysunek 4.7. Elementy składowe głównego menu projektu Projekt_11.dpr W omawianym programie menu Plik, Otwórz będzie zdublowane jednym z przycisków TSpeedButton. Najpierw na formularzu umieśćmy komponent TCoolBar, natomiast bezpośrednio na nim kolejno komponenty TSpeedButton. Ich cechy Name zmieńmy, posługując się inspektorem obiektów, odpowiednio na FileOpen, CopyText, PasteText, CutText. Korzystając z właściwości Glyph, rozwińmy opcję TBitmap i umieśćmy na ka dym z przycisków TSpeedButton odpowiednią mapę bitową, tak jak przedstawio- no na rysunku 4.6. Rysunek taki mo emy wykonać samodzielnie, korzystając z Edy- tora Graficznego Delphi (menu Tools, Image Editor), którego obsługa nie ró ni się w istocie od zasad obsługi programu graficznego, jakim jest Paint. Aby przycisk FileOpen obsługiwał znaną nam ju procedurę obsługi zdarzenia (KNG 1RGP%NKEM , wystarczy w karcie zdarzeń inspektora obiektów jego zdarzeniu OnC- lick przypisać FileOpenClick(). Na wydruku 4.5 zamieszczono kompletny kod aplikacji Projekt_11.dpr. W funkcji (QTO %TGCVG wykorzystaliśmy właściwość InitialDir obiektów TOpenDialog i TSaveDialog. Właściwość ta ju w momencie uruchomienia aplikacji pozwala ustalić odpowiednią ście kę dostępu do aktualnego katalogu. Z kolei wykorzystując właściwość Filter (ry- sunek 4.8) tych obiektów, zapewnimy mo liwość odczytania plików posiadających wymagane przez nas rozszerzenia.
  • 34. 68 ABC Delphi 6 Rysunek 4.8. Właściwość Filter klas TOpenDialog i TSaveDialog Dymki podpowiedzi do poszczególnych przycisków uzyskamy, korzystając z właści- wości Hint oraz ShowHint. Śledząc poni szy wydruk, zauwa ymy te , e aby kompo- nenty TOpenDialog i TSaveDialog, niewidoczne przecie w trakcie uruchomienia programu, generowały zdarzenia, polegające na wyświetleniu odpowiednich okien dialogowych, nale y w funkcjach odpowiednich zdarzeń skorzystać z metody 'ZGEW VG . Plik zapisujemy na dysku, korzystając z procedury obsługi zdarzenia 5CXG(KNG #U%NKEM . Procedury zdarzeniowe %WV6GZV%NKEM , 2CUVG6GZV%NKEM , %QR[6GZV%NKEM , zaim- plementowane w odpowiednich przyciskach, zgrupowanych w panelu CoolBar1, ko- rzystają z metody 4KEJ'FKV%WV6Q%NKRDQCTF , 4KEJ'FKV 2CUVG(TQO%NKRDQCTF , 4KEJ'FKV%QR[6Q%NKRDQCTF , zapewniając mo liwość usunięcia fragmentu tekstu, wstawienia fragmentu tekstu znajdującego się w schowku (ang. clipboard) oraz skopio- wania fragmentu tekstu do schowka. Mo liwe jest równie zaznaczenie całości tekstu przy wykorzystaniu metody 4KEJ'FKV5GNGEV#NN . Aby powtórzyć ostatnio wyko- naną (na tekście) operację, nale y skorzystać z metody 4KEJ'FKV*CPFNG#NNQECVGF , którą mo emy ju samodzielnie zastosować. Wydruk 4.5. Kod głównego modułu Unit_11.pas projektu Projekt_11.dpr WPKV 7PKVA KPVGTHCEG WUGU 9KPFQYU /GUUCIGU 5[U7VKNU %NCUUGU )TCRJKEU %QPVTQNU (QTOU KCNQIU 5VF%VTNU %QO%VTNU (KNG%VTN 6QQN9KP $WVVQPU /GPWU V[RG 6(QTO ENCUU 6(QTO $WVVQP 6$WVVQP 4KEJ'FKV 64KEJ'FKV 5CXGKCNQI 65CXGKCNQI %QQN$CT 6%QQN$CT %QR[6GZV 65RGGF$WVVQP 2CUVG6GZV 65RGGF$WVVQP %WV6GZV 65RGGF$WVVQP /CKP/GPW 6/CKP/GPW 1RGPKCNQI 61RGPKCNQI 5CXG(KNG#U 6/GPW+VGO 1RGP(KNG 6/GPW+VGO 0GY(KNG 6/GPW+VGO
  • 35. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 69 %NQUG#RRNKECVKQP 6/GPW+VGO RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG (QTO%TGCVG 5GPFGT 61DLGEV RTQEGFWTG %QR[6GZV%NKEM 5GPFGT 61DLGEV RTQEGFWTG 2CUVG6GZV%NKEM 5GPFGT 61DLGEV RTQEGFWTG %WV6GZV%NKEM 5GPFGT 61DLGEV RTQEGFWTG (KNG1RGP%NKEM 5GPFGT 61DLGEV RTQEGFWTG 0GY(KNG%NKEM 5GPFGT 61DLGEV RTQEGFWTG 5CXG(KNG#U%NKEM 5GPFGT 61DLGEV RTQEGFWTG (QTO%NQUG 5GPFGT 61DLGEV XCT #EVKQP 6%NQUG#EVKQP RTQEGFWTG (QTO%NQUG3WGT[ 5GPFGT 61DLGEV XCT %CP%NQUG $QQNGCP RTKXCVG ] 2TKXCVG FGENCTCVKQPU _ U(KNG 5VTKPI RTQEGFWTG (QTO%CRVKQP EQPUV U(KNGAU 5VTKPI RWDNKE ] 2WDNKE FGENCTCVKQPU _ GPF XCT (QTO 6(QTO KORNGOGPVCVKQP ] 4
  • 36. (/_ TGUQWTEGUVTKPI U 7YCIC U COMPKúEKG CRNKMCELK RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP ECUG /GUUCIG$QZ 2%JCT U 2%JCT U /$A;'501 QT /$A+%1037'56+10 QH +A;'5 #RRNKECVKQP6GTOKPCVG +A01 #DQTV GPF GPF RTQEGFWTG 6(QTO(QTO%TGCVG 5GPFGT 61DLGEV DGIKP 1RGPKCNQI+PKVKCNKT 'ZVTCEV(KNG2CVJ 2CTCO5VT 5CXGKCNQI+PKVKCNKT 1RGPKCNQI+PKVKCNKT GPF RTQEGFWTG 6(QTO%QR[6GZV%NKEM 5GPFGT 61DLGEV DGIKP 4KEJ'FKV%QR[6Q%NKRDQCTF GPF RTQEGFWTG 6(QTO2CUVG6GZV%NKEM 5GPFGT 61DLGEV DGIKP 4KEJ'FKV2CUVG(TQO%NKRDQCTF GPF
  • 37. 70 ABC Delphi 6 RTQEGFWTG 6(QTO%WV6GZV%NKEM 5GPFGT 61DLGEV DGIKP 4KEJ'FKV%WV6Q%NKRDQCTF GPF RTQEGFWTG 6(QTO(QTO%CRVKQP EQPUV U(KNGAU 5VTKPI DGIKP U(KNG U(KNGAU %CRVKQP (QTOCV U U ='ZVTCEV(KNG0COG U(KNGAU #RRNKECVKQP6KVNG? GPF RTQEGFWTG 6(QTO(KNG1RGP%NKEM 5GPFGT 61DLGEV XCT +P(KNG 6GZV(KNG CVC UVTKPI DGIKP 4KEJ'FKV.KPGU%NGCT KH 1RGPKCNQI'ZGEWVG VJGP DGIKP #UUKIP(KNG +P(KNG 1RGPKCNQI(KNG0COG 4GUGV +P(KNG YJKNG PQV '1( +P(KNG FQ DGIKP 4GCF.P +P(KNG CVC 4KEJ'FKV.KPGU#FF CVC GPF %NQUG(KNG +P(KNG (QTO%CRVKQP 'F[ELC = 1RGPKCNQI(KNG0COG ? GPF GPF RTQEGFWTG 6(QTO0GY(KNG%NKEM 5GPFGT 61DLGEV DGIKP (QTO%CRVKQP $G PCY[ 4KEJ'FKV.KPGU%NGCT 4KEJ'FKV/QFKHKGF (#.5' GPF RTQEGFWTG 6(QTO5CXG(KNG#U%NKEM 5GPFGT 61DLGEV XCT 1WV(KNG 6GZV(KNG DGIKP KH 5CXGKCNQI'ZGEWVG VJGP DGIKP #UUKIP(KNG 1WV(KNG 5CXGKCNQI(KNG0COG 4GYTKVG 1WV(KNG 9TKVG.P 1WV(KNG 4KEJ'FKV6GZV %NQUG(KNG 1WV(KNG (QTO%CRVKQP CRKUCP[ = 5CXGKCNQI(KNG0COG ? 4KEJ'FKV/QFKHKGF (#.5' GPF GPF RTQEGFWTG 6(QTO(QTO%NQUG 5GPFGT 61DLGEV XCT #EVKQP 6%NQUG#EVKQP
  • 38. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 71 DGIKP #EVKQPEC(TGG GPF RTQEGFWTG 6(QTO(QTO%NQUG3WGT[ 5GPFGT 61DLGEV XCT %CP%NQUG $QQNGCP DGIKP ECUG /GUUCIG$QZ 2%JCT U 2%JCT U /$A;'501 QT /$A+%1037'56+10 QH OT;'5 %CP%NQUG647' OT01 %CP%NQUG(#.5' GPF GPF GPF Strukturalna obsługa wyjątków Być mo e temat niniejszego podrozdziału mo e się wydawać mało adekwatny w ksią - ce traktującej o podstawach programowania w Delphi, jednak przekonamy się, i jest on naturalnym rozwinięciem poruszanych uprzednio zagadnień i wcale nie takim trud- nym pojęciowo, jak ktoś mógłby sądzić. Oprócz wyra enia VT[GZEGRVGPF Delphi mo e posługiwać się równie konstruk- cją VT[HKPCNN[GPF. Ró nica pomiędzy nimi polega na tym, i wyra enie VT[ HKPCNN[ nie jest traktowane przez kompilator jako jawna konstrukcja obsługująca wyjątki pozwala natomiast na wykonanie części programu, występującego po słowie HKPCNN[, nawet w przypadku wcześniejszego wykrycia jakiegoś wyjątku. W celu wy- jaśnienia przedstawionego problemu posłu ymy się przykładem procedury obsługi zdarzenia czytającego określony plik, który powinien znajdować się na dysku. Plik przeczytamy metodą „znak po znaku” za pomocą zmiennej %JCTCEVGT typu %JCT. RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV XCT +P(KNG 6GZV(KNG (0COG UVTKPI %JCTCEVGT %JCT DGIKP 4KEJ'FKV.KPGU%NGCT (0COG 2NKMVZV #UUKIP(KNG +P(KNG (0COG VT[ 4GUGV +P(KNG VT[ YJKNG PQV '1( +P(KNG FQ DGIKP 4GCF +P(KNG %JCTCEVGT 4KEJ'FKV.KPGU#FF %JCTCEVGT GPF HKPCNN[
  • 39. 72 ABC Delphi 6 %NQUG(KNG +P(KNG GPF GZEGRV QP 'Z '+P1WV'TTQT FQ 5JQY/GUUCIG $ æF QVYCTEKC RNKMW 5RTCYF E[ RNKM KUVPKGLG PC F[UMW GPF (QTO%CRVKQP 'F[ELC = (0COG ? GPF Podczas testowania, a następnie analizowania powy szego algorytmu bez trudu zauwa- ymy, i w pierwszej kolejności zostaną wykonane instrukcje pomiędzy klauzulami VT[ oraz HKPCNN[. W następnej kolejności wykonywane będą instrukcje zawarte po- między HKPCNN[ i GPF (polegające na zamknięciu pliku bez względu na to, czy został on otwarty prawidłowo, czy nie) niezale nie od rezultatu wykonania pierwszej grupy instrukcji czytających znaki z pliku. Najbardziej zewnętrzny blok VT[GZEGRVGPF obrazuje znaną nam ju ideę obsługi wyjątków. Pokazany sposób obsługi wyjątków nosi angielską nazwę Structural Exception Handling (w skrócie SEH). Dzięki zasto- sowaniu SEH dokonujemy rozdziału miejsca, w którym mo e wystąpić wyjątek (np. próba otwarcia nieistniejącego pliku) od miejsca, w którym będzie on obsługiwany. Zastosowany przez nas wyjątek EInOutError jest w rzeczywistości klasą wyjątków obsługujących operacje wejścia-wyjścia. Tablice otwarte W stosunku do standardowego języka Pascal Delphi znacznie rozszerza pojęcie tabli- cy. Jednym z takich rozszerzeń są tablice otwarte, które z reguły występują w roli pa- rametrów procedur lub funkcji i mogą posiadać dowolne rozmiary. W przypadku, gdy procedura lub funkcja nie będzie modyfikować zawartości tablicy otwartej, deklaruje- my ją za pomocą słowa kluczowego EQPUV. Słowa kluczowego XCT u ywamy w dekla- racji funkcji lub procedury modyfikującej zawartość takiej tablicy. Poniewa w trak- cie działania program powinien w jakiś sposób kontrolować aktualny rozmiar takiej tablicy, musimy wskazać jej dolną i górną granicę. Do tego celu słu ą funkcje .QY i *KIJ . Jako przykład rozpatrzmy prostą funkcję 5WO1H'NGOGPV , obliczającą sumę elemen- tów jednowymiarowej tablicy otwartej Data: HWPEVKQP 5WO1H'NGOGPV EQPUV CVC CTTC[ QH QWDNG QWDNG XCT K +PVGIGT DGIKP 4GUWNV HQT K.QY CVC VQ *KIJ CVC FQ 4GUWNV4GUWNV CVC=K? GPF
  • 40. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 73 Widzimy, e deklaracja tablicy otwartej (z elementami np. typu Double) w charakte- rze argumentu funkcji przyjmuje bardzo prostą postać: EQPUV CVC CTTC[ QH QWDNG Wywołanie w programie funkcji z argumentem w postaci tablicy otwartej nie powin- no sprawić adnego kłopotu nawet początkującemu programiście Delphi. Wyświetlenie wyniku (np. w komponencie edycyjnym TEdit z karty Standard), zwracanego przez funkcję 5WO1H'NGOGPV , mo e nastąpić w procedurze obsługi wybranego zdarzenia: RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP 'FKV6GZV(NQCV6Q5VT 5WO1H'NGOGPV =? GPF Widzimy, e w najprostszym wypadku wystarczy wywołać powy szą funkcję z ar- gumentem w postaci kolejnych elementów tablicy, zapisanych w nawiasach kwadra- towych. Tablice dynamiczne Różnica pomiędzy tablicami otwartymi i dynamicznymi jest dosyć subtelna. Polega na tym, iż deklaracja tablicy użyta jako parametr bez typu indeksu jest tablicą otwartą, natomiast tablica bez indeksu, deklarowana jako zmienna lokalna, glo- balna, pole klasy lub nowy typ danych jest tablicą dynamiczną. Do funkcji (lub procedury) deklarującej swój argument jako tablicę otwartą mo na przekazywać tablice dynamiczne. Funkcja ma wtedy dostęp do elementów tablicy dy- namicznej, jednak nie ma mo liwości zmienić jej rozmiaru. Poniewa tablice otwarte i dynamiczne są deklarowane identycznie, jedynym sposobem zadeklarowania para- metru jako tablicy dynamicznej jest zadeklarowanie nowego typu identyfikatora dla typu tablicy dynamicznej. Przykład takiego działania został pokazany poni ej, gdzie równie wykorzystano funkcję 5WO1H'NGOGPV do obliczania sumy wszystkich ele- mentów tablicy dynamicznej Data. Ciąg liczb w prosty sposób czytany jest z pliku: RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV XCT CVC CTTC[ QH QWDNG VCDNKEC F[PCOKEPC RTGEJQYWLæEC YCTVQ EK V[RW QWDNG ( 6GZV(KNG 8CNWG QWDNG + +PVGIGT DGIKP #UUKIP(KNG ( %FCPGFCV 4GUGV ( + YJKNG PQV '1( ( FQ DGIKP 4GCF.P ( 8CNWG 5GV.GPIVJ CVC .GPIVJ CVC
  • 41. 74 ABC Delphi 6 CVC=+? 8CNWG 4KEJ'FKV.KPGU#FF (NQCV6Q5VT CVC=+? + + GPF %NQUG(KNG ( 'FKV6GZV(NQCV6Q5VT 5WO1H'NGOGPV CVC GPF Typ OleVariant Jako przykład zastosowania w programie typu OleVariant poka emy, w jaki sposób bardzo szybko mo na stworzyć klienta OLE, wyświetlającego aktualną wersję zain- stalowanego w systemie PowerPointa, i ewentualnie z poziomu kodu Delphi urucho- mić go. Technologia OLE (ang. Object Linking and Embedding) umożliwia osadzanie, łą- czenie i wzajemną wymianę różnych obiektów danych przy jednoczesnej pracy wie- lu aplikacji Windows (OLE 2). Ole Automation jest częścią standardu OLE 2. Umożliwia zapisywanie w aplikacji sekwencji działań OLE w postaci ciągu poleceń, które dany program ma zinterpre- tować. Component Object Model, w skrócie COM jest standardem, pozwalającym współ- dzielić obiekty pomiędzy wiele aplikacji. Określa też zasady komunikacji pomiędzy obiektami. Obiekty takie muszą być rozróżniane już na poziomie systemu opera- cyjnego. Przejdźmy do karty Servers, zawierającej kilkadziesiąt elastycznych klas, słu ących do wizualizacji aktualnie dostępnych w systemie serwerów COM. Zaprojektujmy naprawdę prostą aplikację, składającą się z jednego komponentu re- prezentującego klasę TPowerPointApplication, jednego reprezentującego klasę TRi- chEdit oraz trzech TButton, tak jak przedstawiono to na rysunku 4.9. Rysunek 4.9. Aplikacja wykorzystująca przykładowy egzemplarz klasy TPowerPointApplication z karty Servers W najprostszym przypadku w celu ustanowienia połączenia z wybranym serwerem COM wykorzystamy metodę %QPPGEV , w celu wizualizacji połączenia skorzystamy z metody 8KUKDNG, natomiast aby rozłączyć się z wybranym uprzednio serwerem mu- simy skorzystać z metody KUEQPPGEV .
  • 42. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 75 Aby utworzyć klienta OLE, nale y skorzystać z funkcji %TGCVG1NG1DLGEV z modułu ComObj. Parametrem aktualnym tej funkcji jest nazwa odpowiedniej klasy, tak jak zostało to pokazane na wydruku 4.6. Wydruk 4.6. Kod głównego modułu Unit_12.pas projektu Projekt_12.dpr WPKV 7PKVA KPVGTHCEG WUGU 9KPFQYU /GUUCIGU 5[U7VKNU8CTKCPVU%NCUUGU )TCRJKEU %QPVTQNU (QTOU KCNQIU 5VF%VTNU %QO%VTNU %QO1DL 1NG5GTXGT /52RV V[RG 6(QTO ENCUU 6(QTO $WVVQP 6$WVVQP $WVVQP 6$WVVQP 4KEJ'FKV 64KEJ'FKV $WVVQP 6$WVVQP 2QYGT2QKPV#RRNKECVKQP 62QYGT2QKPV#RRNKECVKQP RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG (QTO%TGCVG 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTKXCVG ] 2TKXCVG FGENCTCVKQPU _ RWDNKE ] 2WDNKE FGENCTCVKQPU _ GPF XCT (QTO 6(QTO KORNGOGPVCVKQP ] 4
  • 43. (/_ RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV XCT 2QYGT2QKPV#RR 1NG8CTKCPV DGIKP VT[ 2QYGT2QKPV#RR %TGCVG1NG1DLGEV 2QYGT2QKPV#RRNKECVKQP 4KEJ'FKV.KPGU#FF 2QYGT2QKPV YGTULC 2QYGT2QKPV#RR8GTUKQP GZEGRV #RRNKECVKQP/GUUCIG$QZ 2QYGT2QKPV PKG LGUV CKPUVCNQYCP[ $ æF QVYCTEKC CRNKMCELK /$A1- GPF GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV
  • 44. 76 ABC Delphi 6 DGIKP 2QYGT2QKPV#RRNKECVKQPKUEQPPGEV #RRNKECVKQP6GTOKPCVG GPF RTQEGFWTG 6(QTO(QTO%TGCVG 5GPFGT 61DLGEV DGIKP 2QYGT2QKPV#RRNKECVKQP%QPPGEV GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP 2QYGT2QKPV#RRNKECVKQP8KUKDNG GPF GPF Widzimy, e sposób posługiwania się typami wariantowymi w kontekście tworzenia klienta OLE wybranego serwera COM jest bardzo prosty. Połączenie się z innymi do- stępnymi serwerami pozostawimy Czytelnikom jako ćwiczenie do samodzielnego wykonania. Rekordy w Delphi Rekord w Delphi odgrywa bardzo podobne znaczenie jak w przypadku standardowego języka Pascal. Je eli zachodzi w programie konieczność przydzielenia wystarczającej ilości pamięci dla większej liczby zmiennych (elementów), stosowanie w programie rekordów daje du o lepsze wyniki w porównaniu z posługiwaniem się klasami, pod jednym wszak e warunkiem, mianowicie zakładamy, e ilość operacji wykonywa- nych na elementach rekordu będzie stosunkowo niewielka. Jako przykład wykorzy- stania w środowisku graficznym Delphi prostego rekordu rozpatrzmy pewną modyfi- kację omawianego wcześniej przykładu rekordu, słu ącego do przechowywania informacji o studentach. Zaprojektujmy formularz składający się z sześciu komponentów TLabeledEdit oraz pięciu TButton. W inspektorze obiektów we własności EditLabel cechy Caption eg- zemplarzy klasy TlabeledEdit zmieńmy odpowiednio na Imię, Nazwisko, Egzamin Matematyka, Egzamin Fizyka, Egzamin Informatyka oraz Opinia. Własności Caption komponentów Button1, Button2, Button3, Button4 i Button5 zmieńmy odpowiednio na Nowy, Poprzedni, Zapisz dane, Następny i Koniec. Rozmieszczenie i opis po- szczególnych komponentów, wchodzących w skład formularza, zatytułowanego Pro- jekt_13, pokazano na rysunku 4.10. Bez trudu zauwa amy, i komponenty LabeledEdit3, LabeledEdit4 i LabeledEdit5 przechowywać będą liczby, dlatego aby w przyszłości uniknąć przykrych niespodzia- nek, w inspektorze obiektów ich cechom Text przypiszmy zerowe wartości. Cechy Text pozostałych egzemplarzy klasy TLabeledEdit wyczyśćmy.
  • 45. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 77 Rysunek 4.10. Formularz projektu Projekt_13.dpr Po to, aby nasz program był naprawdę funkcjonalny, przewidzimy mo liwość zapisu danych na dysku. W tym celu w sekcji implementacji modułu zadeklarujemy rekord pod roboczą nazwą TStudent wraz ze zmienną S tego typu oraz zmienną plikową F typu TStudentFile (typ file przeznaczony jest dla plików binarnych): KORNGOGPVCVKQP ] 4
  • 46. FHO_ V[RG 65VWFGPV TGEQTF +OKG 5VTKPI=? 0CYKUMQ 5VTKPI=? 'ICOKP/CV 5KPING 'ICOKP(K 5KPING 'ICOKP+PH 5KPING ,CMK5VWFGPV 5VTKPI=? GPF 65VWFGPV(KNG HKNG QH 65VWFGPV XCT ( 65VWFGPV(KNG 5 65VWFGPV %WT4GE +PVGIGT Je eli programista nie poda innej deklaracji, plik w Delphi zawsze jest reprezentowa- ny jako sekwencja rekordów o ustalonej długości. Dlatego aby uzyskać mo liwość sekwencyjnego dostępu do rekordów pliku, musimy zadeklarować zmienną CurRec (Current Record). W sekcji prywatnej klasy zadeklarujemy cztery procedury, których celem będzie wy- świetlenie w komponentach edycyjnych aktualnych danych (procedura ShowData), wyczyszczenie zawartości komponentów edycyjnych (ClearData), zapisanie w pliku na dysku aktualnej zawartości elementów rekordu (SaveData) oraz wczytanie danych z dysku (LoadData). Ich zapis w sekcji implementacji modułu będzie bardzo prosty:
  • 47. 78 ABC Delphi 6 RTQEGFWTG 6(QTO5JQYCVC DGIKP .CDGNGF'FKV6GZV5+OKG .CDGNGF'FKV6GZV50CYKUMQ .CDGNGF'FKV6GZV(NQCV6Q5VT 5'ICOKP/CV .CDGNGF'FKV6GZV(NQCV6Q5VT 5'ICOKP(K .CDGNGF'FKV6GZV(NQCV6Q5VT 5'ICOKP+PH .CDGNGF'FKV6GZV5,CMK5VWFGPV GPF RTQEGFWTG 6(QTO.QCFCVC DGIKP 4GCF ( 5 5JQYCVC GPF RTQEGFWTG 6(QTO%NGCTCVC DGIKP .CDGNGF'FKV6GZV .CDGNGF'FKV6GZV .CDGNGF'FKV6GZV .CDGNGF'FKV6GZV .CDGNGF'FKV6GZV .CDGNGF'FKV6GZV GPF RTQEGFWTG 6(QTO5CXGCVC DGIKP 5+OKG.CDGNGF'FKV6GZV 50CYKUMQ.CDGNGF'FKV6GZV 5'ICOKP/CV5VT6Q(NQCV .CDGNGF'FKV6GZV 5'ICOKP(K5VT6Q(NQCV .CDGNGF'FKV6GZV 5'ICOKP+PH5VT6Q(NQCV .CDGNGF'FKV6GZV 5,CMK5VWFGPV.CDGNGF'FKV6GZV 9TKVG ( 5 GPF Zauwa ymy, i dane czytamy za pomocą procedury 4GCF ( 5, natomiast zapisujemy za pomocą procedury 9TKVG ( 5, gdzie ( jest zmienną plikową, a 5 identyfikuje po- szczególne pola rekordu. W tego typu prostszych programach, je eli oczywiście nie mamy innych wymagań, postępujemy z reguły w ten sposób, aby ju w momencie uruchomienia aplikacji ostatnio zapisane rekordy pliku były widoczne w poszczególnych komponentach edy- cyjnych. Efekt taki uzyskamy, odpowiednio wypełniając procedurę tworzącą formu- larz (QTO%TGCVG : RTQEGFWTG 6(QTO(QTO%TGCVG 5GPFGT 61DLGEV DGIKP %NGCTCVC %WT4GE #UUKIP(KNG ( 5FWFGPVUCVCFCV KH (KNG'ZKUVU 5FWFGPVUCVCFCV VJGP DGIKP 4GUGV ( YJKNG PQV '1( ( FQ
  • 48. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 79 .QCFCVC GPF GNUG DGIKP %NGCTCVC 4GYTKVG ( GPF GPF Najpierw czyścimy pola edycji, wywołując procedurę %NGCTCVC. Następnie zmiennej identyfikującej aktualny rekord pliku przypisujemy wartość zero (ustawiamy się na zerowym rekordzie pliku), gdy początkiem ka dego pliku jest rekord o numerze 0. Z kolei za pomocą procedury #UUKIP(KNG przypisujemy nazwę pliku o określonym typie do zmiennej plikowej. Dalej, sprawdzamy czy plik o podanej nazwie istnieje na dysku w aktualnym katalogu. Je eli plik takowy istnieje, otwieramy go procedurą 4G UGV z jednym parametrem w postaci zmiennej plikowej. Dane z pliku czytane są do momentu napotkania znaków końca pliku EOF (End of File). Mo e się zdarzyć, e plik o podanej nazwie nie będzie istnieć na dysku (np. pierwsze uruchomienie aplika- cji). Wówczas nale y go utworzyć, wywołując z jednym parametrem procedurę 4GY TKVG (. Po wypełnieniu odpowiednich rubryk zapisujemy je na dysku w sposób bardzo pro- sty, korzystając z przycisku Zapisz dane, wyzwalającego procedurę obsługi zdarzenia: RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP 5CXGCVC 5JQYCVC GPF W celu rozpoczęcia wypełniania nowego rekordu uruchamiamy procedurę obsługi zdarzenia: RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP TGRGCV +PE %WT4GE 5GGM ( %WT4GE WPVKN '1( ( %NGCTCVC 5CXGCVC 5GGM ( %WT4GE GPF W instrukcji powtarzającej TGRGCVWPVKN za pomocą procedury +PE zwiększamy aktualny numer rekordu w pliku o jeden. U ywanie tej procedury w tzw. ciasnych pę- tlach daje du o lepsze rezultaty w porównaniu z tradycyjnym przypisaniem: %WT4GE%WT4GE Procedurą 5GGM przesuwamy pozycję w pliku na miejsce wskazane przez numer aktualnego istniejącego rekordu CurRec. Czynność tę wykonujemy do momentu na- potkania końca pliku. Następnie okna edycji są czyszczone i zapisywane, a numer po- zycji w pliku przesuwany jest na aktualne miejsce CurRec.
  • 49. 80 ABC Delphi 6 W sposób bardzo podobny mo emy np. poszukać następnego wypełnionego rekordu. Czynność tę wykonujemy za pomocą procedury obsługi zdarzenia: RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP +PE %WT4GE 5GGM ( %WT4GE KH PQV '1( ( VJGP DGIKP 4GCF ( 5 5GGM ( %WT4GE 5JQYCVC GPF GNUG DGIKP +PE %WT4GE VQ UCOQ EQ %WT4GE%WT4GE 5GGM ( %WT4GE 5JQY/GUUCIG 1UKæIPKúVQ MQPKGE RNKMW FCP[OK GPF GPF Na wydruku 4.7 pokazano kompletny kod źródłowy głównego modułu Unit_13.pas aplikacji projektu Kody13Projekt_13.dpr. Wydruk 4.7. Kod źródłowy modułu Unit_13.pas WPKV 7PKVA KPVGTHCEG WUGU 9KPFQYU /GUUCIGU 5[U7VKNU 8CTKCPVU %NCUUGU )TCRJKEU %QPVTQNU (QTOU KCNQIU 5VF%VTNU 'ZV%VTNU V[RG 6(QTO ENCUU 6(QTO .CDGNGF'FKV 6.CDGNGF'FKV .CDGNGF'FKV 6.CDGNGF'FKV .CDGNGF'FKV 6.CDGNGF'FKV .CDGNGF'FKV 6.CDGNGF'FKV .CDGNGF'FKV 6.CDGNGF'FKV .CDGNGF'FKV 6.CDGNGF'FKV $WVVQP 6$WVVQP $WVVQP 6$WVVQP $WVVQP 6$WVVQP $WVVQP 6$WVVQP $WVVQP 6$WVVQP RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG (QTO%TGCVG 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTQEGFWTG $WVVQP%NKEM 5GPFGT 61DLGEV RTKXCVG ] 2TKXCVG FGENCTCVKQPU _ RTQEGFWTG 5JQYCVC RTQEGFWTG %NGCTCVC
  • 50. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 81 RTQEGFWTG 5CXGCVC RTQEGFWTG .QCFCVC RWDNKE ] 2WDNKE FGENCTCVKQPU _ GPF XCT (QTO 6(QTO KORNGOGPVCVKQP ] 4
  • 51. FHO_ V[RG 65VWFGPV TGEQTF +OKG 5VTKPI=? 0CYKUMQ 5VTKPI=? 'ICOKP/CV 5KPING 'ICOKP(K 5KPING 'ICOKP+PH 5KPING ,CMK5VWFGPV 5VTKPI=? GPF 65VWFGPV(KNG (KNG QH 65VWFGPV XCT ( 65VWFGPV(KNG 5 65VWFGPV %WT4GE +PVGIGT RTQEGFWTG 6(QTO5JQYCVC DGIKP .CDGNGF'FKV6GZV5+OKG .CDGNGF'FKV6GZV50CYKUMQ .CDGNGF'FKV6GZV(NQCV6Q5VT 5'ICOKP/CV .CDGNGF'FKV6GZV(NQCV6Q5VT 5'ICOKP(K .CDGNGF'FKV6GZV(NQCV6Q5VT 5'ICOKP+PH .CDGNGF'FKV6GZV5,CMK5VWFGPV GPF RTQEGFWTG 6(QTO.QCFCVC DGIKP 4GCF ( 5 5JQYCVC GPF RTQEGFWTG 6(QTO%NGCTCVC DGIKP .CDGNGF'FKV6GZV .CDGNGF'FKV6GZV .CDGNGF'FKV6GZV .CDGNGF'FKV6GZV .CDGNGF'FKV6GZV .CDGNGF'FKV6GZV GPF RTQEGFWTG 6(QTO5CXGCVC DGIKP 5+OKG.CDGNGF'FKV6GZV 50CYKUMQ.CDGNGF'FKV6GZV
  • 52. 82 ABC Delphi 6 5'ICOKP/CV5VT6Q(NQCV .CDGNGF'FKV6GZV 5'ICOKP(K5VT6Q(NQCV .CDGNGF'FKV6GZV 5'ICOKP+PH5VT6Q(NQCV .CDGNGF'FKV6GZV 5,CMK5VWFGPV.CDGNGF'FKV6GZV 9TKVG ( 5 GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP 5CXGCVC %NQUG(KNG ( #RRNKECVKQP6GTOKPCVG GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP 5CXGCVC 5JQYCVC GPF RTQEGFWTG 6(QTO(QTO%TGCVG 5GPFGT 61DLGEV DGIKP %NGCTCVC %WT4GE #UUKIP(KNG ( 5FWFGPVUCVCFCV KH (KNG'ZKUVU 5FWFGPVUCVCFCV VJGP DGIKP 4GUGV ( YJKNG PQV '1( ( FQ .QCFCVC GPF GNUG DGIKP %NGCTCVC 4GYTKVG ( GPF GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP TGRGCV +PE %WT4GE 5GGM ( %WT4GE WPVKN '1( ( %NGCTCVC 5CXGCVC 5GGM ( %WT4GE GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP KH %WT4GE VJGP DGIKP %WT4GE 5GGM ( %WT4GE 5JQY/GUUCIG 1UKæIPKúVQ RQEæVGM RNKMW FCP[OK GPF GNUG
  • 53. Rozdział 4. ♦ Object Pascal w wydaniu Delphi 83 DGIKP +PE %WT4GE 5GGM ( %WT4GE 4GCF ( 5 5GGM ( %WT4GE 5JQYCVC GPF GPF RTQEGFWTG 6(QTO$WVVQP%NKEM 5GPFGT 61DLGEV DGIKP +PE %WT4GE 5GGM ( %WT4GE KH PQV '1( ( VJGP DGIKP 4GCF ( 5 5GGM ( %WT4GE 5JQYCVC GPF GNUG DGIKP +PE %WT4GE VQ UCOQ EQ %WT4GE%WT4GE 5GGM ( %WT4GE 5JQY/GUUCIG 1UKæIPKúVQ MQPKGE RNKMW FCP[OK GPF GPF GPF Testowanie przedstawionej aplikacji jest bardzo proste. Na pobranym z serwera FTP Wydawnictwa Helion pliku, w aktualnym katalogu znajduje się przykładowy plik SdudentsData.dat z informacjami o trzech wybranych studentach. Mo emy samo- dzielnie go przeszukiwać i uzupełniać. Nale y jednak pamiętać, aby ka dy nowo wy- pełniony rekord od razu zapisać na dysku. Warto pamiętać, iż procedury 5GGM nie można stosować do wykonywania opera- cji na plikach tekstowych (TextFile). Jeżeli chcemy przesuwać pozycję w pliku tek- stowym, należy skorzystać z funkcji bibliotecznej API 5GV(KNG2QKPVGT . Podsumowanie Celem niniejszego rozdziału było zaprezentowanie Czytelnikom pewnych bardzo wa nych pojęć, z którymi nader często spotykamy się, tworząc aplikacje w nowoczesnym środowisku Delphi 6. Chocia mo e się wydawać, i omawianie na kursie programo- wania dla osób mniej zaawansowanych takich terminów, jak metody przeładowywane, wyjątki i klasy wyjątków, tablice otwarte i dynamiczne, serwery COM czy przeszu- kiwanie rekordów mo e być czynnością „na wyrost”, to jednak nale y zdawać sobie sprawę, e obecnie terminy te posiadają ju zupełnie fundamentalne znaczenie i ich znajomość (chocia by pobie na) daje nam przepustkę do samodzielnego studiowania plików pomocy, które są nieocenionym i bogatym źródłem informacji o kompilatorze.