Programowanie w języku Delphi » Delphi 7. Kompendium programisty

Rozdział 4. IDE Delphi

  • 2013-09-30 08:51
  • 1 komentarz
  • 9908 odsłon
  • Oceń ten tekst jako pierwszy
Pierwszą sprawą, na którą zwraca się uwagę po uruchomieniu programu, jest jego wygląd, paski narzędziowe oraz menu — ogólnie mówiąc, opcje dostępne w owym programie. Ten rozdział poświęcony będzie właśnie samemu środowisku Delphi oraz funkcjom przez nie udostępnianym. Czym jest wobec tego IDE?

Na IDE Delphi składają się:

  • menu główne,
  • paski narzędziowe,
  • paleta komponentów,
  • Inspektor obiektów,
  • Projektant formularzy,
  • Edytor kodu,
  • Eksplorator kodu.

Spis treści

     1 Paski narzędziowe
          1.1 Pasek Standard
          1.2 Pasek View
          1.3 Pasek Debug
          1.4 Pasek Desktop
          1.5 Pasek Custom
          1.6 Pasek Internet
     2 Repozytorium
          2.1 Dodawanie projektu do Repozytorium
          2.2 Ustawienia Repozytorium
     3 Praca z paletą komponentów
          3.1 Umieszczanie kilku obiektów naraz
          3.2 Menu palety komponentów
          3.3 Właściwości palety komponentów
     4 Projektant formularzy
          4.1 Menu projektanta formularzy
               4.1.1 Edycja obiektów
               4.1.2 Położenie obiektów
     5 Drzewo obiektów
     6 Inspektor obiektów
          6.1 Menu podręczne Inspektora obiektów
          6.2 Właściwości Inspektora obiektów
     7 Eksplorator kodu
     8 Przeglądarka projektu
     9 Lista To-Do
          9.1 Znaczniki to-do w kodzie
     10 Diagramy
     11 Code Insight
          11.1 Code Completion
               11.1.1 Code Completion — zmiany w Delphi 7
               11.1.2 Ustawienia Code Insight
     12 Projekty
          12.1 Opcje projektu
               12.1.1 Zakładka Forms
               12.1.2 Zakładka Application
               12.1.3 Zakładka Compiler
               12.1.4 Zakładka Compiler Message
               12.1.5 Zakładka Linker
               12.1.6 Zakładka Directories/Conditionals
               12.1.7 Zakładka Version Info
               12.1.8 Zakładka Packages
          12.2 Pliki projektu
     13 Menedżer projektu
          13.1 Pasek narzędziowy
          13.2 Praca z menedżerem projektu
          13.3 Menu podręczne menedżera projektów
               13.3.1 Menu grupy projektów
                    13.3.1.1 Add New Project
                    13.3.1.2 Add Existing Project
                    13.3.1.3 Save Project Group, Save Project Group As
                    13.3.1.4 View Project Group Source
                    13.3.1.5 Toolbar
                    13.3.1.6 StatusBar
                    13.3.1.7 Stay on Top
                    13.3.1.8 Dockable
               13.3.2 Menu Projektu
                    13.3.2.1 Add
                    13.3.2.2 Remove File
                    13.3.2.3 Save
                    13.3.2.4 Options
                    13.3.2.5 Activate
                    13.3.2.6 Compile
                    13.3.2.7 Build
                    13.3.2.8 View Source
                    13.3.2.9 Close
                    13.3.2.10 Remove Project
                    13.3.2.11 Build Sooner, Build Later
                    13.3.2.12 Compile All from Here, Build All from Here
     14 Kilka wersji językowych projektu
          14.1 Tworzymy angielską wersję językową
          14.2 Tłumaczenie projektu
          14.3 Kompilacja projektu
     15 Kilka formularzy w jednym projekcie
          15.1 Wyświetlenie drugiego formularza
          15.2 Dynamiczne tworzenie formularza
     16 Aplikacje MDI
          16.1 Projektowanie interfejsu
               16.1.1 Pasek narzędziowy
               16.1.2 Dodawanie ikon
               16.1.3 Projektowanie menu
               16.1.4 Przyozdabianie menu
               16.1.5 Pozostałe komponenty
          16.2 Kod źródłowy przykładowej aplikacji
     17 Czy warto?
     18 Delphi a C++ Builder
          18.1 Rozmiar aplikacji wykonywalnej i czas kompilacji
          18.2 Pliki
          18.3 Składnia
          18.4 Cechy wspólne
               18.4.1 Różnice
     19 Co nowego w Delphi 7?
          19.1 Zmiany w IDE
               19.1.1 Menu Component list
               19.1.2 Okno Message Hints
               19.1.3 Pozostałe zmiany
          19.2 Nowe komponenty
               19.2.1 Elementy wizualne w stylu Windows XP
          19.3 Manifest XP
               19.3.1 Komponenty Indy
          19.4 Bazy danych
               19.4.1 Pozostałe zmiany:
          19.5 .NET
          19.6 Modyfikacje kompilatora
     20 Podsumowanie


Niektóre spośród tych elementów Delphi poznałeś już w rozdziale pierwszym, lecz wówczas starałem się omówić je raczej pobieżnie. Teraz masz okazję zapoznać się dogłębnie z funkcjami dostępnymi w Delphi; będę także zaznaczał, jakie elementy są charakterystyczne dla nowej wersji Delphi.

W tym rozdziale:

  • zapoznasz się z opcjami Delphi;
  • nauczysz się pisać aplikację MDI;
  • dowiesz się więcej o nowościach w Delphi 7.

Paski narzędziowe


W każdej aplikacji Windows za pomocą pasków narzędziowych można uzyskać szybki dostęp do określonych funkcji programu. W większości przypadków paski są jedynie „skrótami” do rzeczywistych poleceń umieszczonych w menu programu; najczęściej paski zawierają tylko te najbardziej użyteczne funkcje — tak też jest w środowisku Delphi.

W Delphi 7 wprowadzono nowy styl („styl XP”) pasków narzędziowych oraz menu, upodobniony do wyglądu pasków z systemu Windows XP.

Pasek Standard


Już z sama nazwa Standard (ang. standardowy) wskazuje na to, że ów pasek narzędziowy zawiera podstawowe opcje Delphi. Tak jest w istocie — spójrz na rysunek 4.1.
 

Rysunek 4.1. Pasek Standard

Na rysunku 4.1 opisałem także przeznaczenie każdego przycisku tego paska narzędziowego.
Przycisk Otwórz umożliwia otwieranie tylko pojedynczych modułów lub całych projektów, natomiast za pomocą przycisku Otwórz projekt (ang. Open Project) można otwierać tylko główne projekty DPR .

Dwa ostatnie przyciski Add file to Project (Dodaj plik do projektu) i Remove file from Project (Usuń plik z projektu) umożliwiają dodanie pliku do projektu lub usunięcie go z projektu. Po kliknięciu jednego z tych przycisków Delphi doda lub usunie odpowiednią deklarację w sekcji uses modułu.

Pasek View


Pasek View przedstawiony został na rysunku 4.2.
 

Rysunek 4.2. Pasek View

Za pomocą tego paska można włączyć podgląd (View) — czy to modułu, czy formularza. Pierwsze dwa przyciski powodują wyświetlenie okien, w których możesz wybrać podgląd modułu albo formularza.
Za pomocą trzeciego od lewej przycisku można przemieszczać się pomiędzy formularzem a modułem; przycisk ten pełni taką samą funkcję jak klawisz F12.

Ostatni przycisk umożliwia tworzenie nowego formularza w ramach obecnego projektu — tworzeniem aplikacji zawierających kilka formularzy zajmiemy się w dalszej części tego rozdziału.

Funkcje paska View są raczej rzadko używane, nie będziesz miał więc okazji intensywnie z niego korzystać — częściej za to używa się skrótów klawiaturowych wywołujących te same funkcje, co wspomniane przyciski.

Pasek Debug


Pasek Debug związany jest z uruchamianiem programu oraz jego krokowym wykonywaniem. Ów pasek narzędziowy został przedstawiony na rysunku 4.3.
 

Rysunek 4.3. Pasek narzędziowy Debug

Pierwsza ikona służy do kompilacji i uruchamiania projektu — pełni taką samą funkcję co polecenie Run z menu Run. Druga ikona związana jest z czasowym zatrzymaniem wykonywania programu — jest to odpowiednik polecenia Program Pause z menu Run.

Ostatnie dwa przyciski służą do pracy krokowej, powodują bowiem wykonanie programu instrukcja po instrukcji. Oznacza to, że każda operacja programu jest monitorowana przez kompilator, a odpowiedni wiersz w kodzie źródłowym — podświetlany. Jedyna różnica pomiędzy tymi dwoma przyciskami polega na tym, że kliknięcie przycisku Trace Into włącza szczegółowe przeszukiwanie kodu procedur, natomiast opcja Step Over oznacza krokowe wykonanie bez wglądu w procedury.

Pasek Desktop


Rysunek 4.4. przedstawia wygląd paska Desktop.
 

Rysunek 4.4. Pasek narzędziowy Desktop

Wbrew pozorom funkcje z paska Desktop są bardzo przydatne — przynajmniej ja często z niego korzystam. Dzięki niemu można łatwo zapisać dotychczasowe ustawienia projektu — oznacza to, że możesz np. ukryć okno drzewa obiektów, rozciągnąć formularz i takie ustawienia zapisać. Po kolejnym uruchomieniu Delphi okno drzewa obiektów nie będzie już widniało w „krajobrazie” Delphi.

Proste ćwiczenie:

  1. Zamknij okno drzewa obiektów, jak tak zamykasz każde okno Windows.
  2. Rozciągnij Inspektora obiektów na całą wysokość ekranu.
  3. Rozciągnij także Edytor kodu na całą szerokość oraz wysokość okna.
  4. Teraz kliknij pierwszy przycisk paska Desktop — pojawi się okno, w którym musisz podać nazwę schematu ustawień. Naciśnij OK.

Od tej pory takie ustawienia będą ustawieniami domyślnymi.

Pasek Custom


Pasek narzędziowy Custom posiada tylko jeden przycisk — nie ma zatem wiele do opisywania. Przycisk ten powoduje otwarcie systemu pomocy Delphi.

Pasek Internet


Pasek Internet jest domyślnie ukryty — możesz go wywołać, wybierając z menu polecenia View/Toolbars/Internet. Funkcje tego paska są związane z bardziej zaawansowanym aspektem, a mianowicie WebSnap. Technologię WebSnap opiszę w dalszej części niniejszej książki.

Repozytorium


Repozytorium to okno, które pojawia się po wybraniu z menu File pozycji New/Other (rysunek 4.5).


Rysunek 4.5. Okno dialogowe Repozytorium

Okno Repozytorium umożliwia tworzenie nowych projektów, formularzy, bibliotek DLL i innego rodzaju specjalistycznych przedsięwzięć, w których wykorzystywane jest Delphi. Jego obsługa nie jest trudna — wystarczy spośród wielu zakładek wybrać interesujący nas projekt, a następnie kliknąć przycisk OK. Zostanie utworzony nowy projekt.

Dodawanie projektu do Repozytorium


Możliwe jest dodanie naszego projektu do okna Repozytorium. Nie jest to trudne, a po dokonaniu tego zabiegu można będzie tworzyć kolejne projekty w bardzo prosty sposób. Dodawanie projektów do Repozytorium jest dobrym pomysłem w przypadku, gdy nasza aplikacja ma być szablonem.

Utwórz jakiś przykładowy projekt. Niech nie będzie to nic skomplikowanego — wystarczy zwykły formularz z jedną etykietą umieszczoną na środku. Następnie z menu Project wybierz polecenie Add to Repository. Wyświetlone zostanie wówczas okno przedstawione na rysunku 4.6.


Rysunek 4.6. Okno Add to Repository

Przed dodaniem naszego formularza do Repozytorium należy podać parę informacji dotyczących projektu.
I tak w pierwszym polu — Title — należy wpisać tytuł, jaki określać będzie nasz formularz w oknie Repozytorium; wpisz np. My1stProject.

Drugie pole — Description — służy do umieszczenia krótkiego opisu; wpisz np. Projekt Hello World.

Lista rozwijalna Page służy do wyboru zakładki, w jakiej umieszczona zostanie nowa ikona naszego formularza — wybierz zakładkę Project.

W polu Author wpisz swoje imię i nazwisko. Możesz także ewentualnie wybrać ikonę, która określać będzie nową pozycję w Repozytorium.

Po naciśnięciu przycisku OK nowa ikona zostanie dodana do zakładki Project.

Jeżeli będziesz chciał w przyszłości otworzyć ów formularz, zostaniesz poproszony o wskazanie miejsca, w którym mają być zapisywane odpowiednie pliki.

Opcja Add to Project znajduje się również w menu podręcznym, które dostępne jest po kliknięciu prawym przyciskiem myszy w obszarze formularza.

Ustawienia Repozytorium


Usunięcie pozycji z Repozytorium lub jej zmiana może być dokonana za pośrednictwem okna Object Repository, które można wywołać poprzez menu Tools/Repository. Istnieje w nim możliwość usunięcia lub dodania danej zakładki oraz usunięcia lub dodania konkretnej pozycji z danej zakładki.

Praca z paletą komponentów


Okno palety komponentów (rysunek 4.7) może być — tak, jak paski narzędzi — dowolnie przemieszczane.


Rysunek 4.7. Okno palety komponentów

Zawiera szereg zakładek tematycznych — na każdej zakładce znajdują się komponenty danej kategorii.

Umieszczanie kilku obiektów naraz


Do tej pory umieszczałeś dany obiekt w jednym tylko egzemplarzu. Oznacza to, że po umieszczeniu komponentu na formularzu należało znowu kliknąć określoną ikonkę, aby jeszcze raz umieścić kontrolkę na formularzu. Tymczasem możliwe jest umieszczanie kilka razy tego samego komponentu bez konieczności wykonywania aż tylu kliknięć. W tym celu podczas klikania konkretnej ikony komponentu należy nacisnąć przycisk Shift. Wówczas wokół ikony pojawi się niebieska obwódka — przeprowadźmy mały test:

  1. Przytrzymując klawisz Shift, kliknij ikonę komponentu TLabel. Komponent zostanie oznaczony niebieską obwódką (rysunek 4.8).
  2. Umieść kursor nad formularzem — każde kliknięcie lewego przycisku myszy w obrębie formularza powodować będzie umieszczenie w nim komponentu TLabel.


Rysunek 4.8. Oznaczenie ikony komponentu TLabel

Na każdej zakładce palety komponentów znajduje się przycisk z ikonką kursora — kliknięcie go spowoduje dezaktywację opcji i — w konsekwencji — zniknięcie niebieskiej obwódki.

Menu palety komponentów


Paleta komponentów posiada swoje menu podręczne — po kliknięciu prawym przyciskiem myszy w obszarze palety pojawi się menu z listą opcji.

Pozycja Tabs powoduje rozwinięcie kolejnej listy z nazwami zakładek. Po kliknięciu którejś z nich Delphi przejdzie do żądanej zakładki.

Pole Show Hints włącza lub wyłącza „dymki” podpowiedzi, pojawiające się po przytrzymaniu kursora nad danym komponentem. Domyślnie ta opcja jest włączona.

Pozycja Hide służy do ukrycia palety komponentów. W celu ponownego wyświetlenia należy kliknąć polecenie menu: View/Toolbars/Component Palette.

Wybranie polecenia Help spowoduje wyświetlenie odpowiedniej strony pomocy Delphi. Na owej stronie wyświetlona zostanie pomoc dotycząca palety komponentów.

Ostatnia pozycja to Properties — jej wybranie spowoduje wyświetlenie okna właściwości palety komponentów (rysunek 4.9).


Rysunek 4.9. Okno Palette Properties

Właściwości palety komponentów


Okno właściwości palety umożliwia dostosowanie ustawień konkretnej zakładki. Za pomocą pierwszego przycisku — Add — można dodać nową zakładkę. Przycisk Delete spowoduje usunięcie zaznaczonej zakładki (zakładka jednak musi być pusta przed jej usunięciem), a Rename — zmianę nazwy zakładki.

Po zaznaczeniu konkretnego komponentu w oknie po prawej stronie uaktywniane są tylko trzy przyciski. Dwa z nich — MoveUp i MoveDown — służą do zmiany pozycji wyświetlania danego komponentu; przycisk Delete natomiast zmienia się w przycisk Hide, który umożliwia ukrycie danego przycisku.

Przemieszczanie komponentów na inne zakładki jest możliwe za pomocą metody „przeciągnij i upuść”. Wystarczy zaznaczyć któryś z komponentów i przeciągnąć go na zakładki.

Projektant formularzy


Być może myślisz, że poznałeś już wszystko, co oferuje Ci Projektant formularzy, lecz jest jeszcze parę funkcji menu, o których powinieneś wiedzieć.

Jak już zapewne zdążyłeś zauważyć, Inspektor obiektów jest pokryty pomocniczą siatką, która ułatwia dopasowanie położenia komponentu. Dokładne położenie danego obiektu możesz wyznaczać dzięki klawiszom strzałek — przytrzymując klawisz Ctrl i naciskając te klawisze możesz sterować położeniem aktualnie zaznaczonego komponentu. W takim wypadku pozycja może być określona z dokładnością do piksela.

Inną funkcję pełni klawisz Shift. Po jego przytrzymaniu można zmieniać rozmiary komponentów (także z dokładnością do piksela).

Możliwe jest zaznaczenie kilku (kilkudziesięciu lub kilkuset) komponentów naraz i przemieszanie ich wszystkich razem. W trakcie obrysowywania wszystkich obiektów zostaną one zaznaczone (rysunek 4.10).

 

Rysunek 4.10. Trzy obiekty zaznaczone na formularzu

Gdy masz zaznaczone te kilka obiektów, możesz je przemieszczać, zmieniać ich rozmiary lub edytować wspólne dla nich właściwości (tylko takie właściwości będą wyświetlane w Inspektorze obiektów).

Przeprowadź małe doświadczenie. Obrysuj wszystkie kontrolki, które umieściłeś na formularzu — wówczas w Inspektorze obiektów pojawią się właściwości wspólne dla tych wszystkich obiektów. Jeżeli wszystkie zaznaczone obiekty są komponentami wizualnymi, w Inspektorze obiektów powinieneś znaleźć gałąź Font. Rozwiń ją i zmień wartość właściwości Size na 12 — czcionka wszystkich komponentów powinna zostać zmieniona na rozmiar 12 punktów.

Menu projektanta formularzy


Kliknięcie prawym przyciskiem myszy w obszarze formularza spowoduje rozwinięcie menu podręcznego; opcje te dostępne są także w menu Edit. Dzięki nim możesz sterować obiektami umieszczonymi na formularzu — określać automatycznie ich położenie itp.

Edycja obiektów


Po zaznaczeniu któregoś z komponentów możesz kliknąć go prawym przyciskiem myszy i rozwinąć polecenie Edit. W podmenu tym znajdują się typowe opcje dotyczące zaznaczonego obiektu, jak np. Cut (wycinanie), Copy (kopiowanie obiektu), Paste (wklejanie obiektu ze schowka), Delete (usuwanie zaznaczonego obiektu), Select All (zaznaczenie wszystkich obiektów na formularzu) czy Undo (cofnięcie ostatniej operacji).

Operacje te wykonać możesz także za pomocą skrótów klawiaturach, jak np. Ctrl+X (wycinanie), Ctrl+C (kopiowanie), Ctrl+V (wklejanie) i Ctrl+A (zaznaczenie wszystkich obiektów).

Przeprowadź małe doświadczenie: zaznacz dwa komponenty TLabel, które uprzednio umieściłeś na formularzu. Następnie z menu Edit wybierz Copy; w tym momencie do schowka powędrowały dwa obiekty typu TLabel. Kliknij w obszarze formularza — spowoduje to usunięcie zaznaczenia wszystkich komponentów. Teraz z menu Edit wybierz Paste — do formularza dodane zostaną dwa komponenty ze schowka. Zwróć uwagę na to, że nie dopuszczono do sytuacji, w której na formularzu znalazłyby się dwa komponenty o tej samej nazwie — pola Name obiektów, które uprzednio były w schowku, zostały zmienione.

Położenie obiektów


Podręczne menu (lub, jak kto woli, menu Edit) oferuje także opcje służące do kontroli położenia obiektu. Są to pozycje Send to Back oraz Bring to Front. Obie są używane w sytuacji, gdy dwa obiekty nakładają się na siebie. Spójrz na rysunek 4.11. Widnieją na nim dwa obiekty: jeden (TButton) jest umieszczony nad drugim (TMemo).


Rysunek 4.11. Dwa obiekty nałożone na siebie

Opcje Send to Back oraz Bring to Front umożliwiają właśnie ustawienie, która z tych kontrolek będzie znajdować się na wierzchu, a która pod spodem. Pierwsza nich (Send to Back) spowoduje schowanie zaznaczonego obiektu pod obiekt, na którym się znajduje. Druga natomiast (Bring to Front) wysuwa zaznaczoną kontrolkę na wierzch.

Pozycja komponentów
~~~~~~~~~~~~~

Po wyświetleniu menu podręcznego i wybraniu polecenia Position zostanie rozwinięte podmenu poleceń związanych z ustawieniami położenia kontrolek.

Za pomocą pierwszego z nich — Align to Grid — możliwe jest umiejscowienie komponentów zgodnie z siatką formularza. Inaczej mówiąc, opcja ta umożliwia wyrównanie komponentów.
Wybranie kolejnego polecenia — Align — spowoduje wyświetlenie okienka Alignment (rysunek 4.12).


Rysunek 4.12. Okno Alignment

Okno Alignment umożliwia ustawienie położenia komponentów względem siebie. Przykładowo możesz zaznaczyć dwa komponenty jednocześnie — TMemo oraz TButton. Po wyświetleniu okna Alignment i wybraniu pozycji Center zarówno w ramce Horizontal, jak i Vertical komponenty zostaną ustawione pośrodku względem siebie (rysunek 4.13).

 

Rysunek 4.13. Komponenty wyśrodkowane względem siebie

Następna pozycja w menu Position to Size. Umożliwia ona dopasowanie rozmiarów komponentów względem siebie, czyli np. dokładne dopasowanie wielkości komponentów czy też dopasowanie do większego z zaznaczonych obiektów.

Pozycja Scale powoduje zmianę rozmiarów obiektów w skali procentowej. Wystarczy w okienku, które pojawi się po wybraniu opcji Scale, wpisać liczbę pomiędzy 25 a 100.

Następna pozycja to Tab Order. Po wybraniu tego polecenia wyświetlone zostanie okno, w którym istnieje możliwość ustawienia kolejności, w jakiej po naciśnięciu przycisku Tab zaznaczane będą komponenty. Istnieje bowiem możliwość przemieszczania się po komponentach umieszczonych na formularzu za pomocą przycisku Taba. Nie jest to jednak zbyt popularna opcja — zapewne nie będziesz z niej często korzystał.

Kolejna opcja — Creating Order — umożliwia ustawienie kolejności, w jakiej podczas uruchamiania programu będą tworzone komponenty niewidoczne. Zazwyczaj w takiej sytuacji komponenty są tworzone w kolejności umieszczenia ich na formularzu — możesz to jednak zmienić za pomocą okna Creating Order.

Kolejne dwie pozycje menu — View as Form oraz Add to Repository — powinny być Ci już znane; miałeś okazję sprawdzić, jak działają.

Ostatnia pozycja — Text DFM — pojawiła się po raz pierwszy w Delphi 5. Domyślnie jest ona zaznaczona, co powoduje, że pliki *.dfm projektu są zapisywane w postaci tekstowej; usunięcie jej zaznaczenia spowoduje zapisywanie plików w postaci binarnej.

Drzewo obiektów


Drzewo obiektów służy do graficznego przedstawienia wzajemnej relacji pomiędzy obiektami graficznymi i niewidocznymi. Okno drzewa obiektów zostało zaprezentowane na rysunku 4.14.


Rysunek 4.14. Drzewo obiektów

Po zaznaczeniu konkretnej pozycji w Inspektorze obiektów pojawiają się właściwości konkretnego obiektów, a sam obiekt w formularzu zostaje zaznaczony. Jak widać na rysunku 4.14, istnieje możliwość zaznaczenia wielu obiektów naraz, co daje efekt identyczny z obrysowaniem lub pojedynczym zaznaczaniem obiektów na formularzu.

Inspektor obiektów


Mogłoby się wydawać, że znasz już wszystkie istotne informacje dotyczące Inspektora obiektów — używałeś go w końcu często podczas dotychczasowej pracy z Delphi. Postaram się jednak teraz omówić te opcje Inspektora Obiektów, z którymi nie miałeś wcześniej do czynienia.

Począwszy od Delphi 6, Inspektor obiektów umożliwia wyświetlanie właściwości kilku obiektów, które są ze sobą powiązane (rysunek 4.15).


Rysunek 4.15. Powiązane obiekty przedstawione w Inspektorze obiektów

Każdy formularz posiada właściwość ActiveControl, określającą, która z kontrolek będzie aktywna zaraz po uruchomieniu programu. Po wybraniu z listy rozwijalnej nazwy którejś z kontrolek (np. Button1) istnieje możliwość rozwinięcia listy wszystkich właściwości owego komponentu Button1.

Menu podręczne Inspektora obiektów


Po kliknięciu prawym przyciskiem myszy w obszarze Inspektora obiektów pojawi się menu podręczne. Ciekawą opcją menu jest opcja Arrange, która umożliwia uporządkowanie właściwości według nazwy (by Name) lub kategorii (by Category). Uporządkowanie właściwości na kategorie da taki efekt, jak przedstawiony na rysunku 4.16.


Rysunek 4.16. Właściwości Inspektora obiektów uporządkowane według kategorii

Tak samo jest z zakładką Events — tam również zdarzenia mogą być sortowane według nazwy lub kategorii.

Właściwości Inspektora obiektów


W menu podręcznym znajduje się opcja Properties — po jej kliknięciu mamy możliwość ustawienia różnych opcji dotyczących Inspektora obiektów, w tym kolorów używanych przez to okno (rysunek 4.17).


Rysunek 4.17. Okno ustawień Inspektora obiektów

Po lewej stronie tego okna znajdują się opcje dotyczące kolorystyki Inspektora obiektów — możemy np. ustawić kolor wyświetlania właściwości tylko do odczytu lub kolor tła.

Prawa strona to już opcje ściśle związane z ustawieniami Inspektora obiektów. Krótkie omówienie tych opcji znajduje się w tabeli 4.1 oraz 4.2.

Tabela 4.1. Opcje ramki Options
OpcjaOpis opcji
Show instance listJeżeli pozycja jest zaznaczona, to Inspektor obiektów będzie posiadał u góry listę rozwijalną z obiektami znajdującymi się na formularzu
Show classname in instance listGórna lista Inspektora obiektów zawierać będzie także nazwę klasy, a nie jedynie nazwę kontrolki.
Show Status barJeżeli opcja jest zaznaczona, na dole Inspektora obiektów wyświetlany będzie pasek stanu
Render background gridDzięki tej opcji każda z właściwości oddzielona jest od pozostałych poziomą linią
Integral heightOpcja ta dotyczy rozciągania Inspektora obiektów w pionie. Jeżeli opcja jest zaznaczona, wysokość będzie dopasowana do ostatniego wiersza Inspektora obiektów
Show read only propertiesDomyślnie niezaznaczona. Pokazuje także właściwości Inspektora obiektów, które są jednie do odczytu
Bold non default valuesWyświetla pogrubionym krojem te wartości, które nie są domyślne


Tabela 4.2. Opcje ramki References
OpcjaOpis opcji
Expand inlineOpcja dotyczy tego, o czym mówiłem na początku, czyli pokazywania właściwości obiektu połączonego. Jeżeli opcja jest wyłączona, takie właściwości nie będą się pojawiały
Show on events pageJeżeli opcja nie jest zaznaczona, w zakładce Events nie pojawią się właściwości powiązanego komponentu


Eksplorator kodu


Eksplorator kodu to okienko, które domyślnie jest „zadokowane” w edytorze kodu. Przedstawia ono (rysunek 4.18) moduły oraz komponenty użyte w danym module.


Rysunek 4.18. Klasy i moduły użyte w pliku Unit1.pas

Po kliknięciu danej pozycji w Eksploratorze kodu Delphi ustawi kursor na jej deklaracji. Jeżeli zatem klikniesz np. pozycję Classes/Form1/Published/Memo1, to kursor zostanie ustawiony w miejscu deklaracji obiektu Memo1.

Okno Eksploratora kodu także posiada swoje menu podręczne. Ciekawym poleceniem jest New, dzięki któremu możemy przykładowo dodać moduł do listy uses czy utworzyć nową zmienną — Delphi automatycznie doda odpowiednią deklarację do kodu.

Przejdź do gałęzi Variables/Constans (zmienne i stałe), kliknij ją prawym przyciskiem myszy i z menu wybierz New. W Eksploratorze kodu dodana zostanie nowa pozycja; po wpisaniu np. S : String w Edytorze kodu zostanie dodana nowa zmienna globalna S.

Istnieje także możliwość ustawienia bardziej szczegółowych opcji dotyczących Eksploratora kodu. Wystarczy z menu podręcznego wybrać pozycję Properties.

Przeglądarka projektu


Przeglądarka projektu to okno wywoływane poprzez menu View/Browser (rysunek 4.19).


Rysunek 4.19. Przeglądarka projektu

Okno przeglądarki projektu służy do wyświetlania informacji dotyczących projektu: klas, modułów, zawartości klas itp. Wszystko uporządkowane jest w hierarchicznej kolejności obiektów.
 
Oto lista zakładek:

  • Globals — lista klas, właściwości, typów oraz zmiennych.
  • Classes — lista klas VCL, przedstawiona w hierarchicznej kolejności.
  • Units — lista modułów i deklaracji z każdego modułu.



Ogólnie rzecz biorąc, okno Przeglądarki obiektu wydaje się trochę zapominane; ja sam przyznam szczerze, że prawie w ogóle z niego nie korzystam, podobnie jak wielu programistów. Może Ty będziesz zaglądać do niego częściej?

Lista To-Do


To do w dosłownym tłumaczeniu oznacza do zrobienia. Podczas prac nad dużym projektem, w których bierze udział wiele osób, bardzo przydaje się taka lista zadań do wykonania i spraw już gotowych. W tym celu Borland udostępnił bardzo wygodne narzędzie, które można wywołać za pośrednictwem menu View/To-Do List (rysunek 4.20).

 

Rysunek 4.20. Lista spraw „do zrobienia”

Menu podręczne zawiera polecenie Add, dzięki któremu możesz dodać nową pozycję. W stosownym oknie powinieneś wpisać potrzebne informacje:

  • Text — informacja (zadanie) do wykonania.
  • Priority — priorytet wykonania operacji.
  • Owner — osoba dodająca notkę.
  • Categroy — kategoria.

Jak widzisz, w oknie To-Do znajduje się jeszcze jedna kolumna — Module — ale o tym powiem nieco później.

Pierwszy „haczyk” umożliwia usunięcie zaznaczenia opcji jako wykonanej (done). Jeżeli opcja nie jest zaznaczona, stanowi to informację dla projektantów, że określone zadanie należy wykonać.

Znaczniki to-do w kodzie


Istnieje także możliwość oznaczenia jako komentarz pewnego fragmentu kodu, który później pojawi się w oknie To-Do. Jest to bardzo wygodne, gdyż informacja znajduje się zarówno w kodzie programu, jak i w oknie To-Do.

procedure TForm1.Button1Click(Sender: TObject);
begin
  StrToInt(edtValue.Text);
  {TODO 8 –oAdam –cWażne: Tutaj dodaj wyjątek!}
end;


Spójrz na powyższy fragment, a dokładniej mówiąc, na komentarz zaczynający się od słowa TODO. W oknie To-Do ten fragment jest identyfikowany podczas analizy kodu. Wybierz teraz ponownie menu View/To-Do list, a w oknie widoczna będzie wpisana w kodzie informacja (rysunek 4.21).


Rysunek 4.21. Nowa pozycja „do zrobienia”

Konstrukcja komentarza, który kwalifikuje się do To-Do, powinna wyglądać następująco:

{TODO 8 –o<osoba dodająca notkę> –c<kategoria>: <informacja>}


Istnieje także możliwość zastąpienia słowa TODO słowem DONE. Wtedy dana notka będzie kwalifikowana jako „zrobione”.

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    StrToInt(edtValue.Text);
        except
          raise;
        end;
  {DONE 8 –oAdam –cWażne: Tutaj dodaj wyjątek!}
end;


Naciśnięcie Ctrl+Shift+T spowoduje wyświetlenie okna służącego do dodania pozycji do okna To-Do List.

Diagramy


Diagramy służą do graficznego przedstawienia zależności między komponentami; korzystamy z nich za pośrednictwem zakładki Diagram w edytorze kodu. Używane są w połączeniu z oknem Object TreeView (drzewo obiektów), tak więc musisz wyświetlić drzewo obiektów, aby móc korzystać z diagramów.

Przeciągając elementy z drzewa obiektów nad diagram (metodą „przeciągnij i upuść”), spowodujesz umieszczenie elementu w diagramie. Używając tego okna, możesz także dodać notki i komentarze przeznaczone dla innych twórców oprogramowania (rysunek 4.22).


Rysunek 4.22. Diagram

Okno Diagram posiada w lewym, górnym rogu listę rozwijalną. Za jej pomocą można utworzyć kilka diagramów. Nazwę konkretnego diagramu ustala się w polu tekstowym Name; możesz dodać także opis w polu Description.

Jak już pisałem, poprzez przeciąganie obiektów z okna Object TreeView umieszczasz odpowiednią ikonę w diagramie. Strzałkę (graficzne położenie) możesz dodać za pomocą przycisku Allude connector.

Komentarz można umieścić w dowolnym miejscu, a realizuje to przycisk Comment block; umieszczenie komentarza jest podobne do umieszczania komponentu.

Korzystanie z diagramów jest raczej dość intuicyjne — jeżeli chcesz zasięgnąć więcej informacji na ten temat, odsyłam Cię do pomocy Delphi.

Code Insight


Tematem kolejnego punktu tego rozdziału jest Code Insight — narzędzie niezwykle pomocne w programowaniu w Delphi. Trudno jest zapamiętać deklarację każdej z procedur czy np. listę metod w danej klasie. Code Insight jest jakby „pomocnikiem”, który ułatwia wpisywanie parametrów do funkcji.
Podstawową funkcją Code Insight jest pokazywanie deklaracji funkcji, którą wpisujemy. Wygeneruj zdarzenie OnClick komponentu TButton i wpisz nazwę polecenia

MessageBox ( 


Po postawieniu nawiasu oznaczającego rozpoczęcie wpisywanie parametrów Delphi wyświetli podgląd parametrów, które mają znaleźć się w funkcji (rysunek 4.23).


Rysunek 4.23. Code Insight w trakcie działania

Pogrubioną czcionką jest zaznaczony parametr, który aktualnie wpisujemy.

Skrótem klawiaturowym, który powoduje wyświetlenie podpowiedzi, jest <i>Ctrl+Shift+spacja</i>.


Code Completion


Inną usługą technologii Code Insight jest Code Completion. Usługa ta umożliwia podgląd wszystkich możliwych w danym momencie do zastosowania procedur, funkcji czy właściwości. Skrótem klawiaturowym Code Completion jest Ctrl+spacja; samo okno przedstawione jest na rysunku 4.24.

 

Rysunek 4.24. Code Completion

W trakcie pisania kodu po postawieniu operatora kropka (.) także wyświetlona zostanie lista wszystkich metod danego obiektu (klasy).

Lista Code Completion jest dopasowywana do tekstu, który aktualnie wpisujesz. Oznacza to, że gdy wpisujesz np. literę B, wówczas na liście Code Completion pojawią się jedynie metody o nazwach zaczynających się na literę B.

Po liście Code Completion możesz przemieszczać się za pomocą klawiszy strzałek na klawiaturze; naciśnięcie przycisku Enter spowoduje wstawienie do kodu zaznaczonej pozycji.

Code Completion — zmiany w Delphi 7


Według zapewnień twórców Code Insight jest teraz szybszy niż poprzednio oraz daje możliwość przejścia do deklaracji danej funkcji lub procedury. Jest to możliwe poprzez naciśnięcie klawisza Ctrl i umieszczenie kursora nad konkretną pozycją Code Insight; po wybraniu konkretnego wiersza Delphi przeniesie nas do deklaracji owej procedury lub funkcji.

W wersjach Professional oraz Enterprise istnieje możliwość wykorzystania Code Completion także w plikach HTML. Poleceniem File/Open możesz otworzyć jakiś plik HTML. Wówczas Code Completion (Ctrl+spacja) będzie zawierał listę możliwych do zastosowania znaczników HTML.

Ustawienia Code Insight


W Delphi 7 wprowadzono możliwość edycji ustawień Code Insight poprzez okno Tools/Editor Options (zakładka Code Insight).

Przede wszystkim lista Code Completion posiada różne oznaczenia kolorystyczne funkcji, procedur i zmiennych. Ustawienie te możesz zmienić w ramce CodeInsight Colors.

Za pomocą suwaka Delay możesz zmienić czas, po którym ujrzysz Code Insight (przypominam, że możesz go wywołać w każdej chwili za pomocą skrótu Ctrl+spacja).

Projekty


Na początku omówię sprawę może dla Ciebie banalną, czyli kompilowanie i uruchamianie aplikacji. Przecież robiłeś to już wiele razy podczas projektowania programów w Delphi, lecz tym razem trzeba dokładniej omówić pewne pojęcia, a mianowicie kompilowanie, budowanie i sprawdzanie błędów.

W menu Project znajdują się trzy polecenia, które nas interesują: Compile, Build, Syntax check.

  • Syntax Check jest najszybszą metodą sprawdzania błędów w aplikacji. Sprawdzanie następuje tylko w tych modułach, w których nastąpiła jakaś zmiana od czasu ostatniej kontroli poprawności. Za pomocą tego polecenia nie dokonuje się kompilacji kodu (modułów i aplikacji wykonywalnej) — sprawdzane jest jedynie, czy kod nie zawiera błędów.
  • Compile powoduje kompilację modułów (plików), które nie zostały jeszcze skompilowane lub w których nastąpiła jakaś zmiana. Najpierw dokonywane jest sprawdzenie błędów — opcja ta nie jest zatem tak szybka, jak Syntax Check.
  • Build jest opcją działającą najwolniej. Powoduje ona kompilację wszystkich modułów oraz całego projektu niezależnie od tego, czy w danych plikach nastąpiły jakieś zmiany czy też nie.

W menu Project znajdują się także dwie inne opcje — Compile All Projects oraz Build All Projects. Te dwie pozycje są wykorzystywane podczas pracy z menedżerem projektów (menedżer projektów zostanie omówiony później).

Opcje projektu


Istnieje możliwość ustawiania opcji specyficznych dla każdego projektu. Ustawienia te są następnie przechowywane w plikach *.dof i *.cfg, a ich kontroli można dokonać w menu Project/Options (rysunek 4.25).
 

Rysunek 4.25. Okno opcji projektu

Okno opcji projektu podzielone jest na kilka zakładek — omówienie ich zajmie najbliższych parę stron.
U dołu okna znajduje się pozycja Default. Po jej zaznaczeniu wszystkie ustawienia dokonane przez Ciebie zostaną ustawieniami domyślnymi.

Zakładka Forms


W zakładce Forms (rysunek 4.25) znajdują się dwie listy, które zawierają nazwy wszystkich formularzy obecnych w programie. Pierwsza lista określa formularze, które będą tworzone automatycznie podczas uruchamiania programu, a druga zawiera te formularze, które należy utworzyć w sposób dynamiczny.

Tworzeniem kilku formularzy w projekcie bardziej szczegółowo zajmę się w dalszej części tego rozdziału.

Zakładka Application


Zakładka Application podzielona jest na dwie ramki — Application Settings oraz Output Settings (rysunek 4.26).


Rysunek 4.26. Okno opcji projektu — zakładka Application

Pierwsza ramka zawiera pole Title, w którym można określić nazwę aplikacji (pojawiającą się na pasku zadań). Wpisanie danych w tym polu nie jest obowiązkowe (jeśli pozostawimy je puste, nazwą będzie nazwa projektu).

Kolejna pozycja — Help file — identyfikuje nazwę pliku pomocy. Możliwe jest bowiem zintegrowanie pliku pomocy (z rozszerzeniem *.hlp) z aplikacją Delphi (w połączeniu z niektórymi właściwościami komponentów — patrz rozdział 3.).

Ważną sprawą jest odpowiedni dobór ikony dla aplikacji wykonywalnej. Za pomocą przycisku Load Icon możesz określić ikonę, która ozdabiać będzie nasz program.

Ikona dla aplikacji wykonywalnej przechowywana jest w pliku *.res, dlatego nie usuń go przez przypadek!


Ramka Output settings zawiera jedno pole Target file extension, które służy do określenia domyślnego rozszerzenia dla programu (domyślnym rozszerzeniem jest *.exe). Możesz wpisać w to pole np. rozszerzenie .ocx, a następnie skompilować program. Zobaczysz, że w katalogu z projektem znajdzie się plik z rozszerzeniem OCX.

Zakładka Compiler


To, co rzuca się w oczy na samym początku, to mnogość opcji; wszystkie one związane są z kompilatorem Delphi. Wygląd tej zakładki przedstawiono na rysunku 4.27. natomiast opis poszczególnych opcji tej zakładki, znajduje się w tabelach 4.3. – 4.5.



Rysunek 4.27. Okno opcji projektu — zakładka Compiler

Tabela 4.3. Ramka Code generation
PozycjaOpis
OptimizationJeżeli opcja jest zaznaczona (domyślne ustawienie), kompilator wygeneruje możliwie jak najefektywniej działający kod
Stack framesWyłączenie tej opcji powoduje, że czas kompilacji będzie możliwie najkrótszy
Pentium-safe FDIVDotyczy starszych procesorów Pentium. Kompilator jest w stanie poradzić sobie z błędem dzielenia zmiennoprzecinkowego
Record field alignmentOkreśla wyrównanie rekordów w pamięci (w bajtach). Możesz wybrać liczbę z listy rozwijalnej


Tabela 4.4. Ramka Runtime Error
Pozycja Opis
Range checkingWłączenie tej opcji powoduje, iż Delphi sprawdza, czy nie przekroczone zostały granice tablic lub zmiennych String
I/O checkingSprawdzenie błędów wejścia-wyjścia
Overflow checkingSprawdzanie, czy liczba Integer mieści się w odpowiednim zakresie


Tabela 4.5. Ramka Syntax Options
PozycjaOpis
Strict var-strings Opcja związana z kompatybilnością długich łańcuchów
Complete boolean evalOpcja związana z operacjami porównania za pomocą operatorów or i and
Extended syntaxOpcja włącza przekazywanie wartości zwrotnych przez funkcje
Typed @ operatorZwiązane z operatorem @ i typami wskaźnikowymi
Open parametersWłącza przekazywanie otwartych łańcuchów w deklaracji funkcji i procedur.
Huge stringsJeżeli opcja jest wyłączona, typ String jest identyfikowany z ShortString. W przeciwnym wypadku przedmiotem identyfikacji jest AnsiString
Assignable typed constantsKompatybilność z Delphi 1. Jeżeli opcja jest włączona, to stałe mogą być modyfikowane (tak jak to miało miejsce w Delphi 1)


Zakładka Compiler posiada także ramkę Debugging, związaną z zachowywaniem informacji potrzebnych debugerowi.

Zakładka Compiler Message


Jedną z nowości w Delphi 7 jest nowa zakładka — Compiler Message — znajdująca się w oknie opcji projektu (rysunek 4.28).

 

Rysunek 4.28. Zakładka Compiler Message

Opcje tej zakładki pozwalają na wyłączenie wyświetlania przez kompilator Delphi określonych ostrzeżeń.
Na samej górze znajdują się dwie pozycje — Show hints i Show warnings. Określają one, czy Delphi ma wyświetlać odpowiednio podpowiedzi i ostrzeżenia. Konkretne ostrzeżenia możesz wyłączyć na liście Warnings.

Zakładka Linker


Zakładka Linker (rysunek 4.29) zawiera nieco bardziej zaawansowane ustawienia Delphi.


Rysunek 4.29. Zakładka Linker

Pierwsza sekcja, Map file, służy do tworzenia tzw. map pliku (projektu) i zarazem określa „szczegółowość” tych map. Delphi podczas kompilacji programu automatycznie tworzy plik *.map zawierający bardziej szczegółowe informacje, takie jak adres startowy, ostrzeżenia i błędy.

Kolejna sekcja — EXE and DLL options — zawiera opcje dotyczące tworzenia pliku wynikowego. Pierwsza opcja określa, czy Delphi ma tworzyć aplikacje konsolowe; kolejne wymuszają na Delphi dołączenie do pliku *.exe informacji na temat zewnętrznego debugera.

Ciekawe opcje zawiera kolejna sekcja — Linker Output. Umożliwia ona bowiem generowanie — zamiast standardowych plików *.dcu — plików *.obj, które obsłużyć może C++ Builder.

W sekcji Memory sizes znajdują się informacje na temat bazowego adresu modułu. Ta opcja jest przeznaczona dla najbardziej zaawansowanych użytkowników — możesz pozostawić tutaj wartości domyślne.

Zakładka Directories/Conditionals


W zakładce Directories/Conditionals znajdują się kontrolki służące do określania różnych ścieżek do plików wymaganych przez Delphi.

Możesz przykładowo określić ścieżkę, w której Delphi umieści pliki wynikowe programu lub ścieżkę do modułów Delphi.

Zakładkę Directories/Conditionals zaprezentowano na rysunku 4.30.


Rysunek 4.30. Zakładka Directories/Conditionals

Pola edycyjne mogą zawierać kilka ścieżek, oddzielonych od siebie znakiem średnika. Aby umilić użytkownikowi pracę, obok każdej takiej kontrolki znajdują się przyciski ze znakiem wielokropka (...). Po kliknięciu przycisku wyświetlone zostanie okno służące do wyboru katalogu.

Zakładka Version Info


Wiele programów działających w systemie Windows posiada dołączone informacje na temat wersji aplikacji. Po otworzeniu okna właściwości danego pliku informacje te można znaleźć na zakładce Wersja.
Zakładka Version Info umożliwia dołączanie do programu takich właśnie informacji (rysunek 4.31).
 

Rysunek 4.31. Zakładka Version Info

Domyślnie opcje dodawania informacji do pliku EXE lub DLL są wyłączone — aby skorzystać z tej zakładki, należy włączyć funkcję poprzez zaznaczenie opcji Include version information in project.

Główna sekcja — Module version number — umożliwia ustawienie wersji aplikacji wykonywalnej. Numer wersji określają cztery numery — Major Version, Minor Version, Release i Build. Po zaznaczeniu pozycji Auto-incremenent build number wartość pola wersji Build będzie automatycznie zwiększana przy każdym zbudowaniu projektu.

Na samym dole zakładki znajduje się lista podzielona na dwie kolumny. Tutaj możesz wpisać nieco więcej informacji dotyczących swojego projektu.

Zakładka Packages


Zakładka Packages (rysunek 4.32) związana jest z tzw. pakietami.


Rysunek 4.32. Zakładka Packages

Ciekawą opcję zawiera sekcja Runtime Packages. Pozycja Build with runtime packages określa, czy pakiety zostaną dołączone do programu, czy też będą zawarte w postaci oddzielnych plików.
Opcja Build with runtime packages ma bardzo ważne znaczenie. Pozostawienie jej wyłączonej powoduje bowiem zmniejszenie rozmiarów aplikacji wykonywalnej o wielkość plików koniecznych do prawidłowego działania programu. Mając pewność, że na maszynie, na której ma być uruchomiony dany program, znajduje się Delphi 7, możesz tę opcję wyłączyć, co znacznie zmniejszy rozmiar pliku EXE.

Pliki projektu


Po zapisaniu projektu na dysku w katalogu pojawi się szereg plików związanych z danym projektem. Niektóre z tych plików generowane są po procesie kompilacji i przeznaczone są jedynie na potrzeby Delphi. Niektóre z nich mogą być zresztą automatycznie odtworzone po kolejnej próbie kompilacji programu. Przykładowo pliki *.dcu to skompilowane pliki modułów Delphi, natomiast pliki z rozszerzeniem *.exe to gotowe do uruchomienia programy, generowane w wyniku procesu kompilacji. Pliki z tymi rozszerzeniami mogą być bez wahania usunięte.

Kolejny rodzaj plików to dane związane z konkretnym ustawieniem opcji projektu, czyli ustawienia kompilatora, ścieżki do modułów itp., przechowywanew plikach *.cfg i *.dof. Owe pliki także mogą zostać usunięte — gdy otworzysz projekt, a Delphi nie będzie mógł odnaleźć danych związanych z opcjami projektu, zastosuje ustawienia domyślne.

Istnieje kilka plików, bez których ponowna kompilacja projektu nie jest możliwa. Do takich plików należą: *.pas (kody źródłowe modułów), *.dpr (plik główny projektu) oraz *.dfm (ustawienia formularza, pozycje i właściwości komponentów).

A zatem podsumujmy:

    • .pas — pliki źródłowe; w nich znajdują się kody źródłowe formularzy i modułów.
    • .dfm — jest to plik formularza; zawiera informacje dotyczące komponentów umieszczonych na formularzu (ich położeniu, nazwie itp.). W przypadku zastosowania biblioteki CLX w miejsce VCL rozszerzeniem tego pliku będzie *.xmf, lecz o tym powiemy dopiero w czwartej części książki).
    • .dcu — skompilowany plik *.pas; nie jest potrzebny — po kolejnej próbie kompilacji Delphi odbuduje plik *.dcu na podstawie kodów źródłowych.
    • .dpr — główny plik formularza.
    • .cfg — konkretne ustawienia kompilatora; mogą być różne dla każdego projektu, stąd w przypadku, gdy Delphi nie będzie mógł znaleźć tego pliku, zastosuje ustawienia domyślne.
    • .dof — dodatkowe opcje projektu; plik zawiera np. informacje o wersji programu itp.
    • .res — tzw. zasoby. O zasobach będzie mowa w dalszej części książki. Plik ten zawiera np. ikonę, która ozdabia plik *.exe. Usunięcie tego pliku może mieć znaczący wpływ na dalsze działanie programu, lecz gdy wiesz, co robisz i jesteś pewien, że brak tego pliku nie wpłynie negatywnie na działanie aplikacji, możesz go usunąć.
    • .ddp — plik diagramu, zawiera informacje o stworzonych przez nas diagramach; także nie jest wymagany podczas kolejnej kompilacji programu.

Domyślne ustawienia Delphi nakazują automatyczne tworzenie kopii zapasowych. Pliki takie mają taką samą zawartość, jak ich pierwowzory — jedyną różnicą jest obecność znaku tyldy (~) w rozszerzeniu.
Jeżeli chcesz wyłączyć opcję tworzenia kopii zapasowych, z menu Tools wybierz polecenie Editor Options. Kliknij zakładkę Display i usuń zaznaczenie pozycji Create Backup File.

Menedżer projektu


Większe programy wymagają wielu wierszy kodu, czasem także wielu plików pomocniczych, jak np. biblioteki DLL czy różne aplikacje EXE. Jak wiesz, Delphi umożliwia pracę w tym samym czasie nad jednym projektem. Jeżeli chcesz edytować projekt biblioteki DLL czy pomocniczej aplikacji EXE, to za każdym razem musisz go otwierać. Dzięki menedżerowi projektu przełączanie się pomiędzy różnymi projektami staje się znacznie prostsze.

Okno menedżera projektu można wyświetlić wybierając pozycję menu: View/Project manager. Samo okno menedżera projektów przedstawione zostało na rysunku 4.33.


Rysunek 4.33. Okno menedżera projektu

Menedżer projektu służy także do graficznego przedstawiania (w formie gałęzi) formularzy i modułów włączonych do danej aplikacji. Łatwo można także dodać lub usunąć dany plik lub nawet cały projekt.

Pasek narzędziowy


Dzięki paskowi narzędziowemu możemy w oknie menedżera projektu dodać lub usunąć jakiś element.
Lista rozwijalna służy do przełączania się pomiędzy dwoma projektami. Przycisk New powoduje otworzenie Repozytorium, a za pomocą przycisku Remove możemy usunąć konkretny plik z projektu lub cały projekt. Ostatni przycisk — Activate — służy do aktywacji konkretnego projektu.
Nazwa aktywnego projektu jest wyświetlana pogrubioną czcionką. Naciśnięcie klawisza F9 spowoduje uruchomienie aktywnego projektu.

Wykonaj teraz pewne ćwiczenie, mające na celu stworzenie nowego projektu i dodanie go do okna Project manager. Naciśnij przycisk New, a z okna Repozytorium wybierz ikonę Application. Spowoduje to utworzenie nowego projektu Delphi, a w centralnym oknie Project manager pojaw się nowa gałąź — Project1.exe.

Aby okno menedżera projektu nie chowało się gdzieś „w głębi”, radzę włączyć opcję Stay On Top (ang. pozostań na wierzchu). Kliknij prawym przyciskiem myszy gdzieś w obszarze okna Project manager i z menu podręcznego wybierz polecenie Stay On Top.

Praca z menedżerem projektu


Kolejnym krokiem podczas pracy z menedżerem projektu będzie utworzenie kolejnego projektu. Ponownie naciśnij przycisk New i wybierz z Repozytorium ikonę Application. W tym momencie okno menedżera powinno wyglądać podobnie do tego z rysunku 4.34.

 

Rysunek 4.34. Okno menedżera projektów z dwoma otwartymi projektami

Po kliknięciu konkretnej pozycji na liście ów plik zostanie otwarty w Edytorze kodu.

Jak widzisz na rysunku 4.34, jeden z projektów jest wyświetlany pogrubioną czcionką. Pogrubienie oznacza aktywny projekt. Po naciśnięciu klawisza F9 Delphi uruchomi aktywny projekt.

Innym sposobem jest użycie przycisku Run z paska narzędziowego Debug. Obok tego przycisku znajduje się inny przycisk, po którego rozwinięciu pojawi się lista rozwijalna, zawierająca aktywne projekty (rysunek 4.35).

 

Rysunek 4.35. Projekty otwarte w oknie Project Manager

Menu podręczne menedżera projektów


Zdecydowałem się opisać menu podręczne menedżera projektów z tego względu, iż jest ono dość obszerne i zależne od tego, jaką pozycję klikniemy. Przykładowo inne menu pojawi się w przypadku, gdy klikniemy prawym przyciskiem w obrębie pola MyGroup, a inne, gdy klikniemy w obszarze AppProject.exe.

Menu grupy projektów


Pisząc o „grupach projektów” mam na myśli najwyższą gałąź, na rysunku 4.34 oznaczoną napisem MyGroup. Menu podręczne może zawierać następujące elementy:

Add New Project


Możesz wybrać tę pozycję menu w celu utworzenia nowego projektu. Jej wybranie spowoduje wyświetlenie Repozytorium, po czym wybrany projekt zostanie dodany do listy menedżera projektów.

Opcja działa tak samo jak przycisk New na pasku narzędziowym okna Project Manager.

Add Existing Project


Cała lista projektów z okna Project Manager może być zapisana w jednym pliku *.bpg. Polecenie Add Existing Project spowoduje otwarcie okna, w którym można wybrać plik *.bpg lub *.dpr, który następnie zostanie dodany do listy menedżera projektów.

Save Project Group, Save Project Group As


Te dwa polecenie służą do zapisywania listy menedżera projektów w jednym pliku *.bpg. Pierwsze z nich powoduje zapisanie projektu, natomiast po wybraniu drugiego polecenia będziesz miał możliwość zapisu listy projektów pod nową nazwą.

View Project Group Source


Wybranie tej pozycji spowoduje wyświetlenie w Edytorze kodu zawartości pliku *.bpg. Plik taki może wyglądać np. tak, jak na listingu 4.1, lecz jego edycja nie jest zalecana. Najlepiej dokonywać zmian z poziomu okien dialogowych Delphi, a zawartość pliku *.bpg pozostawiać bez zmian (plik jest używany przez Delphi).

Listing 4.1. Zawartość pliku *.bpg
#------------------------------------------------------------------------------
VERSION = BWS.01
#------------------------------------------------------------------------------
!ifndef ROOT
ROOT = $(MAKEDIR)\..
!endif
#------------------------------------------------------------------------------
MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
DCC = $(ROOT)\bin\dcc32.exe $**
BRCC = $(ROOT)\bin\brcc32.exe $**
#------------------------------------------------------------------------------
PROJECTS = AppProject.exe
#------------------------------------------------------------------------------
default: $(PROJECTS)
#------------------------------------------------------------------------------
 
AppProject.exe: AppProject.dpr
  $(DCC)


Toolbar


Opcja Toolbar może być albo zaznaczona, albo nie. Określa ona, czy w oknie menedżera projektu pasek narzędziowy ma być widoczny.

StatusBar


Podobnie jak w przypadku opcji Toolbar, pozycja ta może być zaznaczona lub nie. Jeżeli opcja jest zaznaczona, to w oknie menedżera wyświetlony zostanie pasek statusu.

Stay on Top


Jeżeli opcja jest zaznaczona, to okno Project Manager będzie wyświetlone zawsze nad innymi, pozostałymi oknami.

Dockable


Pozycja Dockable umożliwia dokowanie okna Project Manager w innych oknach — np. w Inspektorze obiektów.

Menu Projektu


Po kliknięciu prawym przyciskiem myszy pozycji określającej projekt wyświetlone zostanie menu różne od tego, które przedstawiłem powyżej. Zawiera ono opcje związane z danym projektem.

Add


Możesz skorzystać z opcji Add w celu dodania do projektu nowego pliku, zapisanego już na dysku. Może to być np. plik *.pas lub *.rc.

Remove File


Wybranie opcji spowoduje usunięcie danego pliku z projektu. Dany plik nie jest fizycznie kasowany z dysku, a jedynie nie będzie kompilowany razem z programem.

Save


Opcja powoduje zapisanie wszystkich plików z konkretnego projektu. Działa tak samo jak wybranie polecenia Save All z menu File.

Options


Wyświetlenie ustawień dotyczących projektu możliwe jest także po wybraniu tego polecenia. Opcje projektu były omawiane w poprzednim podpunkcie — „Projekty”.

Activate


Opcja Activate powoduje uaktywnienie zaznaczonego projektu. Działa tak samo jak przycisk Activate na pasku narzędziowym.

Compile


Po wybraniu opcji Compile zostaną skompilowane wszystkie pliki z danego projektu, które uległy zmianie od czasu ostatniej kompilacji. Opcja działa tak samo jak polecenie Compile z menu Project.

Build


Opcja Build działa tak samo jak polecenie Build z menu Project, czyli powoduje zbudowanie (ponowne skompilowanie) całego projektu — niezależnie od tego, czy nastąpiły w nim zmiany od czasu ostatniej kompilacji.

View Source


Opcja ta powoduje wyświetlenie w Edytorze kodu zawartości pliku *.dpr; działa tak samo, jak polecenie View Source z menu Project.

Close


Opcja powoduje zamknięcie zaznaczonego projektu. Jeśli będzie to konieczne, przed zamknięciem zostaniesz zapytany, czy chcesz zapisać zmiany w projekcie.

Remove Project


Usunięcie całego projektu z menedżera projektów jest możliwe dzięki poleceniu Remove Project.

Build Sooner, Build Later


Te dwie opcje powodują zamianę miejsc w oknie menedżera projektów. Po wybraniu polecenia Build Sooner zaznaczony projekt jest przesuwany o jedną pozycję wyżej na liście. Dzięki temu mamy możliwość ustalenia kolejności, w jakiej dane projekty będą kompilowane.

Compile All from Here, Build All from Here


Te dwie opcje są jedną z nowości w Delphi 7. Umożliwiają one kolejno kompilację oraz ponowne zbudowanie projektów, począwszy od miejsca zaznaczenia. Jeżeli mamy w menedżerze wiele projektów, po wybraniu tych opcji zbudowany zostanie zaznaczony projekt i inne projekty, znajdujące się poniżej.

Nie należy zapominać o dwóch opcjach znajdujących się w menu Project: Compile All oraz Build All. Powodują one kompilację oraz zbudowanie wszystkich projektów otwartych w oknie menedżera.

Kilka wersji językowych projektu


Tworzenie kilku wersji językowych projektu stało się bardzo proste dzięki przydatnemu narzędziu firmy Borland — Translation Manager. Dane odpowiadające za wyświetlenie programu w innej wersji językowej są przechowywane w jednym pliku, więc w razie potrzeby wystarczy w katalogu umieścić taki plik, aby cały program zaczął działać w innej wersji językowej.

Tworzymy angielską wersję językową


Utwórz jakiś zwykły, prosty projekt i umieść w nim jeden przycisk oraz jedną etykietę (TLabel). Zmień właściwość Caption obydwu komponentów na: Przycisk 1 oraz Komponent TLabel. Projekt zapisz pod jakąkolwiek nazwą.

Pierwszym krokiem w tworzeniu drugiej wersji językowej jest uruchomienie specjalnego kreatora. Z menu File wybierz Other — otwarte zostanie okno Repozytorium. Wybierz pozycję Resource DLL Wizard, która spowoduje otwarcie kreatora (rysunek 4.36).


Rysunek 4.36. Kreator zasobów

Wcześniej możesz zostać zapytany o to, czy chcesz zapisać dany projekt (jeżeli jeszcze tego nie zrobiłeś).
Pierwszym krokiem jest kliknięcie przycisku Next; w kolejnej zakładce będziesz musiał określić pliki, które mają zostać przetłumaczone. Domyślną pozycją jest katalog z naszym programem, więc nie będziesz musiał tu nic zmieniać. Naciśnij ponownie Next.

Kolejne okno zawiera spis języków. Tutaj będziemy musieli określić, na jaki język chcemy przetłumaczyć aplikację. Zaznacz pozycję Angielski (Stany Zjednoczone) i naciśnij przycisk Next.

W dalszych zakładkach naciskaj już tylko klawisze Next — nie będziemy wprowadzali tutaj żadnych zmian. Ostatnia zakładka będzie zawierała przycisk Finish — po jego naciśnięciu zostaniesz zapytany, czy chcesz przekompilować projekt. Odpowiedz twierdząco. Delphi następnie przekompiluje projekt i wyświetli podsumowanie (rysunek 4.37).
 

Rysunek 4.37. Podsumowanie procesu kompilacji projektu

Oprócz wyświetlenia podsumowania w Edytorze kodu wyświetlona zostanie zawartość nowego pliku TransApp.dpr (nazwa projektu nie ma znaczenia), taka jak na listingu 4.2.

Po naciśnięciu przycisku OK Delphi zaproponuje Ci zapisanie pliku *.bpg, czyli menedżera projektu. Zapisz go pod dowolną nazwą.

Listing 4.2. Zawartość nowego pliku DPR
// Do not edit. This file is machine generated by the Resource DLL Wizard.
 
library TransApp;
 
{ITE} {LCID:00000415:00000409} {}
{ITE} {DFMFileType} {MainFrm.dfm}
{ITE} {RCFileType} {TransApp_DRC.rc}
 
{$R 'MainFrm.dfm' MainForm:TForm}
{$R 'TransApp_DRC.res' 'TransApp_DRC.rc'}
 
{$E enu}
 
begin
end.


Zawartość tego pliku nie jest przeznaczona do edycji, także nie będziesz musiał dokonywać tutaj jakichkolwiek zmian. Spójrz teraz na katalog, w którym umieściłeś projekt. Możesz zauważyć, że utworzony został nowy folder — enu. Folder ten zawiera kopię plików *.dfm oraz *.dpr. Ich tłumaczeniem zajmiemy się za chwilę.

Tłumaczenie projektu


Jeżeli podczas zakończenia pracy z kreatorem zasobów zapisałeś plik *.bpg, został otwarty program Translation Manager, którym będziemy posługiwać się podczas procesu tłumaczenia zasobów. Program dzieli się na trzy zakładki; nas będzie interesować ostatnia z nich — Workspace (rysunek 4.38).

 

Rysunek 4.38. Program Translation Manager

Program Translation Manager można uruchomić także poprzez menu View/Translation Manager.

Zakładka Workspace podzielona jest na dwie części. Po lewej stronie znajdują się gałęzie z listą formularzy projektu oraz tzw. resource scripts. Są to wbudowane w plik EXE komunikaty o błędach, nazwy miesięcy itp. Tłumaczenie całości jednak może trochę potrwać, dlatego ja podejmę się przetłumaczenia jedynie nazw komponentów.

Interesuje nas gałąź Forms/MainForm. W prawym oknie mamy podgląd właściwości formularza. W kolumnie Angielski należy wpisać angielskie tłumaczenie określonej właściwości. Uwaga! Tekst musi być wpisany w apostrofy! Po skończeniu pracy należy zapisać projekt (Ctrl+S).

Kompilacja projektu


Po zakończeniu procesu tłumaczenia możesz zamknąć program Translation Manager. Z menu Project wybierz pozycję Build All, co spowoduje zbudowanie obydwu projektów (projektu właściwego oraz przetłumaczonych zasobów).

Po tej operacji w katalogu z programem pojawi się nowy plik z rozszerzeniem *.enuTransApp.enu. Zawiera on skompilowany i przetłumaczony formularz. Od tej pory po uruchomieniu aplikacji w jej katalogu będzie wyszukiwany plik *.enu; jeżeli zostanie znaleziony, zostanie włączona angielska wersja językowa (rysunek 4.39).

 

Rysunek 4.39. Angielska wersja programu

Jeżeli chcesz ponownie przywrócić polską wersję językową, musisz zmienić nazwę pliku *.enu, usunąć go albo przenieść do innego katalogu.

Kod źródłowy prezentowanego tu programu znajduje się na płycie CD-ROM w katalogu ../listingi/4/TransApp.


Kilka formularzy w jednym projekcie


Z czasem, gdy Twoje umiejętności programowania wzrosną, zaczniesz tworzyć skomplikowane programy zawierające po kilka (kilkanaście?) formularzy. Najpierw jednak musisz nauczyć się tworzyć owe formularze. Nie jest to takie trudne, gdyż wiele czynności Delphi wykona za Ciebie (jak np. dodanie deklaracji do listy uses).

Stworzenie nowego formularza opiera się jedynie na wybraniu z menu pozycji File/New/Form, co spowoduje utworzenie nowej zakładki w Edytorze kodu oraz nowego formularza. Jednak utworzenie formularza i jego wyświetlenie to już dwie zupełnie różne sprawy.

Wyświetlenie drugiego formularza


Zapisz cały projekt, w tym dwa formularze. Jeden z nich (główny) nazwij MainFrm.pas, a drugi AboutFrm.pas.

Na formularzu głównym umieść przycisk i wygeneruj jego zdarzenie OnClick.

procedure TMainForm.btnShowMeClick(Sender: TObject);
begin
  { AboutForm to nazwa drugiego formularza, znajdującego się w pliku AboutFrm.pas }
   AboutForm.ShowModal;
end;


Pamiętasz, jak w poprzednim rozdziale podczas omawiania metod klasy TApplication wspomniałem o CreateForm? Teraz masz okazję zapoznać się z przykładem działania owej funkcji. Pierwszym parametrem jest nazwa klasy, która zostanie utworzona, a drugim — zmienna, która reprezentować będzie formularz. Zmiennej nie musimy nigdzie deklarować, gdyż w pliku AboutFrm.pas jest ona zadeklarowana automatycznie.

Druga funkcja — ShowModal — powoduje wyświetlenie formularza w sposób modalny. Istnieją dwie funkcje służące do wyświetlania formularza — Show oraz ShowModal. Funkcja ShowModal powoduje, iż drugi formularz praktycznie blokuje działanie formularza głównego. Dopiero po zamknięciu drugiego formularza (AboutForm) możliwe jest korzystanie z pierwszego. Funkcja Show działa w inny sposób i umożliwia korzystanie z dwóch formularzy naraz.

Delphi jest na tyle „sprytny”, że podczas uruchamiania programu upomni się o to, że nie dodaliśmy deklaracji odpowiedniego modułu do listy uses (rysunek 4.40).


Rysunek 4.40. Informacja o tym, że moduł nie jest dodany

Naciśnij przycisk Yes, aby dodać nazwę modułu do listy uses, a następnie uruchom program. Po naciśnięciu przycisku zostanie wyświetlony drugi formularz.

Kod źródłowy powyższego programu znajduje się na płycie CD-ROM w katalogu ../4/FewForms.

Dynamiczne tworzenie formularza


Przykład zamieszczony w poprzednim podpunkcie dotyczył jedynie wyświetlenia formularza. W rzeczywistości formularz zostaje utworzony na samym starcie aplikacji, a my jedynie go wyświetlamy. Jeśli nie korzystamy z owego formularza, niepotrzebne staje się utworzenie formularza, a co za tym idzie, także zarezerwowanie dlań pamięci.

Z menu Project wybierz polecenie Options i kliknij zakładkę Forms. Zakładka ta dotyczy formularzy, z których korzystamy w programie. Po lewej stronie znajdują się formularze tworzone automatycznie na starcie programu. Zaznacz pozycję AboutForm i kliknij znaczek >. Spowoduje to przemieszczenie zaznaczonej pozycji do prawej listy. Kliknięcie przycisku OK pozwoli na akceptację zmian — od tej pory po uruchomieniu programu formularz nie będzie tworzony automatycznie. Spowodowało to zmianę zawartości pliku głównego dpr (listing 4.3).

Listing 4.3. Zawartość głównego pliku po wprowadzeniu zmian
program FewApp;
 
uses
  Forms,
  MainFrm in 'MainFrm.pas' {MainForm},
  AboutFrm in 'AboutFrm.pas' {AboutForm};
 
{$R *.res}
 
begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.


W kodzie programu nie ma już instrukcji CreateForm, odpowiadającej za utworzenie danego formularza na starcie.

Co należy teraz zrobić, chcąc wyświetlić formularz? Należy go przed wyświetleniem utworzyć, wywołując jego konstruktor:

procedure TMainForm.btnShowMeClick(Sender: TObject);
begin
  AboutForm := TAboutForm.Create(Application);
  AboutForm.ShowModal;
  AboutForm.Free;
end;


Nie zapominaj o tym, że TAboutFrom to nowa klasa formularza drugiego, która także posiada swój własny konstruktor. W parametrze konstruktora należy podać nazwę okna-rodzica — w tym miejscu można wpisać albo nazwę wskaźnika Self, albo Application. Po wyświetleniu formularza należy go zwolnić!

Dociekliwy Czytelnik może zastanowić się przez chwilę w momencie przyglądania się powyższym instrukcjom. Przecież zwolnienie klasy (metoda Free) następuje zaraz po wyświetleniu formularza (metoda ShowModal). „Jak to? Zaraz po wyświetlaniu formularz zostanie zwolniony?” — możesz zapytać. Wykonywanie tego modułu głównego zostanie „zawieszone” do momentu zakończenia prac z drugim formularzem — AboutForm. Oznacza to, że instrukcja Free zostanie wykonana dopiero po zamknięciu okna przez użytkownika.

Aplikacje MDI


Generalnie aplikacje dzielą się na dwa rodzaje: SDI i MDI. W aplikacjach MDI osadzone jest wiele okien wyświetlanych w tym samym czasie. Wygląda to tak: użytkownik w programie może otworzyć wiele dokumentów; każdy z nich jest wyświetlany w osobnym oknie. Możliwe jest przełączanie się między oknami, ich minimalizowanie czy zamykanie.

Poprowadzę Cię krok po kroku w procesie tworzenia aplikacji MDI — będzie to prosty edytor tekstu. Przy tej okazji poznasz zastosowanie paru interesujących komponentów oraz nauczysz się tworzyć własne menu oraz paski narzędziowe.

Projektowanie interfejsu


Nasz program będzie się składał z dwóch formularzy: głównego (centrum dowodzenia) oraz formularza służącego do wyświetlania zawartości pliku tekstowego. Efekt końcowy, jaki chcemy osiągnąć, przedstawiony został na rysunku 4.41.


Rysunek 4.41. Końcowy efekt, jaki chcemy osiągnąć, tworząc program

Na główną część formularza składa się menu (komponent TMainMenu), pasek narzędziowy (TToolBar) oraz pasek stanu (TStatusBar), pełniący funkcję estetyczną oraz służący do wyświetlania podpowiedzi.

Pasek narzędziowy


Umieść na formularzu komponent TToolBar — powinien on zostać umieszczony na samej górze formularza. Następnie odszukaj w Inspektorze obiektów gałąź EdgeBorders i ustaw wszystkie znajdujące się tam właściwości na True. Spowoduje to zaznaczenie obramowań komponentu ze wszystkich stron.

Następnie będziesz musiał utworzyć na pasku kilka przycisków. Wystarczy, że klikniesz pasek prawym przyciskiem myszy — spowoduje to rozwinięcie menu podręcznego. Po wybraniu polecenia New Button na pasku stworzony zostanie nowy przycisk. Utwórz w ten sposób sześć przycisków, a po trzech pierwszych wstaw separator (polecenie New Separator w menu podręcznym).

Dodawanie ikon


„Goły” pasek narzędziowy bez żadnych ikon nie wygląda ciekawie. Należy go czymś przyozdobić. W tym celu umieść na formularzu komponent TImageList, który służy do gromadzenia ikon. Kliknij dwukrotnie ten komponent — spowoduje to wyświetlenie okna przedstawionego na rysunku 4.42.

 

Rysunek 4.42. Dodawanie ikon

Poprzez przycisk Add możesz załadować z dysku jakąś ikonę lub plik *.bmp. Kiedy dodasz już swoje ikonki, ostatecznym krokiem będzie ustawienie pewnej właściwości w komponencie TToolBar. Z właściwości Images komponentu TToolBar musisz wybrać zbiór ikon mających ozdabiać pasek narzędziowy — wybierz nazwę odpowiadającą komponentowi TImageList.

Projektowanie menu


Z menu w Delphi związane są dwa komponenty: TMainMenu oraz TPopupMenu. Pierwszy z nich służy do tworzenia menu znajdującego się u góry okna. Drugi komponent — TPopupMenu — umożliwia stworzenie menu podręcznego wywoływanego po kliknięciu prawym przyciskiem myszy.

W naszej aplikacji skorzystamy z komponentu TMainMenu. Jego edycja odbywa się po dwukrotnym kliknięciu w jego obszarze. Pierwszym krokiem będzie stworzenie głównej pozycji — Plik. Wpisz więc w tym momencie we właściwości Caption słowo Plik; spowoduje to utworzenie pozycji menu.

Na rysunku 4.43 przedstawione zostało menu, jakie użyte będzie w naszym programie.


Rysunek 4.43. Menu użyte w programie

Każda pozycja zawiera jedno puste pole z szarym obramowaniem. Po zaznaczeniu tego pola możemy stworzyć nową pozycję — wystarczy wpisać nową wartość w polu Caption i nacisnąć klawisz Enter.

W celu utworzenia poziomej linii należy w polu Caption wpisać znak –. Cała operacja jest o tyle wygodna, że podczas projektowania aplikacji dysponujemy podglądem tworzonego menu.

Jak widzisz, na rysunku 4.43 znajduje się menu Okno, zawierające polecenie Otwarte okna, które posiada puste podmenu. W naszym programie w tym miejscu znajdzie się lista wszystkich otwartych w programie okien. Podmenu możesz stworzyć, klikając konkretną pozycję (prawym przyciskiem) i wybierając z menu polecenie Create submenu.

Przyozdabianie menu


Ten sam komponent ImageList, który użyty został do stworzenia ikon przycisków paska narzędziowego, może posłużyć do ozdobienia naszego menu głównego. Wystarczy, że po zaznaczeniu obiektu TMainMenu wybierzesz z właściwości Images pozycję imlToolMain (w moim przypadku komponent TImagList nosi akurat taką nazwę).

Każda pozycja w menu posiada ponadto właściwość ImageIndex, która pozwala na wybór konkretnej ikony dla danej pozycji menu (rysunek 4.44).


Rysunek 4.44. Lista możliwych do przypisania — ikon

Przypisz niektórym pozycjom ikony z ImageList.

Pozostałe komponenty


Pozostałe komponenty, z jakich skorzystamy, to OpenDialog oraz SaveDialog. Oba z nich powodują wyświetlanie standardowych okien dialogowych Windows — Otwórz plik… i Zapisz plik…. Należy tylko ustawić we właściwościach tych komponentów odpowiedni filtr.

Filtr powoduje wyświetlenie w oknie Otwórz lub Zapisz plików z odpowiednim rozszerzeniem. Pozwala to użytkownikowi zawęzić obszar poszukiwań do konkretnych plików.

W tym celu posłużymy się właściwością Filter. Po jej zaznaczeniu obok pojawi się przycisk ze znakiem wielokropka. Po jego naciśnięciu wyświetlone zostanie okno edycji filtrów (rysunek 4.45).

 

Rysunek 4.45. Okno edycji filtrów

W kolumnie po lewej stronie znajduje się opis filtru (to, co użytkownik będzie widział na liście rozwijalnej), a po prawej rozszerzenie plików wyświetlanych po wybraniu danego filtra.

Jeżeli chcesz, możesz w komponencie SaveDialog zmienić także właściwość DefaultExt. Dzięki temu w przypadku, gdy użytkownik nie wpisze rozszerzenia, zostanie ono do pliku automatycznie dołączone. To rozszerzenie należy właśnie wpisać we właściwości DefaultExt.

Kod źródłowy przykładowej aplikacji


Kod źródłowy na początku może wydać Ci się skomplikowany, lecz gdy już lepiej poznasz Delphi, okaże się bardzo prosty. A może w przyszłości rozbudujesz edytor, który tu prezentuję?

Wiele instrukcji tu podawanych połączone jest z właściwością ActiveMDIChild, która określa aktywny formularz w aplikacji MDI. Np. metoda kopiująca tekst w naszym programie będzie wyglądać tak:

procedure TMainForm.btnCopyClick(Sender: TObject);
begin
{ kopiuj }
  (ActiveMDIChild as TMDIForm).reDoc.CopyToClipboard;
end;


W powyższym fragmencie zawarte jest znane Ci już rzutowanie. Właściwość ActiveMDIChild rzutujemy na formularz potomny — TMDIForm. Dzięki takiemu zapisowi możemy odwołać się do metody CopyToClipboard komponentu TRichEdit (w tym kodzie występującemu pod nazwą reDoc).

Czy warto?


Zapoznałeś się już nieco z Delphi i pewnie masz wyrobioną opinię na jego temat. Być może jesteś zachwycony tym środowiskiem, ale może zdążyłeś się już zniechęcić, bo uważasz, że nauczenie się go jest bardzo trudne. Niezależnie od Twego zdania zapewne zastanawiasz się, czy warto uczyć się tego języka. Powiem tak: programowanie wcale nie jest proste (ale nie zamierzam tutaj nikogo odstraszać!), trzeba je jednak po prostu lubić! Object Pascal należy do języków programowania najprostszych do nauczenia się, a jednocześnie zapewniających dużą funkcjonalność. Wiele osób sądzi, że nauka Delphi nie ma sensu, gdyż w świecie programistów liczy się jedynie C++. Nie mam zamiaru uczestniczyć w „świętej wojnie” zwolenników Delphi i C++. Powiem tylko, że Object Pascal (Delphi) w niewielkim stopniu ustępuje C++, a dzięki VCL i wszelkim innym udogodnieniom, jakie oferuje, jest środowiskiem godnym polecenia.

Jeżeli więc na tym etapie nie jesteś w stanie zrozumieć wielu rzeczy, to radzę Ci, drogi Czytelniku, abyś opanował te podstawy, gdyż jest to niezbędne do dalszej nauki. Spróbuj przeprowadzić samodzielne ćwiczenia, jeszcze raz dokładnie przeczytać poprzednie rozdziały, wyszukać dodatkowe informacje w Internecie czy w pomocy Delphi. Jeżeli mimo wszystko nadal masz jakieś wątpliwości, nie przejmuj się nimi! Uwierz mi, że wszystko wyjaśni się z czasem… a umiejętności przyjdą wraz z doświadczeniem.

Delphi a C++ Builder


Firma Borland jest także autorem środowiska C++ Builder, które służy do tworzenia aplikacji opartych o język C++. Najciekawsze jest to, że oba środowiska są łudząco do siebie podobne! Jedyną różnicą jest „fundament”: Delphi oparte jest na Object Pascalu, a C++ Builder — na języku C++.

Co prawda tematem tej książki nie jest C++, ale pozwoliłem sobie na małe porównanie tych obydwu środowisk, abyś zdał sobie sprawę ze „stopnia wtajemniczenia”, jakim musi charakteryzować się programista.

Rozmiar aplikacji wykonywalnej i czas kompilacji


Programy napisane w środowisku C++ Builder kompilują się dłużej, a rozmiar pliku wykonywalnego jest większy. Mnie zaraz po uruchomieniu C++ Buildera i próbie kompilacji irytował niezwykle długi czas, jaki potrzebny był na sprawdzenie błędów i kompilację programu. Może i nic w tym dziwnego — język C++ jest bardziej rozbudowany od Object Pascala — lecz ja wciąż nie mogę się do tego przyzwyczaić.

Pliki


Delphi oraz C++ Builder generują różne pliki dla projektów — różnice dotyczą przede wszystkim rozszerzeń, choć nie tylko. Np. plik formularza jest w obu przypadkach taki sam. W tabeli 4.6 przedstawione są rozszerzenia plików Delphi i C++ Builder.

Tabela 4.6. Rozszerzenia plików Delphi i C++ Builder
PlikDelphiC++ Builder
Główny plik projektu*.dpr*.bgr
Pliki kodu źródłowego*.pas*.cpp
Plik nagłówkowybrak*.h lub *.hpp
Skompilowany plik źródłowy*.dcu*.obj
Plik formularza*.dfm*.dfm
Pliki zasobów*.res lub *.dcr*.res
Skompilowany pakiet*.bpl*.bpl
Plik źródłowy pakietu*.dpk*.bpk


Począwszy od Delphi 4, kompilator jest w stanie kompilować pliki *.dcu jako *.obj. Daje to możliwość wykorzystania modułów Delphi w aplikacjach C++ Builder.

Składnia


Tego nie da się ukryć — składnia C++ jest znacznie trudniejsza niż składnia Object Pascala i to właśnie dlatego ten drugi język jest zalecany dla początkujących programistów.

Listing 4.4. Programu napisany w C++ Builder — zawartość głównego pliku *.cpp,
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        catch (...)
        {
                 try
                 {
                         throw Exception("");
                 }
                 catch (Exception &exception)
                 {
                         Application->ShowException(&exception);
                 }
        }
        return 0;
}
//---------------------------------------------------------------------------


Aby zrozumieć powyższy zapis, należy znać zasady składni samego języka C++, co nie jest tematem tego podręcznika. Osobie znającej język C++ ten listing może wydać się prosty i przejrzysty, ale jeżeli pierwszym poznanym przez Ciebie językiem programowania był Turbo Pascal, kod C++ może wydać Ci się odstraszający.

Cechy wspólne


Delphi i C++ Builder posiadają bardzo ważną cechę wspólną — VCL. Jeżeli poznasz choć trochę tę wizualną bibliotekę w Delphi, nie będziesz miał problemów z wykorzystaniem jej w C++ — w obu tych środowiskach jest ona jednakowa. Będziesz tylko musiał poznać podstawową składnię języka C++, znacznie różniącą się od Object Pascala. Jeżeli natomiast znasz trochę PHP lub Javę, będzie to dla Ciebie dobra wiadomość: oba te języki posiadają składnię bardzo podobną do C++.

Druga sprawa to interfejs. Delphi i C++ Builder mają praktycznie identyczny interfejs, takie same narzędzia itp.

Różnice


Łatwiej jest jednak mówić o różnicach niż o cechach wspólnych obydwu tych środowisk. Praktycznie rzecz ujmując, jest mało identycznych elementów składni. Najważniejsze różnice przedstawione zostały w tabeli 4.7.

Tabela 4.7. Wybrane elementy środowisk Delphi i C++ Builder
OpisDelphiC++
Początek blokubegin{
Koniec blokuend}
Operator przypisania:==
Operator porównania===
Operator nierówności!=
Operator odwołania.–>
Łańcuch tekstowy'"
Komentarz wielowierszowy{ } /* */
Instrukcja casecaseswitch
Słowo kluczowe SelfSelfthis
Słowo kluczowe nilnilNULL



Rozważmy przykład pętli. Ich nazwy są podobne, lecz konstrukcja trochę inna. Np. pętla for napisana w C++ Builder wygląda tak:

  for (i=0; i<100; i++) {
 
  }


Jak widzisz, budowa owej pętli jest całkowicie inna niż w Delphi. W języku C++ brakuje również słowa kluczowego then.

Co nowego w Delphi 7?


Każda kolejna wersja Delphi obfituje w nowe narzędzia i komponenty, które mają jeszcze bardziej ułatwić i przyspieszyć projektowania aplikacji. W najnowszej wersji Delphi projektanci skupili się wyraźnie na unowocześnieniu istniejących komponentów i dodaniu nowych, służących do projektowania aplikacji sieciowych.

Oto najważniejsze zmiany, jakie można napotkać w nowym środowisku — Delphi 7.

Zmiany w IDE


Elementem widocznym od razu po uruchomieniu Delphi jest całkowicie zmieniony wygląd menu głównego (rysunek 4.46), wzorowanego obecnie na stylu Windows XP.


Rysunek 4.46. Nowe menu w Delphi 7

Menu Component list


Jeżeli weźmiemy pod uwagę nowe elementy w menu, nie dostrzeżemy zbyt wielu zmian. Jedną z najbardziej istotnych innowacji jest pojawienie się nowego menu — View/Component List. Wybranie tego polecenia powoduje wyświetlenie okna z listą wszystkich możliwych do dodania komponentów (rysunek 4.47).


Rysunek 4.47. Nowe okno Components

W oknie Components istnieje możliwość zaznaczenia kilku komponentów, które następnie zostaną umieszczoen na formularzu. Zaznaczać komponenty należy, przytrzymując klawisz Shift, a następnie trzeba kliknąć przycisk Add to form.

Okno Message Hints


Ciekawą opcją wprowadzoną w Delphi 7 jest okno Message Hints, wywoływane za pośrednictwem menu View/Additional Message Info (rysunek 4.48).

 

Rysunek 4.48. Okno Message Hints

Okno to służy do wyświetlania dodatkowych wskazówek i podpowiedzi dotyczących komunikatów kompilatora. Treść takich wskazówek może być na bieżąco aktualizowana poprzez ściągnięcie odpowiedniego pliku z serwera firmy Borland.

Po naciśnięciu pierwszego przycisku na pasku narzędziowym masz możliwość edycji komunikatu w przypadku pojawienia się jakiegoś błędu.

Pozostałe zmiany


Oprócz zmian wymienionych powyżej są też inne — trochę mniej istotne; nie są na tyle ważne, aby rozpisywać się na ich temat, ale warto o nich wspomnieć.

  • Zakładka Color w oknie Tools/Editor Options zawiera teraz dwie opcje — Foreground Color oraz Background Color.
  • W oknie Message View znajduje się kilka zakładek służących do wyświetlania różnych typów zakładek.
  • Kombinacje klawiszy Alt+Page Down oraz Alt+Page Up powodują przemieszczanie się pomiędzy zakładkami tych okien, które je posiadają — np. Message View czy Edytor kodu.
  • Nowa zakładka Compiler Message w oknie Project/Options/Compiler Message. Pozwala ona na określenie, które komunikaty mają być wyświetlane przez kompilator.

Nowe komponenty


Borland wprowadził także parę zmian dotyczących komponentów. Usprawni nam to trochę pracę i sprawi, że nasze aplikacje będą wyglądały ładniej.

Elementy wizualne w stylu Windows XP


Chyba jedną z ważniejszych zmian dotyczących komponentów jest możliwość tworzenia aplikacji, które wizualnie będą dostosowane do systemu Windows XP. Na palecie Additional znajdują się komponenty, dzięki którym możesz utworzyć menu i paski narzędziowe takie, jak w Windows XP.

Przykład ilustrujący wykorzystanie nowych komponentów w Delphi 7 możesz znaleźć na płycie CD-ROM w katalogu ../listingi/4/WinXP.

Manifest XP


Na palecie Win32 znajduje się komponent TXPManifest. Na pierwszy rzut oka nie wydaje się, aby wykonywał on jakieś specjalne czynności — tak też jest. Za to dzięki niemu biblioteka VCL może wykorzystywać kontrolki Windows XP, czyli bibliotekę Windows Common Controls 6.

Aby wszystkie kontrolki były „w stylu XP”, w katalogu z programem musi się znaleźć plik manifest zawierający instrukcje XML.

Umieść na formularzu komponent TXPManifest (jego nazwę możesz zmienić na XPManifest). Skompiluj program. Od tej pory w zasobach aplikacji wykonywalnej powinny znaleźć się instrukcje:

<?xml version="1.0" encoding="UTF–8" standalone="yes"?>
 
<assembly xmlns="urn:schemas–microsoft–com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
         type="win32"
    name="DelphiApplication"
    version="1.0.0.0" 
          processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common–Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
</assembly>


Kod źródłowy programu wykorzystującego komponent TXPManifest znajduje się w katalogu ../4/Manifest.

Komponenty Indy


W nowej wersji Delphi znalazła się kolejna już wersja popularnego pakietu Indy, służącego do tworzenia aplikacji sieciowych. Autorem pakietu Indy nie jest firma Borland, ale jego duża popularność sprawiła, że został dołączony do środowiska Delphi. Wykorzystaniem komponentów Indy zajmiemy się w rozdziale 11.

Delphi 7 zawiera komponenty Indy w wersji 9.0. Ze strony www.nevrona.com/Indy/ możesz pobrać najnowszą wersję tego pakietu.

Pakiet Indy nie jest jedynym pakietem tego typu. Bardzo popularny i równie dobry (jeżeli nie lepszy), choć trochę trudniejszy, jest pakiet ICS. Komponenty ICS zostały napisane przez belgijskiego programistę i są dostępne na stronie www.overbyte.be.

Pozostałe komponenty

  • Na stronie Dialogs palety komponentów znajduje się nowy komponent – TPageSsetupDialog. Dzięki temu obiektowi możemy wyświetlić standardowe okienko Windows — Ustawienia strony.
  • Zakładka dbExpress zawiera komponent TSimpleDataSet, który zastępuje TSQLClientDataSet. Technologią dbExpress zajmiemy się szczegółowo w rozdziale 5.
Komponenty zmodyfikowane
  • Nowe właściwości klasy TCustomFormScreenSnap oraz SnapBuffer. Kontrolują one, czy formularz dochodzi do skraju ekranu podczas jego przesuwania.
  • Nowa właściwość klasy TCustomComboBoxExAutoCompleteOptions — pozwala reagować na naciskanie klawiszy przez użytkownika.
  • Komponenty CXL — TOpenDialog i TSaveDialog — zostały zmodyfikowane tak, aby obsługiwały możliwość podglądu pliku.

Bazy danych


Borland wprowadził także udogodnienia dotyczące baz danych. Przede wszystkim zaktualizowane zostały sterowniki dbExpress do baz Informix SE, Oracle 9i, DB2 7.2, Interbase 6.5., MySQL 3.23.49.

Wprowadzony został także nowy sterownik — MS SQL Server 2000. Więcej o dbExpress poczytać możesz w rozdziale 5.

Pozostałe zmiany:


  • W aplikacjach DataSnap zastosowanie IAppServer zostało zastąpione przez IAppServerSOAP.
  • DataSnap nie będzie już obsługiwać połączeń zgodnych ze standardem COBRA.

.NET


Pewnie nieraz słyszałeś już o platformie .NET. Jest to strategia firmy Microsoft, polegająca — ogólnie mówiąc — na stworzeniu pewnego standardu tworzenia oprogramowania. Microsoft dąży do zaprojektowania wielu usług, które byłyby ze sobą zintegrowane, co oznaczałoby uproszczenie wielu z nich.

.NET to cała seria produktów, które będą ze sobą zintegrowane, a ich kluczowym elementem będzie wykorzystanie Internetu. Nazwa .NET zastępuje wcześniejszą roboczą nazwę — Next Generation Windows Services. Microsoft planuje stworzenie całej rodziny produktów .NET — systemu operacyjnego Windows .NET oraz systemu oprogramowania Visual Studio.

Borland postanowił przyłączyć się do tej strategii i przystosować swoje produkty do .NET. Najważniejszą chyba zmianą w Delphi 7 jest przystosowanie kompilatora do platformy .NET.

Modyfikacje kompilatora


Począwszy od wersji 7, kompilator Delphi zawiera trzy nowe ostrzeżenia zgodne z kompilatorem .NET, zwane unsafe. Ostrzeżenia te pojawiają się w czasie, gdy kompilator nie może przewidzieć skutków działania pewnych instrukcji. Domyślnie ostrzeżenia unsafe są wyłączone — można je włączyć w opcjach projektu (Project/Options). Poniżej przedstawiam instrukcje, przy których kompilator może wyświetlić ostrzenia unsafe.

Niebezpieczne typy:

  • PChar, PWideChar, PAnsiChar.
  • Wskaźniki.
  • Zmienne file of.
  • Real48.
  • Zmienne Variant.

Niebezpieczne funkcje:
  • Addr, Hi, Lo, Swap.
  • BlockRead, BlockWrite.
  • GetMem, FreeMem.
  • Operator @.

Oprócz tego ostrzeżenia typu unsafe mogą być spowodowane rzutowaniem na rekordy lub inne typy.

Podsumowanie


To był dość długi i — być może — czasami nużący rozdział, poświęcony IDE Delphi, kwestii, która zapewne nie interesuje w tak dużym stopniu początkującego programisty. Sam pamiętam, że gdy uczyłem się Object Pascala, poznawanie IDE nie było dla mnie zbyt interesujące — pochłonięty nauką Object Pascala pragnąłem jak najszybciej nauczyć się jak najwięcej interesujących rzeczy dotyczących tego języka. Ty także być może czytasz ten rozdział już po zapoznaniu się z następnymi częściami tej książki. Jeżeli więc kiedyś zapomnisz, gdzie można znaleźć opcje służące do zmiany kolorowania składni — powrócisz do tego rozdziału…

de25kp.jpg Więcej informacji

Delphi 2005. Kompendium programisty
Adam Boduch
Format: B5, stron: 1048
oprawa twarda
Zawiera CD-ROM




© Helion 2003. Autor: Adam Boduch. Zabrania się rozpowszechniania tego tekstu bez zgody autora.

1 komentarz

forsaken 2009-07-21 12:33

Brak jest rysunku 4.6. Mozna prosic o uzupelnienie?