09 (18)


Rozdział 9.
Projekty, Edytor Kodu i Eksplorator Kodu


W tym rozdziale poznasz kolejne elementy zintegrowanego środowiska Delphi (IDE), przekonasz się również, w jaki sposób współdziałają one ze sobą przy tworzeniu rzeczywistych aplikacji. Omówione zostaną:

Przed Tobą długi rozdział, ale czas poświęcony na jego przestudiowanie na pewno nie będzie czasem straconym.

Projekt to podstawa

Z ideą projektów spotkałeś się po raz pierwszy w rozdziale czwartym „Środowisko zintegrowane (IDE)”, wtedy też miałeś okazję przekonać się, w jaki sposób one funkcjonują. W tej sekcji zajmiemy się tym zagadnieniem bardziej szczegółowo. Projekty są sednem funkcjonowania Delphi. Nie można stworzyć programu bez projektu. Projekt zapewnia prawidłowe funkcjonowanie wszystkich elementów, które tworzą działającą aplikację. Sekcja ta dotyczyć będzie następujących zagadnień:

Menedżer Projektów

Wcześniej czy później, każdy projekt będzie wymagał pewnej modyfikacji. Być może będziesz musiał dodać nowy moduł kodu źródłowego do projektu lub usunąć moduł istniejący. Równie prawdopodobna może okazać się potrzeba dodania innego typu pliku, takiego jak np. plik zasobów. Operacje dodawania i usuwania plików z projektu umożliwia Menedżer Projektów.

Grupy Projektów

W rozdziale czwartym projekt został zdefiniowany jako zbiór plików, których przeznaczeniem jest utworzenie samodzielnego pliku wykonywalnego lub biblioteki DLL. Jest to definicja funkcjonująca na poziomie zintegrowanego środowiska programistycznego Delphi. W rzeczywistym świecie mogą istnieć inne typy projektu, może nim być np. zadanie przydzielone do wykonania.

Na duży projekt może składać się jeden lub kilka plików wykonywalnych i kilka bibliotek DLL. Właśnie ze względu na fakt, iż projekt może składać się z kilku plików wykonywalnych, Delphi zezwala na grupowanie kilku projektów i traktowanie ich jako jednego modułu; jednostka grupująca powiązane ze sobą projekty nazywa się w Delphi Grupą Projektów (ang. Project Group)

Jakie korzyści dają Grupy Projektów?

Być może zastanawiasz się jakie, korzyści niosą ze sobą Grupy Projektów - do najważniejszych zaliczyć można:

Projekt, którego celem jest stworzenie pojedynczego pliku wykonywalnego, nie wymaga Grupy Projektów; trudno zresztą uważać jeden projekt za grupę. Wyobraź sobie jednak przez chwilę, projekt, składający się z pojedynczego pliku wykonywalnego i wspomagającej go biblioteki DLL. Biblioteka i program wykonywalny są od siebie wzajemnie uzależnione. Zazwyczaj, pracując nad biblioteką, chcesz mieć bezpośredni dostęp do pliku wykonywalnego, aby móc w sposób natychmiastowy testować wprowadzone zmiany. W przypadku takiego scenariusza Grupa Projektów wydaje się doskonałym rozwiązaniem, ponieważ plik .exe i biblioteka występują zawsze razem.

Możesz utworzyć, a następnie zapisać Grupę Projektów, która będzie się składać z dwóch indywidualnych projektów. Chcąc rozpocząć pracę nad aplikacją lub biblioteką możesz, zamiast konkretnego projektu, otworzyć Grupę Projektów. Po otwarciu grupy wyświetlone zostaną oba projekty (biblioteki i aplikacji). Korzystając z Edytora Kodu możesz pracować nad jednym z tych projektów i w dowolnej chwili przełączać się do drugiego. Rysunek 9.1. przedstawia okno Menedżera Projektów po otwarciu Grupy Projektów o opisanej wyżej strukturze.

Rysunek 9.1.

Okno Menedżera Projektów z wyświetloną przykładową
Grupą Projektów

0x01 graphic

Innym powodem tworzenia Grup Projektów jest potrzeba grupowania projektów współzależnych. Brzmi to trochę przewrotnie więc pozwól, że wytłumaczę to dokładniej. Tutaj, w firmie TurboPower Software, dysponujemy produktem o nazwie Async Professional, będącym zbiorem komponentów realizujących komunikację szeregową. Z komponentami tymi wiążą się trzy główne kategorie: podstawowa komunikacja szeregowa, przesyłanie faksów i TAPI. Do oprogramowania Async Professional dołączamy tuziny programów obejmujących każdą z tych trzech kategorii.

Wziąwszy pod uwagę ten scenariusz, moglibyśmy stworzyć jedną Grupę Projektów dla wszystkich przykładów związanych z wysyłaniem faksów, drugą związaną z przykładami TAPI i jeszcze inną dla przykładów związanych z komunikacją szeregową. Nasi użytkownicy mogliby wtedy otworzyć grupę „Przykłady TAPI” i w ten sposób uzyskać dostęp do jednego zgrabnego pakietu przykładów. Wszystkie projekty w grupie mogłyby być tworzone równolegle, co z pewnością zaoszczędziłoby programistom nieco czasu (i zdenerwowania) w porównaniu z sytuacją, kiedy każdy projekt opracowywany byłby niezależnie.

Projekt aktywny

W każdej Grupie Projektów istnieje w danej chwili wyróżniony projekt, zwany projektem aktywnym (ang. active project). Jest on wyświetlany w Menedżerze Projektów pogrubioną czcionką - na rysunku 9.1 projektem aktywnym jest projekt o nazwie TestDll. Wybranie z menu Project polecenia Make… lub Build… sprawi, że skompilowany zostanie właśnie aktywny projekt. Wymienionym opcjom towarzyszy zawsze nazwa aktywnego projektu (stąd symboliczne wielokropki) - jeżeli np. jest to projekt Project1, nazwami opcji będą odpowiednio Make Project1 i Build Project1; przełączając się na projekt - powiedzmy - PictView spowodujemy zmianę nazw opcji na Make PictView i Build PictView.

Aktywny projekt ma ponadto inne znaczenie - otóż jeżeli utworzymy nowy formularz lub moduł, zostanie on dodany do aktywnego projektu niezależnie od tego, który z węzłów Menedżera jest aktualnie podświetlony.

Uczynienie danego projektu grupy projektem aktywnym może być dokonane na kilka sposobów. Po pierwsze - kliknięcie na przycisku Activate Menedżera Projektów spowoduje uczynienie aktywnym tego projektu, którego składnik jest aktualnie podświetlony. Po wtóre - dwukrotne kliknięcie na głównym węźle projektu czyni ten projekt aktywnym (na rysunku 9.1 węzłami głównymi są TestDLL.dll i progDLL.exe). Po trzecie wreszcie - można w tym celu użyć opcji Activate menu kontekstowego związanego z głównym węzłem odnośnego projektu.

Okno Menedżera Projektów

0x08 graphic
Menedżer Projektów jest całkowicie odnowionym narzędziem Delphi. Sama idea Menedżera Projektów była już znana wcześniej, niemniej jednak bieżąca jego implementacja jest znacznie lepsza od jego poprzednich wersji. Menedżer Projektów jest centralnym kontrolerem wszystkich Twoich projektów i grup projektowych. Dzięki niemu możesz dodawać pliki do projektów lub usuwać je w miarę potrzeby, wyświetlać moduły lub formularze, dodawać projekty do Grupy Projektów, zmieniać kolejność projektów w grupie itd. Aby wyświetlić Menedżera Projektów wybierz polecenie menu ViewProject Manager lub naciśnij kombinację klawiszy Ctrl+Alt+F11.

Okno Menedżera Projektów zawiera kontrolkę drzewa, która może wyświetlać maksymalnie cztery poziomy rozwinięcia. Poziomy te oznaczają następujące jednostki organizacyjne:

Oczywiście każdy węzeł może zostać rozwinięty lub zredukowany, identycznie jak w przypadku zwykłej kontrolki widoku drzewa. Węzły Menedżera Projektów zawierają ikony wskazujące, czy dany węzeł zawiera projekt, pojedyncze pliki, formularz, czy też parę formularz/moduł. Wygląd drzewa Menedżera Projektów, jego kolejnych poziomów rozwinięcia i ikon reprezentujących węzły, został przedstawiony na rysunku 9.1.

Menu kontekstowe Menedżera Projektów

Większość zadań wykonywanych w Menedżerze Projektów wiąże się z wykorzystaniem menu kontekstowego. Menedżer posiada cztery różne menu kontekstowe - poniższe sekcje opisują każde z nich.

Menu kontekstowe Grupy Projektów

Ten typ menu jest wyświetlany po kliknięciu prawym przyciskiem myszy na węźle Grupy Projektów, tj. u szczytu drzewa. Polecenia tego menu zostały zestawione w tabeli 9.1.

Tabela 9.1. Polecenia menu kontekstowego dla Grupy Projektów

Polecenie

Opis

Add New Project

Otwiera Repozytorium, pozwalając wybrać nowy element. którym może być aplikacja, biblioteka DLL, formularz, moduł danych, komponent lub inny dostępny obiekt.

Add Existing Project

Otwiera z plik istniejącego projektu i dodaje go to grupy.

Save Project Group

Zapisuje grupę - przechowujący ją plik otrzymuje domyślne rozszerzenie .bpg (skrót od Borland Project Group).

Save Project Group As

Zapisuje grupę pod wskazaną nazwą.

View Project Group Source

Wyświetla w Edytorze Kodu plik źródłowy opisujący grupę.

Toolbar

Wyświetla lub ukrywa pasek narzędzi Menedżera Projektów.

Status Bar

Wyświetla lub ukrywa pasek statusu Menedżera Projektów.

Dockable

Określa, czy Menedżer Projektów ma być dokowalny.

0x01 graphic

Elementy menu Toolbar, Status Bar i Dockable występują we wszystkich menu kontekstowych Menedżera Projektów i posiadają identyczne znaczenie, jak w menu grupy. Z tego względu zostaną one pominięte w dalszym opisie.

Menu kontekstowe projektu

Menu kontekstowe projektu (węzła głównego) jest wyświetlane po kliknięciu prawym przyciskiem myszy na węźle projektu. Tabela 9.2 przedstawia elementy specyficzne dla tego menu.

Tabela 9.2. Polecenia menu kontekstowego węzła głównego projektu

Polecenie

Opis

Add

Otwiera okno dialogowe Add to Project, pozwalając na dodanie pliku do projektu. Plecenie to jest równoważne poleceniu menu ProjectAdd to Project lub jego odpowiednikowi na pasku narzędzi Delphi.

Remove Files

Otwiera okno dialogowe usunięcia z projektu Remove From Project, umożliwiając usunięcie pliku z projektu. Polecenie to jest równoważne poleceniu menu ProjectRemove from Project lub jego odpowiednikowi na pasku narzędzi Delphi.

Save

Zapisuje projekt. Polecenie równoważne poleceniu menu FileSave lub jego odpowiednikowi na pasku narzędzi Delphi.

cd. na następnej stronie

Tabela 9.2. cd. Polecenia menu kontekstowego węzła głównego projektu

Polecenie

Opis

Options

Wyświetla okno dialogowe Project Options dla wybranego projektu. Polecenie równoważne poleceniu menu ProjectOptions.

Activate

Czyni wybrany projekt aktywnym.

Compile

Kompiluje wybrany projekt; różnica między kompilacją a budowaniem projektu została omówiona w rozdziale czwartym.

Build

Buduje wybrany projekt; różnica między kompilacją a budowaniem
projektu została omówiona w rozdziale czwartym.

View Source

Wyświetla plik źródłowy projektu. Polecenie równoważne poleceniu menu ProjectView Source.

Close

Zamyka wybrany projekt i wszystkie związane z nim pliki. Jeżeli projekt jest częścią zapisanej grupy projektowej, jego węzeł staje się nieaktywny (przyciemniony). Projekt nadal będzie stanowił część grupy, ale nie będzie otwarty w środowisku IDE. Jeżeli wybrany projekt jest częścią domyślnej Grupy Projektów, zostaje on zamknięty i usunięty z tej grupy.

Remove Project

Usuwa wybrany projekt z grupy. Nie są usuwane pliki projektu, następuje jedynie wyłączenie go z grupy. Operacja ta jest równoważna kliknięciu przycisku Remove na pasku narzędzi Menedżera Projektów.

Build Sooner

Przesuwa wybrany projekt w górę w drzewie projektów; kolejność projektów w drzewie decyduje o tym, w jakiej kolejności są one budowane - projekt znajdujący się wyżej jest budowany wcześniej.

Build Later

Przesuwa wybrany projekt w dół w drzewie projektów - z konsekwencjami opisanymi w poprzednim wierszu.

0x01 graphic

Stopień zróżnicowania menu kontekstowych Menedżera Projektów jest większy od przedstawionego w tej sekcji. Menu kontekstowe projektu zawiera dodatkowe elementy, jeżeli projektem jest plik wsadowy (Batch File) lub projekt pakietu. Różnice te nie są jednak wielce znaczące, dlatego zostały tu pominięte.

Menu kontekstowe modułu

Menu to jest wyświetlane po kliknięciu prawym przyciskiem myszy na węźle modułu w drzewie Menedżera Projektów; jego polecenia przedstawia tabela 9.3.

Menu kontekstowe pliku

Menu to jest wyświetlane po kliknięciu prawym przyciskiem myszy na węźle innym niż węzeł grupy, projektu lub modułu (zwykle węzeł ten reprezentuje plik z rozszerzeniem .pas lub .dfm). Menu składa się z jednego tylko polecenia - Open (poza wspomnianymi wcześniej Toolbar, Status Bar i Dockable).

W zależności od typu wybranego węzła, zostanie on wyświetlony w Edytorze Kodu lub Edytorze Formularzy.

Tabela 9.3. Polecenia menu kontekstowego dla modułu

Polecenie

Opis

Open

Wyświetla moduł w Edytorze Kodu (w przypadku samodzielnego modułu) lub Edytorze Formularzy (jeżeli z modułem jest skojarzony formularz).

Remove From Project

Usuwa wybrany formularz z projektu. Uwaga! Menedżer Projektów nie stosuje dodatkowego potwierdzenia tej operacji, a po
(przypadkowym) jej wykonaniu nie ma możliwości cofnięcia.

Save

Zapisuje moduł. Polecenie równoważne poleceniu menu FileSave.

Save As

Otwiera okno dialogowe zapisu (Save as), pozwalając zapiać moduł pod wskazaną nazwą. Polecenie równoważne poleceniu menu FileSave As.

Pasek narzędzi Menedżera Projektów i polecenia klawiatury

Aby ułatwić pracę użytkownikowi, Menedżer Projektów posiada - oprócz menu kontekstowych -również pasek narzędzi, składający się z trzech przycisków:

Z przyciskami tymi związane są klawisze Delete i Insert. Naciśnięcie klawisza Delete powoduje usunięcie wybranego węzła. Jeżeli węzłem tym jest projekt, zostaje on usunięty z grupy. W przypadku węzła modułu moduł ten zostaje usunięty z projektu. Naciśnięcie klawisza Insert jest równoważne wybraniu polecenia Add to Project z menu kontekstowego projektu.

0x01 graphic

Przyciski paska narzędzi Menedżera Projektów mogą mieć duży lub mały rozmiar - zmiany rozmiaru dokonuje się poprzez przesuwanie w pionie dolnej krawędzi paska. Małe przyciski nie posiadają widocznych etykiet (New, Remove, Activate), a jedynie podpowiedzi kontekstowe (odpowiednio - Add New Project, Remove Selected Project i Activate Selected Project).

Tworzenie i użytkowanie grup projektowych

Grupy projektowe są niezwykle użyteczne w przypadku złożonych projektów, lecz ich używanie nie jest wcale obowiązkowe. Jednakże każdy „samotny” projekt traktowany jest przez Menedżer Projektów jako element grupy o domyślnej nazwie ProjectGroup1. Aby się o tym przekonać:

  1. Wybierz polecenie menu FileClose All, aby zamknąć wszelkie otwarte projekty lub Grupy Projektów.

  2. Utwórz nową aplikację poleceniem menu FileNew Application.

  3. Wyświetl okno Menedżera Projektów (ViewProject Manager) - powinno ono wyglądać tak, jak na rysunku 9.2.

Rysunek 9.2.

Menedżer Projektów z wyświetloną domyślną Grupą Projektową

0x01 graphic

Grupa Projektowa ProjectGroup1 jest tworzona tylko tymczasowo. Kiedy wybierzesz polecenie File|Save All, zostaniesz poinformowany o zapisaniu projektu, ale nie Grupy Projektowej. Chcąc bowiem zapisać Grupę Projektową, będziesz musiał z własnej inicjatywy wybrać jedno z poleceń menu kontekstowego Menedżera Projektów: Save Project Group lub Save Project Group As.

Dodawanie modułów źródłowych do projektu

Dodanie do projektu istniejącego modułu źródłowego („unitu”) jest bardzo proste - wystarczy wybrać polecenie Add z menu kontekstowego projektu w oknie Menedżera Projektów.

0x01 graphic

Nie można dodać modułu do projektu, jeżeli zawiera on formularz o nazwie tożsamej z nazwą tegoż modułu. Przykładowo - nie powiedzie się próba dodania modułu MainForm.Pas do projektu zawierającego już formularz MainForm; efektem będzie wyświetlenie komunikatu o błędzie.

Usuwanie modułów z projektu

Do usunięcia pliku z projektu służy opcja Remove From Project. Identyczny efekt da podświetlenie modułu przeznaczonego do usunięcia i naciśnięcie klawisza Delete. Pliki usuwane z projektu nie są fizycznie usuwane z dysku, przestają jednak brać udział w procesie kompilacji i konsolidacji projektu.

0x01 graphic

Przy usuwaniu modułów z projektu postępuj bardzo ostrożnie. Musisz uważać, aby nie usunąć modułu pozostającego w relacji z innymi modułami projektu. Usunięcie jednego z takich modułów zaowocowałoby błędem (błędami) kompilacji. Przed usunięciem modułu zawsze upewnij się, czy rzeczywiście nie jest on wykorzystywany w Twoim projekcie. Jeżeli przez przypadek usuniesz moduł niezbędny dla projektu, możesz dodać go z powrotem, w sposób opisany przed chwilą.

Okno dialogowe usuwania z projektu (Remove From Project) umożliwia wybór wieloelementowy, można więc, w miarę potrzeb, usunąć z projektu kilka modułów jednocześnie.

Wyświetlanie modułów i formularzy

Aby wyświetlić formularz, moduł lub inny plik wystarczy dwukrotnie kliknąć na reprezentującym go węźle. Operację tę można również przeprowadzić, wybierając polecenie Open z menu kontekstowego węzła w Menedżerze Projektów. Formularz lub moduł zostanie wyświetlony w Edytorze Formularzy lub Edytorze Kodu, w zależności od typu wybranego węzła.

Budowanie projektów i grup projektowych

Istnieją trzy możliwe sposoby zbudowania (skompilowania i skonsolidowania) określonego projektu:

Aby odbudować całą grupę projektową, wybierz polecenie ProjectBuild All Projects menu głównego Delphi. Odbudowane zostaną wszystkie projekty - w kolejności, jaką zajmują w drzewie Menedżera, poczynając od góry.

Opcje projektu

Opcje projektu to kolejna rzecz, które można z łatwością zignorować. Niektórym wystarczają ustawienia domyślne, zwłaszcza jeśli mowa o osobach nabierających dopiero wprawy w programowaniu. W końcu, kto ma czas martwić się ustawieniami kompilatora/konsolidatora, gdy stoją przed nim ważniejsze problemy, takie jak np. nauka nowego środowiska programistycznego?

Niemniej jednak, nadejdzie kiedyś taki czas, że trzeba będzie się zainteresować tymi opcjami - okaże się wtedy pomocne źródło wiedzy na ten temat.

Tematem tej sekcji będzie okno dialogowe opcji projektu (Project Options). Można je wywołać poleceniem menu ProjectOptions. Okno to posiada kilka zakładek/stron:

Nie będę omawiał wszystkich wymienionych stron, za to skupię się na najważniejszych, abyś mógł zobaczyć, do czego służy każda z nich. Wędrówkę rozpoczniemy od stron Forms i Application, by następnie przejść do stron bardziej skomplikowanych.

0x01 graphic

U dołu każdej ze stron okna opcji projektu znajduje się pole wyboru o nazwie Default. Uaktywnij to pole jeżeli chcesz, aby bieżące ustawienia stały się ustawieniami domyślnymi dla wszystkich nowo tworzonych projektów. Bieżące ustawienia staną się ustawieniami domyślnymi po wybraniu przycisku OK.

Strona Forms

Dzięki tej stronie jesteś w stanie kontrolować sposób, w jaki Twoja aplikacja obsługuje swoje formularze. Spotkałeś się już z tym oknem w rozdziale czwartym, tworząc program przeglądarki obrazków - przedstawia je rysunek 9.3.

U góry tej strony znajduje się pole combo nazwie Main form. W pole to należy wpisać nazwę formularza, który będzie wyświetlany jako pierwszy, po uruchomieniu aplikacji. Domyślnie jest to pierwszy formularz, jaki stworzyłeś pracując nad aplikacją. Jeżeli

Rysunek 9.3.

Strona Forms w oknie opcji projektu

0x01 graphic

zmodyfikujesz swoją aplikację tak, że inny formularz stanie się formularzem głównym, będziesz musiał zmienić ustawienie tego parametru, aby odpowiadało ono stanowi rzeczywistemu.

Pośrodku okna znajdują się dwie listy. Lista po lewej stronie nosi nazwę Auto-create forms (co oznacza „formularze tworzone automatycznie”), lista po prawej zatytułowana jest Available forms („dostępne formularze”). Zanim przystąpię do omówienia tych dwóch list, zatrzymajmy się przez chwilę na formularzach tworzonych automatycznie.

0x01 graphic

Auto-kreacja oznacza iż Delphi będzie konstruował określony formularz w trakcie procesu uruchamiania aplikacji.

Za każdym razem, kiedy tworzysz formularz, Delphi umieszcza go na liście formularzy tworzonych automatycznie. Jak sama nazwa wskazuje, utworzenie egzemplarza takiego formularza odbywa się automatycznie (za co odpowiedzialne są instrukcje zawarte w pliku .DPR - przyp. red.) bez żadnej akcji ze strony użytkownika. Formularze tego typu wyświetlają się szybciej od pozostałych formularzy, natomiast wadą wynikającą z ich zastosowania jest zwiększone zapotrzebowanie na pamięć i - w pewnym stopniu - wzrost czasu ładowania przy dużej ich liczbie.

0x01 graphic

Pierwszym formularzem na liście Auto-create forms jest zawsze formularz główny. Jeżeli zmienisz główny formularz aplikacji, jego nowy odpowiednik zostanie umieszczony na szczycie tej listy. Innym sposobem na ustawienie głównego formularza jest przeciągnięcie i upuszczenie dowolnego formularza listy Auto-create forms, właśnie na jej szczycie.

Wygodnym aspektem automatycznego tworzenia formularza jest łatwość jego wyświetlenia - wystarczy wywołać metodę Show lub ShowModal:

AboutBox.ShowModal;

Jeżeli korzystasz w Delphi z formularzy nie będących tworzonymi automatycznie, przed ich wykorzystaniem musisz sam zadbać o ich utworzenie:

procedure TForm1.Button1Click(Sender: TObject);

var

About : TAboutBox;

begin

About:=TAboutBox.Create(Self);

About.ShowModal;

About.Free;

end;

W przykładzie tym nie korzysta się ze wskaźnika do okna About utworzonego przez Delphi.

Zamiast niego tworzony jest ad hoc egzemplarz formularza (TAboutBox.Create(Self)), wyświetlany modalnie (About.ShowModal) i następnie zwalniany (About.Free).

W powyższym przykładzie każdemu wyświetleniu formularza towarzyszy jego tworzenie i zwalnianie. Można jednak całą rzecz usprawnić, ograniczając się do tworzenia (i zwolnienia) jednokrotnego. Należy w tym celu zdefiniować globalną zmienną odpowiedniego typu o początkowej wartości NIL. Każdorazowo przez próbą wyświetlenia formularza testuje się zawartość tej zmiennej; wartość NIL świadczy o tym, że formularza jeszcze nie utworzono - należy więc uczynić to teraz i - co najistotniejsze - przypisać zmiennej wskaźnik do formularza:

Var

AboutBox:TAboutBox = NIL;

if not Assigned(AboutBox)

then

AboutBox:=TAboutBox.Create(Self);

AboutBox.ShowModal;

Decyzja, którą metodę tworzenia formularza wybrać, należy do Ciebie - ja preferuję poprzednią, gdyż organizuje całość obsługi formularza w sposób lokalny.

0x01 graphic

Za każdym razem, kiedy tworzysz nowy formularz w Projektancie Formularzy, Delphi tworzy do niego wskaźnik. Jeżeli pozwolisz, aby Delphi stworzył formularz automatycznie, nie będziesz musiał się martwić o sprawdzanie poprawności tego wskaźnika. Jeżeli jednak zrezygnujesz z automatycznego tworzenia formularza, wskaźnik będzie posiadał wartość nil, dopóki sam nie utworzysz formularza i nie przypiszesz wskaźnikowi jego adresu. Jeżeli zapomnisz o tym i przez przypadek użyjesz wskaźnika, zanim zostanie mu przypisany adres formularza, Windows wygeneruje błąd ochrony dostępu.

Teraz możesz ponownie skierować swoją uwagę na okno opcji projektu. Na liście Auto-create forms znajdują się formularze, które będą tworzone automatycznie. Usuń z tej listy wszystkie, co do których nie życzysz sobie automatycznego tworzenia -„usunięcie” formularza sprowadza się do przeciągnięcia go na listę Available forms.

0x01 graphic

Do przemieszczania formularzy pomiędzy listami możesz wykorzystać przyciski znajdujące się pośrodku okna, łatwiej jednak wykonać to metodą przeciągania i upuszczania.

Strona Application

Strona Application prezentuje się bardzo prosto (rysunek 9.4).

Rysunek 9.4.

Strona Application opcji projektu

0x01 graphic

Pole Title służy nadaniu nazwy aplikacji; nazwa ta pojawia się na pasku zadań, kiedy aplikacja jest zminimalizowana. Jeżeli nie wypełnisz tego pola, w charakterze nazwy aplikacji użyta zostanie nazwa projektu.

0x01 graphic

Nie należy mylić ze sobą nazwy aplikacji i tytułu formularza głównego.

Pole Help file służy do związania z aplikacją pliku pomocy. Plik ten będzie ładowany w odpowiedzi na naciśnięcie klawisza F1. Jeżeli nie pamiętasz nazwy pliku lub jego położenia na dysku, możesz skorzystać z przycisku Browse. Jeżeli plik pomocy nie zostanie określony, naciśnięcie przycisku F1 nie odniesie (domyślnie) żadnego skutku w aplikacji.

Opcja Icon pozwala wybrać ikonę dla aplikacji. Ikona ta będzie wyświetlana na pasku zadań Windows, w trakcie pracy aplikacji lub po jej zminimalizowaniu. Dodatkowo, ikona ta będzie również wyświetlana na pasku tytułu głównego formularza, o ile z własnej inicjatywy nie ustawisz innej ikony dla formularza głównego. Aby wybrać ikonę, kliknij na przycisku Load Icon, a następnie zlokalizuj plik ikony (.ico) poprzez okno dialogowe Application Icon.

Pole Target file extension służy do określenia rozszerzenia nazwy pliku wynikowego projektu. Na przykład, w przypadku budowy wygaszacza ekranu, powinieneś wpisać w to pole .scr - i takie rozszerzenie otrzyma plik wynikowy. Innym przykładem niestandardowego rozszerzenia modułu wykonywalnego jest rozszerzenie .cpl, którym opatrywane są applety Panelu Sterowania. W razie niewypełnienia tego pola domyślnymi rozszerzeniami są: .exe dla modułów wykonywalnych i .dll dla bibliotek DLL.

Strona Compiler

Strona ta służy do ustawienia opcji sterujących kompilacją projektu. Jej wygląd przedstawia rysunek 9.5.

Rysunek 9.5.

Strona Compiler w oknie opcji projektu

0x01 graphic

Na pierwszy rzut oka widać, że strona podzielona jest na pięć części. Za chwilę każda z tych części zostanie omówiona z osobna, tak abyś mógł dobrze zrozumieć poszczególne opcje.

Code Generation

Kompilator można tak skonfigurować, aby dokonywał optymalizacji generowanego kodu. Kiedy optymalizacja jest wyłączona (nieaktywne pole Optimization), kompilator nie podejmuje żadnych prób optymalizowania kodu. Przy włączonej opcji Optimization kompilator wygeneruje kod możliwie najefektywniejszy czasowo, bez troszczenia się o rozmiar modułu wykonywalnego. W większości przypadków powinieneś pozostawić domyślne ustawienie tej opcji. Jako że procesowi optymalizacji towarzyszy ignorowanie tych instrukcji źródłowych, które kompilator uzna za zbędne, wyłączenie tej opcji okazuje się zazwyczaj konieczne podczas śledzenia programu (ang. debugging). Optymalizacja i wykrywanie błędów zostaną dokładnie omówione w rozdziale dziesiątym „Wykrywanie błędów w aplikacjach”.

Pole o nazwie Aligned Record Fields określa sposób rozmieszczania rekordów w pamięci. Przy włączonej opcji, pamięć przydzielana rekordom wyrównywana jest na granicy podwójnego słowa (4 bajty), przy wyłączonej zaś brak jest wyrównania.

W trakcie wykrywania błędów w aplikacjach wskazane jest włączenie opcji Stack Frames. Po zakończeniu procesu śledzenia opcję tę można wyłączyć, aby umożliwić kompilatorowi generowanie szybszego i mniejszego kodu. Po wyłączeniu tej opcji czas kompilacji może zostać minimalnie wydłużony.

Opcja Pentium-Safe FDIV sprawia, że kompilator generuje kod zdolny poradzić sobie z błędem dzielenia zmiennopozycyjnego występującym w niektórych egzemplarzach wczesnych wersji procesora Pentium®.

Syntax Options i Runtime Errors

Te dwie sekcje wpływają na sposób generowania przez kompilator kodu wynikowego. Dokładne przeznaczenie tych opcji opisane jest w systemie pomocy dla strony Compiler. (Aby wyświetlić tę stronę pomocy, kliknij na przycisku Help w chwili gdy wyświetlona będzie strona Compiler, lub naciśnij klawisz F1).

Debugging

Sekcja Debugging strony Compiler określa sposób generowania kodu przez kompilator w trakcie sesji wykrywania błędów. Jeżeli opcja Debug information jest aktywna, Delphi generuje informacje niezbędne dla debuggera. Brak informacji tego typu uniemożliwia zatrzymywanie programu na tzw. punktach przerwania (ang. breakpoints) i przeglądanie stanu zmiennych, w trakcie sesji wykrywania błędów. Innymi słowy - bez informacji dla debuggera, generowanej przez Delphi, nie można przeprowadzić procesu śledzenia.

0x01 graphic

Po dokonaniu zmian na stronie Compiler powinieneś natychmiast przeprowadzić proces odbudowy projektu (Project|Build…). Dzięki temu będziesz miał pewność, iż wszystkie moduły zostały skompilowane przy użyciu tych samych ustawień kompilatora.

Messages

Sekcja Messages określa, czy życzysz sobie, aby kompilator zgłaszał wskazówki i ostrzeżenia po zakończeniu procesu kompilacji. Zalecane jest pozostawienie obu opcji (Show Hints i Show Warnings) w stanie aktywnym. Na dłuższą metę, wskazówki i ostrzeżenia nie powinny być ignorowane (w trakcie bieżącej pracy można ignorować niektóre ostrzeżenia wiedząc, że wynikają one z tymczasowych warunków występujących w tworzonym kodzie). Przyczyny powstawania ostrzeżeń są zazwyczaj możliwe do wyeliminowania (i należy to robić). Naucz się jednak traktować wskazówki i ostrzeżenia jako potencjalne błędy. W pełni poprawny kod kompiluje się bez ostrzeżeń.

Strona Linker

Opcje zawarte na tej stronie decydują o sposobie pracy konsolidatora. Możesz pozostawić w spokoju tę stronę i zaakceptować jej domyślne ustawienia, dopóki nie poznasz lepiej Delphi. Strona Linker została przestawiona na rysunku 9.6. Opcje dostępne na tej stronie są wyjaśniane kolejno w dalszych sekcjach.

Rysunek 9.6.

Opcje konsolidatora projektów

0x01 graphic

Map File

Sekcja Map File decyduje o tym, czy tworzony będzie plik tzw. mapy modułu i o tym, jak szczegółowe informacje będzie on zawierał. Plik mapy jest zawansowanym narzędziem procesu wykrywania błędów, którego najprawdopodobniej nie będziesz stosował do czasu, kiedy lepiej zaznajomisz się z Delphi. Z tego też powodu opcja ta nie będzie tutaj szczegółowo omawiana.

EXE and DLL options

Ta sekcja z kolei określa typ pliku wykonywalnego, jaki Delphi wyprodukuje w ramach projektu. Jeżeli pole wyboru Generate console application jest aktywne, Delphi wygeneruje aplikację konsolową, zamiast typowej aplikacji z interfejsem GUI.

Włączona opcja Include TD32 debug info wymusza na konsolidatorze dołączenie do pliku wynikowego informacji wykorzystywanych przez zewnętrzny debugger, którym może być program TD32.EXE (jest to 32-bitowa wersja Turbo Debuggera towarzyszącego Turbo Pascalowi i Turbo C - nie wchodzi ona w skład standardowego wyposażenia Delphi) lub inny, akceptujący informacje w formacie TD32 - na przykład Memory Sleuth produkcji TurboPower Software.

Opcja Include Remote Debug Symbols generuje informację niezbędną dla procesu zdalnego śledzenia aplikacji (ang. remote debugging).

Linker Output

Sekcja Linker Output decyduje o typie skompilowanych plików binarnych stanowiących odpowiedniki modułów źródłowych. W normalnych (domyślnych) warunkach konsolidator tworzy charakterystyczne dla Delphi pliki typu .DCU. Możliwe jest jednak generowanie plików .OBJ, zdatnych do wykorzystania w środowisku C++ Builder'a.

Memory Sizes

Sekcję Memory Sizes mogą zignorować wszyscy, za wyjątkiem najbardziej zaawansowanych użytkowników. Domyślne ustawienia tej sekcji są akceptowalne dla wszystkich typów aplikacji. W niektórych przypadkach, w trakcie budowy biblioteki DLL, mogłaby okazać się niezbędna zmiana adresu bazowego ładowania modułu (Image base), ale sytuacja tak jest raczej rzadko spotykana.

Description

Pole EXE Description służy do określenia łańcucha tekstowego, który zostanie osadzony w aplikacji. Pole to jest czasami używane do umieszczenia w programie lub bibliotece DLL informacji o prawach autorskich programu. W większości przypadków informację tą będziesz zapisywał raczej poprzez zakładkę Version info (o niej za chwilę) niż przez pole EXE Description.

Strona Directories/Conditionals

Dzięki tej stronie można określić katalogi, wykorzystywane przez projekt w trakcie poszukiwania plików bibliotek. Poszczególne pola strony Directories/Conditionals (przedstawionej na rysunku 9.7) zostały opisane w kolejnych sekcjach.

Rysunek 9.7.

Strona Directories /Conditionals

0x01 graphic

Directories

Pola tej sekcji określają, w jakich katalogach Delphi powinien szukać różnych typów plików w trakcie kompilowania i konsolidowania projektu. Ponadto znajdują się tutaj pola określające miejsce przeznaczenia plików powstających w procesie budowy projektu.

Pole Output Directory wskazuje miejsce, gdzie umieszczony zostanie końcowy efekt projektu, czyli plik wykonywalny lub biblioteka DLL. Pole Unit output directory określa katalog, do którego trafią pliki .DCU (lub .OBJ) powstające w wyniku kompilacji każdego z modułów. Pole Search Path wskazuje katalogi, w których kompilator i konsolidator poszukiwać będzie dodatkowych bibliotek niezbędnych do zbudowania projektu. Pole Debug source path służy do określenia ścieżki dostępu do modułów źródłowych, nie znajdujących się w katalogu projektu, aby ich kod źródłowy dostępny był w procesie śledzenia programu. Pola BPL output directory i DCP output directory określają miejsca, gdzie umieszczane zostaną pliki typu .BPL i .DCL, powstające w procesie budowania pakietu (w wersji z rozbiciem na pakiety).

Zauważ, że przy niektórych polach występują przyciski z wykropkowaniem. Kliknięcie na takim przycisku powoduje wyświetlenie edytora, umożliwiającego dodanie, usunięcie lub zmianę organizacji elementów danego pola. Rysunek 9.8. prezentuje takie okno podczas edycji pola Search path.

Rysunek 9.8.

Okno dialogowe edytora sekcji Directories

0x01 graphic

Conditionals

Pole tej sekcji służy do zdefiniowania tzw. symboli kompilacji warunkowej (ang. conditionals) uzależniających (mówiąc ogólnie) od swego zdefiniowania widoczność określonych fragmentów kodu źródłowego przez kompilator. Przykładowo, jeżeli w swoim projekcie umieściłeś fragment kodu, kompilowany tylko w przypadku zdefiniowania symbolu TESTUJ, wtedy powinieneś umieścić ten symbol w polu Conditional defines jeśli chcesz, aby kompilator ów fragment uwzględnił:

{$IFDEF TESTUJ}

… tu znajduje się uwarunkowany fragment kodu…

{$ENDIF}

Jeżeli będziesz chciał zdefiniować więcej symboli, oddziel je od siebie średnikami.

Aliases

Pole Unit aliases umożliwia zdefiniowanie nazw zastępczych (aliasów) dla dowolnych modułów. Na przykład - Delphi 1 stosował moduły WinTypes.pas i WinProcs.pas, które już w wersji 2 zastąpione zostały modułem Windows.Pas. Aby uniknąć czasochłonnego poprawiania kody źródłowego, można nakazać kompilatorowi odwoływanie się do modułu Windows każdorazowo, gdy natknie się on w kodzie źródłowym (np. w sekcji uses) na nazwy modułów WinTypes i WinProcs:

WinTypes=Windows;WinProcs=Windows

Strona Version info

Strona Version info umożliwia ustawianie informacji o wersji budowanych aplikacji. Informacja ta jest przechowywana w wykonywalnym pliku programu, pliku biblioteki DLL lub pliku kontrolki ActiveX. Informacja ta jest wykorzystywana przez programy instalacyjne do określenia, czy instalowany plik jest starszy, czy też młodszy od pliku, który ma być nim zastąpiony nowym.

Z informacji o wersji korzystają również inne programy. Jej wyświetlenie umożliwia Eksplorator Windows. Wystarczy, że w oknie Eksploratora klikniesz prawym przyciskiem myszy na dowolnym pliku, a następnie wybierzesz polecenie Właściwości: po otwarciu okna dialogowego właściwości i kliknięciu na zakładce Wersja znajdziesz żądaną informację o wersji. Rysunek 9.9 przedstawia okno właściwości z informacją o wersji jednego z programów użytkowych, wchodzących w skład Delphi.

Rysunek 9.9.

Okno właściwości prezentujące informację
o wersji programu
DBD32.EXE

0x01 graphic

Strona Version info została przedstawiona na rysunku 9.10. W górnej części okna znajduje się pole wyboru o nazwie Include version information in project. Zaznaczenie tego pola oznacza, że informacja o wersji będzie dołączona do wykonywalnego pliku projektu. Jeżeli pole jest nieaktywne, informacja o wersji nie jest dołączana do projektu, a pozostała część okna jest niedostępna.

Rysunek 9.10.

Strona informacji o wersji programu, w oknie opcji projektu

0x01 graphic

Pozostałe pola na stronie służą do określenia różnych elementów informacji o wersji. Pola Major Version, Minor Version, Release i Build wspólnie formują numer wersji pliku. Zgodnie z oknem na rysunku 9.10 numerem wersji pliku jest 2.0. Jeżeli uaktywnisz pole Auto-increment build number, numer wersji będzie automatycznie zwiększany podczas każdego procesu budowy.

Sekcja Module Attributes służy do określenia specjalnych atrybutów informacji o wersji pliku. Sekcja Language pozwala wybrać tzw. identyfikator lokalizacyjny, symbolizujący wersję językową pliku; więcej informacji na temat pola Local ID znajdziesz w systemie pomocy Windows API, pod hasłem „Language Identifiers and Locales”.

Tabela u dołu okna może być wykorzystana do ustawienia szeregu informacji takich, jak nazwa firmy, opis pliku, wewnętrzna nazwa pliku, informacja na temat ochrony prawnej i znaku towarowego, nazwa produktu i dodatkowe komentarze.

W miarę potrzeby można wypełnić wszystkie pola lub nie wypełniać żadnego z nich. (Pole FileVersion jest ustawiane na podstawie pól sekcji Module Version Number.) Można również dodawać własne pola informacji o wersji. W tym celu wystarczy kliknąć na tabeli informacji o wersji, a następnie przewinąć ją aż do samego dołu; kolejne naciśnięcie klawisza ze skierowaną w dół strzałką spowoduje udostępnienie pola, w które można wpisać nowy klucz (ten sam efekt można osiągną za pomocą opcji Add Key z menu kontekstowego tabeli).

Strona Packages

Za pomocą tej strony (rys. 9.11) dokonuje się wyboru jednego z dwóch wariantów konsolidacji projektu - decyduje o tym opcja Build with runtime packages. Gdy zostanie ona zaznaczona, aplikacja będzie konsolidowana dynamicznie z wykorzystaniem biblioteki VCL i zewnętrznych komponentów. Oznacza to, że powstały wykonywalny plik aplikacji będzie mniejszy, ale będzie trzeba do niego dołączyć wszystkie niezbędne pakiety. Nieaktywny stan tego pola oznacza, że aplikacja będzie konsolidowana do pojedynczego pliku wykonywalnego, zawierającego wszelki kod biblioteki VCL i innych komponentów wykorzystywany przez aplikację.

Rysunek 9.11.

Strona Packages

0x01 graphic

Okno w górnej części strony (Design packages) określa zestaw pakietów środowiskowych dostępnych w fazie projektowania; nie ma ono żadnego znaczenia na etapie konsolidacji projektu.

Pakiety były omawiane szczegółowo w rozdziale ósmym - w sekcji „Pakiety”.

Edytor Kodu Delphi

Nie ma wątpliwości, że Delphi jest ze swej natury narzędziem wizualnym - jest to jedna z ogromnych zalet programowania w Delphi. Nadal jednak każdy znaczący program składa się z ogromnej ilości kodu, który trzeba własnoręcznie napisać. Kiedy otrzymasz już do rąk część aplikacji, stanowiącą interfejs użytkownika, stworzony przy użyciu przez narzędzi wizualnych Delphi, najprawdopodobniej spędzisz długi okres czasu pracując z Edytorem Kodu Delphi. Narzędzie to charakteryzuje się kilkoma cechami, które na pewno docenisz, kiedy tylko je poznasz.

W tej sekcji omówimy:

0x01 graphic

Edytor Kodu Delphi pozwala wybrać jedną z następujących konfiguracji trybu mapowania klawiatury: Default (domyślny), IDE Classic, BRIEF i Epsilon; w dalszej części tego rozdziału zakłada się korzystanie z trybu Default. Jeżeli przyzwyczaiłeś się już do innej konfiguracji trybu mapowania klawiatury, możesz nie brać pod uwagę odwołań do specyficznych kombinacji klawiszy.

Podstawowe operacje edytora

Zakładam, że wiersz wystarczająco dużo na temat wprowadzania, usuwania i podświetlania kodu myszką, usuwania, kopiowania, wklejania i innych operacji edytorskich. Operacje te nie będą tutaj wyjaśniane.

Przyglądając się z bliska Edytorowi Kodu Delphi można stwierdzić, iż posiada on wszystkie cechy typowego edytora kodu źródłowego aplikacji - typowe operacje, charakterystyczne dla edycji tekstu wzbogacona są o mechanizm uwydatniania składni (ang. syntax highlighting) umożliwiający łatwe rozróżnienie poszczególnych elementów syntaktycznych Object Pascala: słów kluczowych, łańcuchów, wartości numerycznych, komentarzy itp.

Edytor Kodu zbudowany jest w postaci okna z zakładkami. Możesz otworzyć tyle okien edytora, ile sobie zażyczysz; każde okno będzie reprezentowane przez jedną zakładkę, umieszczoną wzdłuż górnej krawędzi okna i zawierającą nazwę pliku; kliknięcie zakładki spowoduje przełączenie się na ten właśnie plik. Jeżeli liczba istniejących zakładek jest zbyt duża, by wyświetlić je wszystkie jednocześnie, pojawiają się przyciski umożliwiające przewijanie zakładek w poziomie.

Na pasku statusu u dołu okna, w jego lewej części, wyświetlane są dane dotyczące bieżącej linii edytowanego pliku oraz pozycji kursora w tej linii. Jeżeli wyświetlany plik został zmodyfikowany od czasu ostatniego zapisu, na środku paska pojawi się słowo Modified (zmodyfikowany). Po prawej stronie wyświetlany jest aktualny tryb wprowadzania nowych znaków: Insert (wstawianie) lub Overwrite (zastępowanie). Jeżeli na pasku pojawi się napis Read Only będzie to oznaczać, że wyświetlony plik przeznaczony jest jedynie do odczytu.

Na lewym marginesie okna edytora znajduje się szary pasek, noszący w oryginale nazwę gutter. Służy do wyświetlania ikon w kolejnych etapach procesu tworzenia. Przykładowo, po ustawieniu w którejś linii punktu przerwania (o czym będzie mowa w następnym rozdziale) gutter zawierał będzie czerwoną kropkę za wysokości tej linii; ustawienie zakładki (ang. bookmark - o tym za chwilę) reprezentowane jest natomiast w postaci odpowiedniej ikony.

0x01 graphic

Jeżeli podczas zaznaczania tekstu lub ustawiania kursora przez przypadek klikniesz w obszarze guttera spowodujesz ustawienie punktu przerwania; aby ten punkt usunąć, wystarczy ponownie kliknąć w tym samym miejscu.

Otwieranie i zapisywanie plików

Otwieranie i zapisywanie plików w Edytorze Kodu nie wyróżnia się niczym szczególnie tajemniczym. Należy jednak zwrócić uwagę na to, że istnieje różnica między otwarciem projektu a otwarciem pliku kodu źródłowego. Po wybraniu polecenia menu FileOpen Project użytkownik proszony jest o podanie nazwy pliku projektu; wybierając polecenie FileOpen można otworzyć pojedynczy plik kodu źródłowego lub formularza. W rzeczywistości możesz otworzyć dowolny typ pliku tekstowego (włączając w to pliki o rozszerzeniach nie występujących na liście typów). Oba polecenia (Open i Open Project) reprezentowane są również przez przyciski na pasku narzędzi.

0x01 graphic

Jeżeli otworzysz plik modułu źródłowego (.pas) skojarzonego w formularzem, Delphi otworzy zarówno plik jako kod źródłowy (w Edytorze Kodu) jak i odnośny formularz (w Projektancie Formularzy).

Istnieje możliwość otwarcia kilku plików jednocześnie - wystarczy zaznaczyć je w oknie, a następnie kliknąć na przycisku OK. Wybrane pliki będą kolejno otwierane, a każdemu z nich zostanie przydzielona odrębna zakładka w górnej części okna edytora.

0x01 graphic

Do otwarcia pliku możesz również wykorzystać technikę „drag-and-drop” (przeciągnij i upuść). Wystarczy, na przykład, wybrać plik (lub ich grupę) w Eksploratorze Windows i przeciągnąć go (ją) nad obszar Edytora Kodu; przeciągnięte pliki zostaną otwarte w Edytorze Kodu.

Zapisanie pliku umożliwiają dwa polecenia menu: FileSave lub FileSave As. Możesz również użyć w tym celu kombinacji klawiszy Ctrl+S; jeżeli plik nie był do tej pory zapisywany, otwarte zostanie okno Save As, umożliwiające wprowadzenie nazwy dla zapisywanego pliku.

Praca z blokami tekstu

Wprawdzie zaznaczanie i wykorzystywanie bloków tekstu to podstawowe operacje edytorskie -pomyślałem jednak, że użytecznym może się okazać krótkie przypomnienie podstawowych zasad pracy z blokami tekstu w Edytorze Kodu Delphi.

Krótki blok tekstu można zaznaczyć przeciągając myszkę nad jego obszarem. Zaznaczony tekst można następnie kopiować, wycinać i wklejać w miarę potrzeby. Do zaznaczenia dłuższego bloku możesz wykorzystać metodę Klik+Shift+Klik. Najpierw kliknij w miejscu, w którym chcesz rozpocząć blok; następnie, trzymając naciśnięty przycisk Shift, kliknij w miejscu, w których chcesz blok zakończyć. W efekcie cały fragment tekstu pomiędzy kliknięciami zostanie zaznaczony jako blok tekstu.

Inną użyteczną cechą jest możliwość szybkiego zaznaczania pojedynczego słowa. Aby wybrać dowolny element - słowo kluczowe, nazwę funkcji, zmienną itp. - wystarczy kliknąć na nim dwukrotnie. Po zaznaczeniu słowa można przeprowadzić na nim dowolną operację edytorską.

0x01 graphic

Aby wybrać myszką pojedynczą linę kodu, kliknij kursorem na jej początku, a następnie przeciągnij go prosto w dół do następnej linii. Operację tę można również przeprowadzić za pomocą klawiatury. Najpierw naciśnij klawisz Home, powodując przemieszczenie kursora do początku linii, następnie użyj kombinacji klawiszy Shift i strzałki kursora w dół, podświetlając w ten sposób całą linię kodu.

Istnieją tuziny różnych kombinacji klawiszy, które można wykorzystać do podświetlenia tekstu (i innych operacji edytorskich). Kompletną listę dostępnych skrótów klawiszowych znajdziesz w systemie pomocy Delphi.

0x01 graphic

Użyteczną operacją przy edycji kodu źródłowego programu jest przesuwanie w poziomie zawartości zaznaczonego bloku tekstowego. W Edytorze Kodu Delphi służą do tego kombinacje klawiszy Ctrl+Shift+I (przesunięcie w prawo - ang. Indent) oraz Ctrl+Shift+U (przesunięcie w lewo - ang. Unindent).

Edytor Kodu wykorzystuje technikę „drag-and-drop”. Aby przesunąć blok kodu, wystarczy zaznaczyć go, a następnie umieścić nad nim kursor myszy i przeciągnąć podświetlony kod do miejsca, w którym chcesz go umieścić. Po zwolnieniu przycisku myszy zaznaczony blok tekstu zostanie przesunięty na nowe miejsce. Jeżeli, zamiast przemieszczania, chcesz skopiować blok tekstu, przed jego upuszczeniem naciśnij klawisz Ctrl.

Cofanie poleceń (Undo)

Edytor Kodu Delphi posiada praktycznie nieograniczoną liczbę poziomów cofania wykonanych poleceń (domyślnie 32767). Domyślnie można wycofywać się z wydanych poleceń co najwyżej do momentu ostatniego zapisu pliku; przez zmianę ustawień edytora można jednak zlikwidować to ograniczenie. Opcje i właściwości edytora będą omawiane w dalszej części tego rozdziału, w sekcji zatytułowanej „Zamiana ustawień edytora”.

Wyszukiwanie i zamiana fragmentów tekstu

Jednymi z częstszych operacji, wykonywanych nie tylko w procesie programowania, są wyszukiwanie i zamiana fragmentów tekstu. Okno poszukiwań może służyć do odnajdywania określonego fragmentu kodu, który to fragment może stanowić np. nazwę zmiennej lub procedury. Z kolei dzięki oknu zamiany możliwe jest zastąpienie określonego wzorca tekstowego innym tekstem. Możliwości wykorzystania tych dwóch narzędzi są nieograniczone.

W oknach dialogowych Find Text i Replace Text zawarte są z grubsza wszystkie standardowe operacje poszukiwania i zamiany. Do przywołania okna poszukiwania tekstu Find Text służy polecenie menu SearchFind lub kombinacja klawiszy Ctrl+F. Szukany łańcuch należy wpisać w pole Text to find a następnie kliknąć na przycisku OK lub nacisnąć klawisz Enter. Jeżeli specyfikowany łańcuch zostanie znaleziony, nastąpi jego podświetlenie.

0x01 graphic

Podświetlenie znalezionego łańcucha nie jest tym samym, co zaznaczenie bloku tekstowego. Zauważ, że (standardowo) blok tekstu zaznaczony jest na niebiesko, podczas gdy znaleziony tekst podświetlany jest na czarno - nie nadaje się on do edycji, podświetlenie służy jedynie wyodrębnieniu go w tekście.

Okno Replace Text (rysunek 9.12) jest dostępne poprzez polecenie menu SearchReplace lub kombinację klawiszy Ctrl+R. Poza kilkoma oczywistymi wyjątkami, zawiera ono te same elementy, co okno Find Text.

Rysunek 9.12.

Okno dialogowe zamiany tekstu

0x01 graphic

W większości, opcje okien zamiany i poszukiwania pełnią identyczną rolę. Wybranie opcji Case sensitive sprawi iż poszukiwany będzie jedynie tekst dokładnie pasujący do wzorca (pod względem wielkości czcionki).

W większości przypadków opcje okien poszukiwania i zamiany mają identyczne znaczenie. Wybranie opcji Case sensitive sprawi, iż w podanym wzorcu tekstu rozróżniane będą małe/duże litery - poszukiwany będzie jedynie tekst dokładnie pasujący do wzorca pod tym względem. Efektem wybrania opcji Whole Words Only będzie uwzględnianie tylko tych - pasujących do wzorca - fragmentów tekstu, które stanowią odrębne słowa. Dla przykładu załóżmy, że chcesz zastąpić słowo Form słowem MojForm, w takim przypadku powinieneś szukać jedynie kompletnych słów, ponieważ wyrażenie Form może być stosowane również w nazwach innych zmiennych (np. TForm - która nie powinna zostać zamieniona na TMojForm).

Wyjaśnienia wymaga również opcja Regular Expressions (wyrażenia regularne). Jeżeli pole tej opcji jest zaznaczone, w szukanym łańcuchu dozwolone są znaki zastępcze i specjalne. Dzięki znakom specjalnym można szukać łańcuchów zawierających takie elementy jak znaczniki początku i końca linii. Znaki zastępcze działają całkiem podobnie, jak w przypadku operacji na katalogach. Kompletny opis wyrażeń regularnych znajdziesz w systemie pomocy Delphi pod hasłem „Regular Expressions”.

Przy zamianie tekstu - dla własnego bezpieczeństwa - lepiej jest pozostawić włączoną opcję Prompt on Replace. Podczas wykonywania operacji Replace All (zamiana wszystkich wystąpień) z włączoną opcją Prompt on Replace edytor wymagał będzie potwierdzenia każdej zamiany. Jako że w takiej sytuacji łatwo jest o błędną ocenę sytuacji, należy szczególnie pamiętać o możliwości wykorzystania polecenia Undo.

Reszta opcji jest w miarę jasna i nie trzeba ich dodatkowo tłumaczyć

Poszukiwanie w plikach

Poszukiwanie w plikach (Find in Files) jest doskonałym narzędziem, służącym do poszukiwania wzorca tekstu w wielu plikach. Często korzystam z tego narzędzia, poszukując określonych metod, zmiennych lub klas w kodzie źródłowym VCL. Jest to wygodne i bardzo funkcjonalne narzędzie, warte nauki korzystania z niego.

Narzędzie poszukiwania w plikach wywołuje się poleceniem menu SearchFind in Files. Można też użyć kombinacji klawiszy Ctrl+F, przywołując na ekran okno dialogowe Find Text i klikając na zakładce Find in Files. Okno dialogowe Find Text z widoczną zakładką Find in Files zostało przedstawione na rysunku 9.13.

Rysunek 9.13.

Okno dialogowe Find text

0x01 graphic

Narzędzie poszukiwania w plikach korzysta z kilku opcji charakterystycznych dla zwykłych operacji poszukiwania (dokładne dopasowanie, tylko całe słowa i wyrażenia regularne). Dodatkowo można zadecydować o tym, czy poszukiwanie ma być przeprowadzone we wszystkich plikach projektu (opcja Search all files in project), we wszystkich otwartych plikach (opcja Search all open files) lub w plikach należących do określonego katalogu, łącznie ze wszystkimi podkatalogami (opcja Search in directories).

Po rozpoczęciu operacji poszukiwania, w prawej dolnej części ekranu wyświetlone zostanie małe okno o nazwie Searching. Okno to pokazuje stan poszukiwań, tzn. nazwę aktualnie przeszukiwanego pliku i liczbę pasujących wystąpień znalezionych do tej pory. Zamknięcie okna Searching jest równoważne z anulowaniem procesu poszukiwania.

Wszystkie znalezione wystąpienia poszukiwanego tekstu są wyświetlane w oknie informacyjnym Edytora Kodu. Okno to pokazuje nazwę pliku, w którym znaleziono tekst pasujący do wzorca, numer linii, w której znaleziony został tekst, a także linię tekstu z podświetlonym fragmentem, będącym celem poszukiwań. Aby wyświetlić plik zawierający tekst pasujący do wzorca, wystarczy podwójnie kliknąć na linii w oknie informacyjnym. Delphi otworzy żądany plik i wyświetli go w taki sposób, aby widoczna była linia zawierająca szukany tekst. Proces przeszukiwania zbioru plików przez Delphi został przedstawiony na rysunku 9.14.

Podczas wyboru maski plików zastosować można wszystkie zwyczajowe znaki blankietowe; na przykład, aby przeszukać wszystkie pliki tekstowe w wybranym katalogu należałby wpisać następującą maskę:

C:\MojeProj\*.txt

Rysunek 9.14.

Poszukiwanie tekstu w plikach

0x01 graphic

Narzędzie poszukiwania w plikach jest niezastąpione, ja osobiście korzystam z niego na okrągło. Nauczenie się obsługi tego narzędzia zaoszczędzi Ci w przyszłości dużo czasu.

Pomoc

Jedną z najbardziej użytecznych cech Edytora Kodu jest jego integracja z systemem pomocy Delphi. Wystarczy, że umieścisz kursor nad słowem kluczowym Objet Pascala, nazwą właściwości lub metody VCL, lub dowolnym innym tekstem specyficznym dla Delphi i naciśniesz klawisz F1. Jeżeli w pliku pomocy Delphi został zdefiniowany temat pomocy dla tekstu wskazanego przez kursor, uruchomiony zostanie mechanizm pomocy Windows, który wyświetli odpowiednią stronę. Jeżeli z testem nie jest związany żaden temat pomocy, wyświetlony zostanie komunikat o błędzie.

Cecha ta okazuje się niezwykle użyteczna, kiedy nie pamiętasz sposobu wykorzystania określonych elementów Delphi, Object Pascala lub biblioteki VCL; pomoc jest w zasięgu klawisza.

Specyficzne cechy edytora

Delphi posiada kilka cech, niezwykle użytecznych podczas pracy z dużą ilością kodu. Zostały one opisane w kolejnych sekcjach.

Szablony kodu

Szablony kodu umożliwiają wstawianie fragmentów predefiniowanego kodu (lub jakichkolwiek innych tekstów) do modułów kodu źródłowego. Aby użyć szablonu kodu w trakcie pracy z Edytorem Kodu, naciśnij kombinację klawiszy Ctrl+J. Kiedy to zrobisz, wyświetlone zostanie okienko zawierające listę dostępnych szablonów. Wybierz jeden z nich i naciśnij Enter, a tekst związany z szablonem zostanie wstawiony do Twojego kodu źródłowego. Lista szablonów kodu widoczna po wybraniu kombinacji Ctrl+J została przedstawiona na rysunku 9.15.

Rysunek 9.15.

Lista szablonów kodu Delphi

0x01 graphic

Istnieje możliwość dodania nowych szablonów kodu lub edycji szablonów istniejących. Do tego celu służy jedna ze stron okna dialogowego ustawień środowiska (Environment Options) o nazwie Code Insight. Innym rozwiązaniem jest bezpośrednie otwarcie pliku szablonu kodu w dowolnym edytorze tekstu (takim jak Edytor Kodu Delphi) i przeprowadzenie niezbędnych modyfikacji szablonów. Plik szablonów kodu nosi nazwę DELPHI32.DCI i znajduje się w katalogu Delphi 4\Bin.

Modyfikuj szablony według własnego uznania tak, aby odpowiadały one Twoim potrzebom. Ja, na przykład, zmodyfikowałem szablon kodu reprezentujący wyrażenie pętli for w następujący sposób:

for I:= 0 to Pred(|) do begin

end;

Zwróć uwagę na znak pipeline (|). Znak ten w szablonie kodu służy jako wskaźnik położenia, określający umiejscowienie kursora, po wstawieniu tekstu szablonu do kodu źródłowego.

0x01 graphic

Jeżeli wprowadziłeś wiele modyfikacji do pliku szablonu kodu, zrób sobie kopię zapasową tego pliku i umieść ją gdzieś w bezpiecznym miejscu. Wykonanie kopii związane jest z programem instalacyjnym Delphi, który pokrywa plik DELPHI32.DCI w trakcie uaktualniania programu lub instalowania go na istniejącej kopii.

Szablony kodów mogą być wykorzystane nie tylko do wstawiania kodu. Tutaj, w firmie TurboPower Software zaopatrujemy nasze pliki kodu źródłowego w odpowiednie nagłówki, wyglądające mniej więcej tak:

{**************************************************};

{* Nazwa pliku i wersja *};

{* Copyright (c) TurboPower Software 1998 *};

{* All rights reserved *};

{**************************************************};

Ponieważ większość z powyższego tekstu pozostaje niezmieniona, mam gotowy szablon wstawiający nagłówek do każdego nowego pliku kodu źródłowego, jaki tworzę. Używaj szablonów kodu w przypadku tekstów, które używasz odpowiednio często w trakcie codziennego programowania.

Parametry kodu

Mechanizm parametrów kodu wyświetla podpowiedzi zawierające opis niezbędnych parametrów metody VCL lub funkcji Windows API. Istnieje tak wiele metod biblioteki VCL i funkcji Windows API, że niemożliwością jest pamiętanie parametrów każdej z nich. Podpowiedzi oszczędzają czas wyświetlając parametry metody w trakcie pisania na klawiaturze. Powiedzmy, dla przykładu, że wywołujesz metodę SetBounds. W chwili kiedy wpiszesz znak otwarcia nawiasu, wyświetlone zostanie okno podpowiedzi, takie jakie przedstawia rysunek 9.16.

Rysunek 9.16.

Mechanizm parametrów kodu w działaniu

0x01 graphic

Jak widać na rysunku 9.16, podpowiedź prezentuje wszystkie parametry funkcji. Parametr, który powinien być wpisany w następnej kolejności jest pogrubiony. Po wpisaniu bieżącego parametru, pogrubiany jest następny. Proces ten trwa aż do momentu, kiedy wpisane zostaną wszystkie niezbędne parametry, po czym podpowiedź znika z ekranu. Opcje mechanizmu parametrów kodu można ustawić na stronie Code Insight w oknie ustawień środowiska (Environment Options). Strona ta zostanie szczegółowo omówiona w sekcji zatytułowanej „Strona Insight Page”.

Uzupełnianie kodu

Jest to kolejna cecha Edytora Kodu, której zadaniem jest zaoszczędzenie czasu programisty. Wpisz nazwę zmiennej dowolnej klasy, dodając na końcu operator kropki, a Edytor Kodu wyświetli listę zawierającą wszystkie właściwości i metody tej klasy. Na przykład, dysponując komponentem notatki o nazwie Notatka, wystarczy wpisać

Notatka.

i zaczekać przez chwilę. Wyświetlona zostanie lista, pokazana na rysunku 9.17.

Rysunek 9.17.

Mechanizm uzupełniania kodu wyświetlający okno metod i właściwości klasy Tmemo

0x01 graphic

Kiedy wyświetlone zostanie okno listy, jej element można wybrać na dwa różne sposoby. Pierwszy z nich polega na wybraniu właściwości lub metody przy pomocy myszki lub klawiatury, a następnie naciśnięciu klawisza Enter. Wybrana metoda lub właściwość zostanie dodana do kodu. Można również wpisać kilka pierwszych liter nazwy właściwości lub metody, którą chcesz wstawić do kodu - w miarę wpisywania kolejnych znaków, Delphi będzie przeszukiwało całą listę w poszukiwaniu pasującego elementu i podświetli ten z nich, który najbardziej będzie odpowiadał wzorcowi wprowadzonemu z klawiatury.

Kiedy zauważysz metodę lub właściwość, której szukasz, naciśnij Enter, a zostanie ona dodana do kodu programu. Jeżeli nie chcesz korzystać z okna uzupełnienia kodu, możesz nacisnąć klawisz Esc, co spowoduje zniknięcie listy z ekranu.

Uzupełnianie kodu oszczędza czas, udostępniając listę właściwości i metod edytowanego elementu. Dodatkową cechą tego mechanizmu jest kontrolowanie pisowni i wielkości liter nazw metod i właściwości. Wystarczy wybrać właściwość lub metodę, nacisnąć klawisz Enter, a Delphi umieści wskazany element w kodzie.

Podgląd symboli

0x08 graphic
Mechanizm poglądu symboli wyświetla okno podpowiedzi po umieszczeniu kursora myszy nad niemal każdym identyfikatorem występującym w kodzie źródłowym. Dla przykładu, nowy, standardowy projekt zawiera następującą linię w sekcji interfejsu:

TForm1 = class(TForm)

Po umieszczeniu kursora myszy nad identyfikatorem TForm, pojawia się okno podpowiedzi z następującym tekstem:

type Forms.TForm = class(TCustomForm) - Forms.pas (584)

Linia ta przedstawia deklarację klasy TForm a także informuje, iż jej deklaracja znajduje się w 584 linii modułu Forms.pas.

Podgląd symboli dostarcza informacji na temat każdej zmiennej występującej w Twoim programie. Jest to szczególnie wygodne, gdy stracisz orientację co do typu zmiennej (nie będziesz pewny, czy zmienna X jest typu Byte, Word, czy też może Integer).

Uzupełnianie klas

0x08 graphic
Uzupełnianie klas jest nowym narzędziem pakietu Delphi 4. Zadeklaruj dowolne właściwości lub metody w sekcji interfejsu, a następnie wybierz kombinację klawiszy Ctrl+Shift+C. Delphi doda wówczas do sekcji implementacyjnej niezbędny kod uzupełniający definicję klasy. Mechanizm ten najlepiej można zilustrować wykonując proste ćwiczenie. Postępuj według poniższego scenariusza:

  1. Rozpocznij od pustego projektu.

  1. Przejdź do Edytora Kodu i zlokalizuj sekcję interfejsu (interface) deklaracji klasy formularza.

  2. Wpisz następujący kod w publicznej (public) części deklaracji klasy formularza:

procedure Test;

function Pobierz : Integer;

  1. Wybierz kombinację klawiszy Ctrl+Shift+C.

Po wykonaniu czwartego kroku, Delphi automatycznie doda ciała metod Test i Pobierz do sekcji implementation oraz umieści kursor w pierwszej z tych metod. Dodany kod wygląda następująco:

function TForm1.Pobierz : Integer;

begin

end;

procedure TForm1.Test;

begin

end;

Nie opuszczaj tego projektu, gdyż będzie on potrzebny ponownie w następnej sekcji.

Mechanizm ten działa zarówno w przypadku deklaracji metod, jak i właściwości. Wpisz deklarację właściwości, naciśnij kombinację klawiszy Ctrl+Shift+C, a Delphi uzupełni deklarację właściwości, dodając do niej nawet metodę write. Tworzenie właściwości będzie omawiane w dopiero w rozdziale dwudziestym, „Tworzenie komponentów” dlatego to, co w tej chwili czytasz, może brzmieć dla Ciebie trochę tajemniczo. Wszystko wyjaśni się, kiedy zaczniesz tworzyć swoje własne komponenty.

Dla mnie osobiście, uzupełnianie klas jest jedną z najlepszych nowości w Delphi 4. Cecha ta zaoszczędziła mi dużo czasu w trakcie tworzenia komponentów. Ciężko byłoby mi się obejść bez tego narzędzia, ponieważ korzystam z niego już od dłuższego czasu.

Nawigacja po module

0x08 graphic
Nawigacja po module pozwala na szybkie przemieszczanie się między metodą w sekcji implementacyjnej a jej deklaracją w sekcji interfejsu i z powrotem. Ponownie - ćwiczenie jest warte więcej niż tysiąc słów:

  1. Przejdź do deklaracji klasy formularza, który modyfikowałeś w poprzednim ćwiczeniu.

  1. Kliknij na linii zawierającej deklarację procedury Test.

  2. Wybierz z klawiatury kombinację klawiszy Ctrl+Shift+↓ .Edytor Kodu przejdzie do ciała procedury Test w sekcji implementacyjnej.

  3. Wybierz kombinację Ctrl+Shift+↑. Edytor Kodu powróci z powrotem do deklaracji procedury Test w części interfejsu.

  4. Przejdź niżej do linii zawierającej deklarację klasy Pobierz. Ponownie wybierz kombinację klawiszy Ctrl+Shift+↓. Edytor Kodu ponownie przejdzie do sekcji implementacyjnej, a konkretnie - do ciała funkcji Pobierz.

Jak widzisz, mechanizm nawigacji po module pozwala na szybie przechodzenie pomiędzy sekcją implementacyjną a sekcją interfejsu.

0x01 graphic

Nie ma jednak znaczenia, której strzałki (w górę czy w dół) użyjesz - efektem zawsze będzie „przełączenie się” pomiędzy deklaracją w sekcji interface a definicją w sekcji implementation (lub odwrotnie).

Przeglądarka modułów

0x08 graphic
Przeglądarka modułów jest kolejnym narzędziem służącym nawigacji. Będąc w Edytorze Kodu, przytrzymaj wciśnięty klawisz Ctrl i umieść kursor myszy nad nazwą identyfikatora. Identyfikator ten zostanie podświetlony na niebiesko i podkreślony. Kliknij na nim, a Delphi przeniesie Cię do tego miejsca w kodzie źródłowym, w którym znajduje się jego deklaracja.

Wynika z tego, że przeglądarka modułów jest bardzo podobna do mechanizmu nawigacji po module, w rzeczywistości jest ona jednak narzędziem silniejszym; funkcjonuje zarówno w odniesieniu do identyfikatorów VCL, jak i tych zdefiniowanych przez użytkownika.

Zilustrujmy to przykładem. Wcześniej jednak, muszę Cię uprzedzić że poniższe ćwiczenie uda się tylko w przypadku wersji Professional lub Client/Server, do jego przeprowadzenia niezbędny jest bowiem kod źródłowy Delphi. Postępuj według poniższych kroków:

  1. Stwórz nową aplikację. Umieść w formularzu przycisk i obiekt Memo.

  1. Wybierz polecenie menu ProjectOptions. Po otwarciu okna ustawień projektu (Project Options) kliknij na zakładce Directories/Conditionals. Wpisz następujący tekst w pole Search path:

$(DELPHI)\source\vcl;$(DELPHI)\source\rtl\win

Zamknij okno przyciskiem OK.

  1. Kliknij podwójnie na przycisku i dodaj następujący tekst do jego zdarzenia OnClick:

Memo1.Clear;

Metoda Clear klasy TMemo czyści zawartość obiektu. Jesteś ciekaw, jak wygląda kod źródłowy VCL odpowiadający metodzie Clear?

  1. Przytrzymaj klawisz Ctrl i kliknij na łańcuchu Clear.

  2. Po kilku chwilach w Edytorze Kodu wyświetlony zostanie moduł VCL o nazwie StdCtrls z kursorem ustawionym na metodzie TCustomEdit.Clear (definicja klasy Clear znajduje się w klasie TCustomEdit, będącej jednym z przodków klasy TMemo). Sama metoda ma następującą postać:

procedure TCustomEdit.Clear;

begin

SetWindowText(Handle, '');

end;

Tylko jedna linia kodu. Skąd jednak pochodzi metoda SetWindowText? Wykonaj kolejny krok.

  1. Ponownie przytrzymaj przycisk Ctrl i kliknij na metodzie SetWindowText. Po chwili wyświetlony zostanie moduł Windows, a kursor umieszczony zostanie w następującej linii:

function SetWindowText; external user32 name 'SetWindowTextA';

Z linii tej można wywnioskować, że SetWindowText jest funkcją Windows zlokalizowaną w bibliotece USER32.DLL Koniec śledztwa, chociaż nie do końca.

  1. Przyjrzyj się teraz zakładce w górnym prawym rogu okna Edytora Kodu. Czy widzisz przyciski back i next? Kliknij na przycisku back (wskazującym na lewo). Edytor przejdzie do poprzednio przeglądanego elementu (tj. funkcji Clear w module StdCtrls).

  2. Kliknij na przycisku next. Edytor ponownie wyświetli funkcję SetWindowText modułu Windows.

  3. Kliknij na strzałce listy rozwijalnej obok przycisku back. Zobaczysz historię lokalizacji kodu źródłowego; wybranie dowolnego elementu spowoduje przejście Edytora Kodu do wskazanego miejsca w kodzie.

Przeglądarka modułów jest doskonałym narzędziem, które pozwala poruszać się nie tylko po własnych modułach, ale również po kodzie źródłowym biblioteki VCL i innych, zewnętrznych bibliotekach komponentów którymi dysponujesz. Pamiętaj, że przeglądanie kodu VCL może Cię wiele nauczyć, dlatego nie bój się korzystać z tej możliwości.

Zakładki

Zakładki (ang. bookmarks - nie mylić z zakładkami (ang. tabs) przy górnej krawędzi okna) służą do tymczasowego zaznaczenia dowolnego miejsca w pliku kodu źródłowego. Czasami będziesz musiał, na przykład, opuścić blok kodu nad których pracujesz w danej chwili, aby zajrzeć do innego fragmentu, nad którym pracowałeś uprzednio lub skopiować jakiś odległy fragment tekstu. Umieszczając zakładkę w miejscu bieżącej pracy przed przejściem do innej części kodu będziesz mógł powrócić w to miejsce za naciśnięciem klawisza. W kodzie można umieścić maksymalnie do dziesięciu zakładek.

Aby umieścić zakładkę w wybranym przez siebie miejscu, naciśnij kombinację klawiszy Ctrl+Shift+<numer-zakładki> - na przykład, aby ustawić zakładkę o numerze 0, umieść kursor w miejscu, które chcesz zaznaczyć, a następnie wybierz kombinację klawiszy Ctrl+Shift+0. Po ustawieniu zakładki, na gutterze umieszczona zostanie ikona informująca o istnieniu zakładki w linii przez nią wskazywanej. Ikona wskazuje na numer zakładki (rysunek 9.18).

Rysunek 9.18.

Zakładka ustawiona w Edytorze Kodu

0x01 graphic

Przejście do miejsca wskazywanego przez zakładkę wymaga naciśnięcia kombinacji klawiszy Ctrl+<numer zakładki>. Nawiązując do przykładu przedstawionego wcześniej - po naciśnięciu kombinacji Ctrl+0 nastąpiłby przejście do miejsca oznaczonego zakładką o numerze 0. (Do ustawiania i poruszania się między zakładkami można również wykorzystać menu kontekstowe Edytora Kodu.)

Usunięcie zakładki wymaga umieszczenia kursora w dowolnym miejscu wskazywanej przez nią linii kodu i ponownego naciśnięcia kombinacji klawiszy Ctrl+Shift+<numer zakładki>.

0x01 graphic

Zakładki można ustawiać w każdym z plików otwartych w Edytorze Kodu. Na przykład, zakładkę nr 0 można ustawić w jednym pliku kodu źródłowego, następnie przejść do innego pliku i tam również ustawić zakładkę o tym samym numerze. Stąd wniosek, że nie można poruszać się po zakładkach między plikami. Jeżeli w pliku Modul1.pas ustawisz zakładkę nr 0, nie będziesz mógł przejść do niej, naciskając kombinację Ctrl+0 we wnętrzu modułu Modul2.pas.

Żeby zobaczyć w praktyce zasadę działania zakładek, wykonaj następujące ćwiczenie:

  1. Otwórz dowolny plik kodu źródłowego w Edytorze Kodu.

  1. Przejdź na sam koniec pliku, kliknij na jednej z linii kodu.

  2. Naciśnij kombinację klawiszy Ctrl+Shift+0, aby ustawić zakładkę nr 0. Ikona zakładki pojawi się na gutterze.

  3. Przejdź na początek pliku, naciskając kombinację klawiszy Ctrl+Home.

  4. Teraz naciśnij kombinację Ctrl+0, czego efektem będzie skok do miejsca ustawienia zakładki. Edytor kodu wyświetli linię, w której ustawiono zakładkę, a kursor zostanie ustawiony dokładnie w tym samym miejscu, w którym znajdował się w chwili ustawienia zakładki.

  5. Wyczyść zakładkę, naciskając ponownie kombinację klawiszy Ctrl+Shift+0. Usunięcie zakładki jest sygnalizowane zniknięciem ikony zakładki z guttera.

Zakładki są mechanizmem tymczasowym - kiedy mianowicie zamkniesz plik kodu źródłowego, a następnie otworzysz go ponownie, okaże się, że zakładka nie została zachowana. Zauważ również, że zakładkę można ustawić lub usunąć jedynie z głównej części klawiatury - próby użycia w tym celu klawiatury numerycznej nie dają żadnego efektu.

Szukanie przyrostowe

Dzięki opcji szukania przyrostowego (ang. incremental search) można szybko wynajdywać krótkie serie znaków. Aby rozpocząć poszukiwanie przyrostowe, wybierz polecenie menu SearchIncremental Search lub wciśnij kombinację klawiszy Ctrl+E. Najlepiej zrozumiesz zasadę działania poszukiwania przyrostowego wykonując proste ćwiczenie. Postępuj następująco:

  1. Korzystając z Repozytorium, stwórz nowy plik tekstowy (nieważne, czy aktualnie masz otwarty jakikolwiek projekt).

  1. Wpisz następujący tekst:

Nauka pisania programów dla

Windows krok po kroku nie

jest taka zła. Czy to nie

czas, aby wrócić do pracy?

  1. Przesuń kursor z powrotem na początek pliku (Ctrl+Home).

  2. Aby rozpocząć poszukiwanie wznoszące, naciśnij kombinację klawiszy Ctrl+E. Będziesz szukał słowa „pracy”. Zauważ, że na pasku statusu Edytora Kodu pojawił się komunikat Searching for: (poszukiwanie).

  3. Wpisz z klawiatury znak p. Podświetlona zostanie litera p w słowie „pisania”. Nie jest to słowo, którego szukasz.

  4. Teraz wpisz znak r. Odszukane zostanie następne wystąpienie kombinacji pr, tym razem w słowie „programów”. Nadal jednak nie jest to słowo, którego szukasz.

  5. Wpisz literę a. W wyrazie „pracy” podświetlone zostaną litery pra. Teraz wpisz litry c i y. Na pasku statusu Edytora Kodu widnieje w tej chwili komunikat Searching for: pracy, a samo słowo jest całkowicie podświetlone. Znalazłeś to, czego szukałeś.

  6. Zakończ poszukiwanie przyrostowe naciskając Esc (lub Enter). Zamknij plik tekstowy, nie zapisując go.

Koniec przykładu. Poszukiwanie przyrostowe jest bardzo poręcznym narzędziem w przypadku poszukiwania małych ilości tekstu.

0x01 graphic

Jeżeli podczas poszukiwania przyrostowego popełnisz błąd, wpisując przez przypadek nieprawidłowy znak, możesz go usunąć klawiszem Backspace.

Odszukiwanie pasujących nawiasów

Edytor Kodu posiada cechę pomagającą w lokalizowaniu par odpowiadających sobie nawiasów. Aby znaleźć nawias odpowiadający danemu, umieść przed tym ostatnim kursor (nie ma znaczenia czy jest to nawias otwierający, czy też zamykający) i naciśnij kombinację klawiszy Alt+[. Kursor przeskoczy do nawiasu, będącego odpowiednikiem nawiasu, od którego rozpocząłeś.

Ponowne naciśnięcie Alt+[ spowoduje przeskoczenie kursora do miejsca startu. Ta sama kombinacja działa dla nawiasów klamrowych i zwykłych. Zgubienie się w plątaninie nawiasów jest nadal możliwe, ale wiadomo już przynajmniej, jak znaleźć wyjście z tej sytuacji.

Menu kontekstowe Edytora Kodu

Tak jak w przypadku większości okien, z którymi zetknąłeś się w Delphi, również Edytor Kodu posiada swoje własne menu kontekstowe. Menu to można generalnie podzielić na dwie części: elementy edytora i elementy debuggera. Obecnie zajmiemy się opcjami edytora, pozostawiając opcje debuggera do następnego rozdziału. Polecenia menu odnoszące się do procesu edycji, wraz z opisem, zostały zebrane w tabeli 9.4.

W zależności od bieżącego stanu Edytora Kodu i typu otwartego pliku, niektóre z elementów, zawartych w tablicy 9.14, mogą być czasowo nieaktywne.

Zmiana ustawień Edytora Kodu

Opcje edytora zajmują trzy strony okna ustawień środowiska (Environment Options). Aby wyświetlić to okno, wybierz polecenie menu ToolsEnvironment Options.

Tabela 9.4. Polecenia menu kontekstowego Edytora Kodu

Polecenia

Opis

Close Page

Zamyka aktywną stronę w oknie edytora. Jeżeli, od momentu ostatniego zapisu, plik na tej stronie został zmodyfikowany, wyświetlone zostanie stosowne zapytanie.

Open File At Cursor

Otwarcie pliku o nazwie wskazywanej przez kursor. Opcja ta działa jedynie w przypadku, gdy tekst wskazywany przez kursor reprezentuje nazwę pliku kodu źródłowego. Na przykład, jeżeli na liście modułów (uses) znajduje się plik o nazwie Modul2, możesz otworzyć go klikając na nim myszką i wybierając to polecenie z menu kontekstowego. Plik zostanie wyświetlony w nowym oknie edytora, które jednocześnie stanie się oknem aktywnym.

New Edit Window

Otwiera nową kopię Edytora Kodu. Jest to bardzo pomocne narzędzie przy porównywaniu zawartości dwóch plików kodu źródłowego.

Browse Symbol At Cursor

Rozpoczyna pracę przeglądarki modułów z bieżącym symbolem jako celem poszukiwania.

Topic Search

Wyświetla temat pomocy dla elementu wskazanego przez kursor (pod warunkiem że pomoc dla tego elementu jest
zdefiniowana). Operacja równoważna naciśnięciu klawisza F1.

Add to Interface

Dodaje właściwość, funkcję lub procedurę do komponentu ActiveX. Polecenie jest aktywne tylko w przypadku, gdy projekt jest projektem kontrolki ActiveX.

Toggle Bookmarks

Ustawia lub likwiduje zakładkę (od 0 do 9). Zakładka jest ustawiana w linii, w której znajduje się kursor.

Goto Bookmarks

Powoduje przejście do zakładki.

View As Form

Jeżeli aktywna strona w Edytorze Kodu zawiera tekstową reprezentację formularza, wybranie tej opcji spowoduje wyświetlenie go w Projektancie Formularzy.

Read Only

Przełącza bieżący plik między trybem „tylko do odczytu”, a trybem „odczyt/zapis”. Po ustawieniu trybu „tylko do
odczytu” plik nie może być modyfikowany, chociaż nadal można zaznaczać i kopiować tekst do Schowka. Stan „tylko do odczytu” jest sygnalizowany na pasku stanu komunikatem Read only. Po zamknięciu i ponownym otwarciu pliku jest mu przypisywany tryb „odczyt/zapis”.

Message View

Wyświetla lub ukrywa okno komunikatów Delphi. Okno to pojawia się automatycznie, gdy wystąpią błędy lub ostrzeżenia kompilatora/konsolidatora, ale może być również specjalnie wyświetlone lub ukryte właśnie tym poleceniem.

View Explorer

Przenosi aktywność do okna Eksploratora Kodu. Jeżeli Eksplorator Kodu nie jest zadokowany, polecenie to spowoduje przeniesienie go na pierwszy plan.

Properties

Wyświetla okno dialogowe ustawień środowiska (Environment Options), umożliwiając modyfikację dowolnej opcji.

0x01 graphic

Okno to można wyświetlić również z poziomu menu kontekstowego Edytora Kodu, za pomocą polecenia Properties. Odmienność tej metody polega na tym, że wyświetlone zostaną tylko cztery strony odnoszące się do opcji edytora. Wyświetlone w ten sposób okno zamiast nazwy Environment Options (ustawienia środowiska) będzie nosić nazwę Editor Properties (właściwości edytora). Opis w dalszych sekcjach odnosi się do tej właśnie metody.

Cztery strony ustawień środowiska, opisujące właściwości Edytora Kodu, noszą następujące nazwy:

Przyjrzyjmy się każdej z nich w kolejnych sekcjach.

Strona Editor

Strona ta pozwala kontrolować sposób zachowania się edytora. Jak widać z rysunku 9.19, posiada ona wiele opcji.

Rysunek 9.19.

Strona Editor w oknie właściwości edytora

0x01 graphic

U góry okna znajduje się lista o nazwie Editor SpeedSetting, pozwalająca na wybór jednej z opcji: Default Keymapping, IDE Classic, BRIEF Emulation lub Epsilon Emulation. Jeżeli zmodyfikujesz wartość tego pola, ustawienia edytora zostaną zmienione tak, aby dopowiadać wartościom domyślnym typu, który wybrałeś.

0x01 graphic

Jeżeli programujesz od niedawna lub do tej pory korzystałeś z innych kompilatorów firmy Borland, stosujących domyślny tryb mapowania klawiszy (Default keymapping), nie musisz się martwić tym, czego nie rozumiesz. Jeżeli od lat jesteś przyzwyczajony do korzystania z innego typu edytora, będziesz się cieszyć wiedząc, że nadal możesz korzystać ze skrótów klawiszowych i ustawień edytora, które znasz i lubisz, przez prostą zmianę wartości pola SpeedSetting na tej stronie i na stronie Display.

W dolnej części okna znajdują się dwa pola o nazwach Block Indent i Tab Stops. Dzięki nim możesz zmienić liczbę pól, o jaką przesuwane będą bloki tekstu w poziomie lub liczbę pól stosowaną przez tabulator. Przesuwanie bloków zostało omówione wcześniej w tym rozdziale, w sekcji zatytułowanej „Podświetlanie tekstu”.

0x01 graphic

Prawdziwi programiści stosują tabulacje rzędu dwóch lub trzech pól. (Ja stosuję tabulatory dwuznakowe).

Pole Undo limit (liczba możliwych cofnięć operacji) zawiera domyślną wartość 32767, która powinna okazać się wystarczająca dla większości potrzeb (taką mam przynajmniej nadzieję!), dlatego nie sądzę, abyś musiał modyfikować to ustawienie. Pole Syntax extensions umożliwia wyspecyfikowanie typów plików, w których powinien być stosowany mechanizm uwydatniania składni (syntax highlighting). Możesz Na przykład nie chcieć, aby podświetlanie składni stosowane było w standardowych plikach tekstowych (.txt), które otwierasz w Edytorze Kodu, dlatego ten typ plików nie jest uwzględniony w domyślnej liście.

Na środku strony znajduje się duża grupa opcji edytora. Ponieważ opcji tych jest całkiem sporo i trudno jest określić, które z nich są najważniejsze, w tej sprawie odsyłam Czytelnika do systemu pomocy Delphi. Wystarczy nacisnąć klawisz F1 w chwili, gdy okno to będzie otwarte lub kliknąć na przycisku Help, aby znaleźć wyjaśnienia do każdej z opcji którą widać na stronie. Podobnie jak w przypadku innych opcji, którym przyglądałeś się w trakcie studiowania tego rozdziału, możesz bez zastrzeżeń zaakceptować domyślne ustawienia Delphi.

Jedyną rzeczą jaką dodam jest to, że zawsze włączam opcję Find text at cursor (w przeciwieństwie do tego co może wskazywać rysunek 9.19). Kiedy opcja ta jest włączona, tekst wskazywany przez kursor jest zawsze umieszczany w oknie poszukiwań. Poszukiwanie tekstu staje się znacznie szybsze, ponieważ nie trzeba za każdym razem wpisywać tekstu poszukiwań. Opcja ta staje się szczególnie przydatna w przypadku stosowania narzędzia poszukiwania w plikach.

Strona Display

Opcje na tej stronie odnoszą się do rzeczywistego sposobu wyświetlania tekstu w oknie Edytora Kodu (patrz rysunek 9.20).

Rysunek 9.20.

Strona Display

0x01 graphic

W sekcji Display and file options, znajdziesz opcję BRIEF cursor shapes. Uaktywnij tę opcję, jeżeli zamiast pionowego kursora wolisz kursor poziomy. Zaznacz opcję Create backup files jeżeli chcesz, aby Delphi tworzyło kopie zapasowe za każdym razem, kiedy będziesz zapisywał swój plik lub projekt. Rozszerzenia plików zapasowych rozpoczynają się od znaku tyldy (~) - przykładowo, kopia zapasowa pliku o nazwie MojaApp.pas nosi nazwę MojaApp.~pa.

0x01 graphic

Ja z reguły nie mogę wytrzymać bałaganu wprowadzanego do katalogów projektu przez pliki zapasowe i dlatego wyłączam tę opcję. Ty możesz zrobić jak zechcesz.

Opcja Zoom to full screen kontroluje zachowanie Edytora Kodu w przypadku maksymalizacji jego okna. Kiedy opcja ta jest włączona, po maksymalizacji Edytor Kodu wypełnia cały obszar ekranu. Kiedy opcja jest wyłączona (domyślnie), górna część okna edytora zatrzymuje się na dolnej części głównego menu Delphi. Innymi słowy, główne menu będzie zawsze widoczne przy maksymalizacji okna, pod warunkiem wyłączenia opcji Zoom to full screen.

Możesz również określić czy prawy margines okna edytora powinien być widoczny. Prawy margines nie powoduje zawijania tekstu - można dalej pisać poza nim - ale otrzymujesz wtedy wizualną informację, że wprowadzana linia tekstu staje się odrobinę za długa. W sekcji tej można również zadecydować o tym, czy widoczny powinien być gutter, a także - jak duży (w pikselach) powinien być jego rozmiar.

Strona Display pozwala również na zmianę rodzaju i wielkości czcionki stosowanej w Edytorze Kodu. Na liście rozwijalnej znajdują się jedynie czcionki o stałym rozmiarze; czcionki drukarki i o rozmiarach proporcjonalnych nie są wyświetlane. Wybierz tę nazwę czcionki, która najlepiej odpowiada Twoim potrzebom i ustal jej optymalną wysokość. Okno podglądu pozwala ocenić wygląd wybranej czcionki.

Strona Kolor

Strona ta pozwala na dowolne modyfikacje ustawień okna Edytora Kodu i mechanizmu podświetlania składni (rysunek 9.21).

Rysunek 9.21.

Strona Color w oknie właściwości środowiska

0x01 graphic

W górnej części okna znajduje się lista rozwijalna o nazwie Color SpeedSetting. Umożliwia ona wybór jednego z czterech predefiniowanych schematów kolorystycznych. Schemat taki może być wykorzystany bezpośrednio lub posłużyć jako podstawa do własnego schematu kolorystycznego.

Korzystanie z tej strony jest bardzo proste. U jej dołu znajduje okno tekstowe z próbką kodu. Kliknięcie na jednym z kluczowych elementów kodu spowoduje jego wybranie na liście i wyświetlenie właściwych dla niego ustawień w siatce kolorów.

Teraz można zmodyfikować ustawienia tego elementu, wybierając nowy kolor i atrybuty czcionki, a także kolor tła. Na przykład, słowa kluczowe są wyświetlane pogrubioną czcionką w czarnym kolorze na białym tle (przy założeniu domyślnego schematu kolorystycznego). Aby ustawić zieloną pogrubioną czcionkę dla słów kluczowych kliknij na słowie procedure (w oknie przykładowego kodu źródłowego), a następnie zmień kolor na zielony. Kolory stosowane w przykładowym fragmencie ulegną zmianie tak, aby odwzorować wprowadzone zmiany. Kontynuuj modyfikację kolorów innych komponentów aż do momentu, kiedy okno uzyska wygląd odpowiadający Twoim potrzebom. Po zatwierdzeniu zmian przyciskiem OK, Edytor Kodu rozpocznie stosowanie nowego zestawu kolorów.

Strona Code Insight

Strona Code Insight służy do włączania/wyłączania mechanizmów: parametrów kodu (Code Parameters), uzupełniania kodu (Code Completion), wartościowania wyrażenia przez podpowiedź (Tooltip Expression Evaluation) i podglądu symboli (Tooltip Symbol Insight). Suwak Delay decyduje o czasie opóźnienia zadziałania mechanizmów wspomagających edycję. Na tej stronie można również dodawać, usuwać lub modyfikować szablony kodu. Strona Code Insight została przedstawiona na rysunku 9.22.

Rysunek 9.22.

Strona Code Insight w oknie opcji edytora

0x01 graphic

Przycisk Add pozwala dodać nowy szablon kodu, po jego kliknięciu wyświetlone zostanie okno dodawania szablonu (Add Code Template). Wpisz nazwę szablonu, jego opis i kliknij na przycisku OK. Teraz wpisz kod szablonu w okno edycji o nazwie Code, lub wklej blok programu przez Schowek. Możesz dodać dowolną liczbę szablonów. Po kliknięciu na przycisku OK zostaną one dodane do pliku szablonów. Wybranie przycisku Cancel jest równoważne rezygnacji ze zmian wprowadzonych do pliku szablonów.

0x01 graphic

Jeżeli obszar edycji okna dialogowego okaże się za mały, możesz dokonać edycji pliku szablonów w Edytorze Kodu Delphi. Plik szablonów nosi nazwę DELPHI32.DCI i znajduje się w katalogu Delphi 4\Bin.

Aby usunąć szablon kodu, najpierw wybierz go w tabeli Templates, a następnie kliknij na przycisku Delete. Jeżeli usuniesz szablon przez pomyłkę, kliknij na przycisku Cancel, a zmiany wprowadzone do pliku szablonów nie zostaną zapisane.

Przycisk Edit pozwala na zmianę nazwy i opisu szablonu kodu. Jego kliknięcie powoduje wyświetlenie okna dialogowego o nazwie Edit Code Template, bardzo podobnego do okna dodawania szablonu. Wpisz nową nazwę szablonu lub jego opis i kliknij OK. Podobnie jak w przypadku dodawania lub usuwania szablonów, zmiany dokonane w szablonach nie są zapisywane o ile nie klikniesz na przycisku OK. Wszelkich modyfikacji kodu szablonu można dokonać w obszarze edycji zatytułowanym Code.

Eksplorator Kodu

0x08 graphic
Eksplorator Kodu jest nową cechą szczególnie mile widzianą w zintegrowanym środowisku programistycznym Delphi. Eksplorator Kodu, jak wskazuje jego nazwa, służy do szybkiego przeglądania modułów kodu źródłowego. Zazwyczaj Eksplorator jest zadokowany w lewej części okna Edytora Kodu. Po pierwszym uruchomieniu Delphi, Edytor i Eksplorator Kodu wyświetlane są w postaci przedstawionej na rysunku 9.23.

Rysunek 9.23.

Eksplorator Kodu działający w toczeniu nowego projektu

0x01 graphic

Eksplorator Kodu pokazuje klasy, funkcje, procedury i zawartości list uses występujące we wszystkich modułach. W wyniku rozwinięcia węzła klasy wyświetlone zostają wszystkie, należące do niej, właściwości, zmienne, pola i metody.

Eksplorator Kodu prezentuje strukturę modułu aktualnie wybranego w oknie Edytora Kodu. W trakcie przełączania modułów w Edytorze Kodu, okno Eksploratora Kodu modyfikuje się wyświetlając nowy moduł.

Menu kontekstowe Eksploratora Kodu

Jak większość okien Delphi, również Eksplorator Kodu posiada własne menu kontekstowe. Polecenia tego menu zostały zestawione w tabeli 9.5.

Tabela 9.5. Polecenia menu kontekstowego Eksploratora Kodu

Polecenie

Opis

New

Dodaje do modułu nową zmienną, metodę, funkcję lub procedurę. Umożliwia również dodanie modułu do listy uses. Do wstawienia nowego elementu można również wykorzystać klawisz Insert.

Rename

Dokonuje zmiany nazwy identyfikatora (zmiennej, metody, funkcji, procedury, itd.). Zmiany nazwy można również dokonać przez jej bezpośrednią edycję.

View Editor

Przywołuje na pierwszy plan Edytor Kodu, jeżeli Eksplorator Kodu nie jest do niego zadokowany.

Dockable

Określa, czy okno Eksploratora Kodu powinno być dokowalne.

Niezwykle potężnym narzędziem jest polecenie wstawienia (Insert). Dzięki niemu można dodać procedurę, funkcję, metodę klasy lub zmienną do modułu lub występującej w nim klasy. Dokładniejsze omówienie tego polecenia nastąpi w dalszej części rozdziału.

Poruszanie się po module

Aby dotrzeć do określonej metody (funkcji lub procedury), wystarczy kliknąć podwójnie na jej identyfikatorze w Eksploratorze Kodu. Edytor Kodu przeskoczy do miejsca w kodzie źródłowym, w którym znajduje się wybrany element. Zlokalizowanie pola danych w klasie lub deklaracji zmiennej w module wymaga znalezienia identyfikatora tej zmiennej w oknie Eksploratora Kodu i dwukrotnego kliknięcia na nim. Efektem będzie wyświetlenie deklaracji szukanej zmiennej w oknie Edytora Kodu.

Dodawanie kodu przy użyciu Eksploratora Kodu

Eksplorator Kodu może służyć do dodawania metod i zmiennych do kodu źródłowego. Aby dodać pole zmiennej do klasy można, na przykład, wybrać polecenie Insert z menu kontekstowego Eksploratora Kodu, a następnie wpisać deklarację nowej zmiennej. Przykładowo, aby dodać zmienną X typu Integer powinieneś wpisać następujący tekst:

X : Integer;

Po naciśnięciu klawisza Enter, zmienna zostanie dodana do klasy.

Równie prosto dodawane są metody. Żeby przekonać się jak przebiega ten proces wykonaj następujące ćwiczenie:

  1. Rozpocznij projekt nowej aplikacji, przejdź do okna Edytora Kodu.

  1. W Eksploratorze Kodu, kliknij prawym przyciskiem myszy na węźle TForm1 i ybierz polecenie New z otwartego menu kontekstowego (lub naciśnij klawisz Insert).

  2. Wpisz poniższy tekst w pole edycji okna Eksploratora Kodu i naciśnij Enter:

procedure Test;

Poniżej węzła klasy TForm1 Delphi doda kolejny węzeł o nazwie public. Po jego rozwinięciu zobaczysz procedurę Test.

  1. Kliknij prawym przyciskiem myszy na klasie TForm1 i ponownie wybierz polecenie New. W polu edycji wpisz poniższy tekst i naciśnij Enter:

function Pobierz : Byte;

  1. Wstaw kolejny element. Tym razem zmienną:

AZmienna : Integer;

Prawdopodobnie nie zwróciłeś na to uwagi, ale podczas gdy dodawałeś nowe elementy, Delphi było zajęte modyfikowaniem modułu. Jego postać, po wykonaniu tego ćwiczenia, została przedstawiona na listingu 9.1.

Zauważ, że w module obecne są nie tylko deklaracje elementów które dodałeś, ale również kompletne ciała metod (w sekcji implementacyjnej). Eksplorator Kodu współpracuje z echanizmem uzupełniania klas, aby uczynić łatwiejszą Twoją pracę jako programisty. Na rysunku 9.24. przedstawiony został Edytor i Eksplorator Kodu po wykonaniu poprzedniego ćwiczenia.

Listing 9.1. Moduł po dodaniu nowych elementów poprzez Eksplorator Kodu

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs;

type

TForm1 = class(TForm)

private

{ Private declarations }

public

AZmienna: Integer;

function Pobierz: Byte;

procedure Test;

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.Pobierz: Byte;

begin

end;

procedure TForm1.Test;

begin

end;

end.

Rysunek 9.24.

Nowe pola i metody widoczne w Eksploratorze Kodu

0x01 graphic

Eksplorator Kodu jest jednocześnie przeglądarką modułu i narzędziem procesu tworzenia. W trakcie pisania kodu możesz korzystać z niego do poruszania się po module,. Tę szczególną cechę Eksploratora uważam za niezwykle użyteczną. Nic nie stoi na przeszkodzie, aby korzystać z Eksploratora Kodu przy dodawaniu kodu do własnych modułów. Narzędzie to znacznie przyśpiesza proces tworzenia, a jego dodatkową zaletą jest prostota użytkowania.

Ustawienia Eksploratora Kodu

Opcje wyświetlania Eksploratora Kodu znajdują się na jednej ze stron okna ustawień środowiska (Environment Options) o nazwie Explorer - stronę tę przedstawia rysunek 9.25.

Rysunek 9.25.

Strona Explorer w oknie ustawień środowiska

0x01 graphic

Różnorodne ustawienia na tej stronie kontrolują sposób działania Eksploratora Kodu, a akże wpływają na to jak dużo lub jak mało informacji jest wyświetlanych w jego oknie. Szczegółowy opis ustawień Eksploratora Kodu znajdziesz w pomocy Delphi.

Podsumowanie

W tym rozdziale poznałeś wiele zagadnień, które często są pomijane. Mam nadzieję, że zapamiętałeś niektóre wskazówki i będziesz mógł wykorzystać je w trakcie pracy z rojektami Delphi, a także jego Edytorem Kodu. Poznałeś również przeznaczenie niektórych opcji projektu i edytora. Nawet jeśli niewiele z tego zrozumiałeś, traktuj ten rozdział jako materiał, do którego można wracać wielokrotnie. Na końcu miałeś okazję przyjrzeć się Eksploratorowi Kodu. Jest to wspaniałe narzędzie, dlatego warto poświęcić trochę czasu na naukę jego obsługi. Kiedy przyzwyczaisz się do korzystania z Eksploratora Kodu, nie będziesz w stanie pracować bez niego.

Warsztat

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

Pytania i odpowiedzi

Nie. Pojedynczy projekt nie wymaga grupy projektowej. W zamian możesz użyć domyślnej grupy projektowej.

Przez przypadek ustawiłeś zwykłe okno dialogowe jako główny formularz aplikacji. Wejdź do okna ustawień projektu (Project Options), kliknij na zakładce Forms, wybierz główny formularz swojej aplikacji z rozwijalnej listy (zatytułowanej Main Forms). Ponownie uruchom swój program - wyświetlony powinien być główny formularz, tak jak tego oczekiwałeś.

Nie. Domyślne ustawienia projektu mają zastosowanie do niemal wszystkich aplikacji Delphi. Po pewnym czasie, w przyszłości, prawdopodobnie dojrzejesz do zagłębienia się w tajniki działania kompilatora i konsolidatora, wtedy będziesz mógł nauczyć się nieco więcej na temat przeznaczenia tych opcji projektu. Do tego czasu nie zwracaj na nie uwagi.

Ustawienie ikony i etykiety głównego formularza nie ma wpływu na sposób wyświetlania aplikacji w czasie jej minimalizacji. Aby wybrać ikonę i napis dla aplikacji, wyświetl okno ustawień projektu (strona Application) i tam dokonaj odpowiednich ustawień.

Nie. Będziesz musiał otwierać każdy plik kodu źródłowego z osobna i uruchamiać w nim okno zamiany (Replace). Niemniej jednak możesz użyć klawisz F3, aby powtórzyć ostanie polecenie poszukiwania lub zamiany. Pamiętaj, aby nie zmieniać nazw zmiennych wygenerowanych przez Delphi.

Tak. Okno otwarcia plików umożliwia wybór wielu plików. Można również wybrać kilka plików w Eksploratorze Windows i przeciągnąć je nad okno Edytora Kodu.

Nie rezygnuj bynajmniej ze swojej stałej pracy.

Quiz

  1. W jaki sposób można szybko przełączać się między formularzem, a jego kodem źródłowym?

  1. Czy po usunięciu pliku z projektu w Menedżerze Projektów, plik ten jest również usuwany z twardego dysku?

  2. W jaki sposób ustawia się główny formularz dla aplikacji?

  3. Co by było, gdybyś nie dysponował formularzami tworzonymi automatycznie?

  4. W jaki sposób, poprzez Eksplorator Kodu, można dodać nowy element do modułu źródłowego?

  5. Jakie znaczenie dla aplikacji ma wygenerowanie informacji debuggera?

  6. Do czego służy opcja Find in Files?

  7. Jaki skrót klawiszowy Edytora Kodu służy do zapisywania plików?

  8. W jaki sposób ustawia się zakładkę w oknie edytora? Jaka liczba zakładek jest dostępna?

  9. W jaki sposób w Edytorze Kodu można ustawić plik tylko do odczytu?

Ćwiczenia

  1. Stwórz nową aplikację. Wyświetl okno Menedżera Projektów. Dodaj nowy moduł do projektu, używając przycisku Add Unit. Przejdź do katalogu \Demos\Coolstuf\, wybierz plik main.pas i kliknij na przycisku OK.

  1. Z projektu stworzonego w ćwiczeniu nr 1 usuń plik o nazwie main.pas.

  2. Otwórz projekt programu ScratchPad. Zmień główny formularz na okno informacji o programie (AboutBox). Zamknij okno dialogowe ustawień projektu i uruchom program. Wyświetlone zostanie okno informacji o programie. Zamknij je, kończąc w ten sposób cały program, następnie ustaw z powrotem rzeczywisty formularz główny programu.

  3. Stwórz nową aplikację. Zapisz projekt i grupę projektową. Teraz, do zapisanej grupy projektowej, dodaj nowy projekt.

  4. Otwórz jakikolwiek plik w Edytorze Kodu. W dowolnych miejscach tego pliku ustaw cztery zakładki. Zacznij poruszać się między zakładkami i obserwuj zachowanie się Edytora Kodu. Kiedy skończysz, usuń wszystkie zakładki.

  5. Otwórz projekt programu ScratchPad (lub dowolny inny) i przejdź do Edytora Kodu. Wyświetl plik głównego formularza projektu. Wybierz polecenie menu SearchFind. W otwarte okno dialogowe wpisz tekst Click i kliknij na przycisku OK, aby znaleźć pierwsze wystąpienie tego słowa.

  6. Powtórz ostatnie poszukiwanie, wciskając kilkakrotnie klawisz F3, aż do momentu kiedy osiągnięty zostanie koniec pliku.

  7. Dalej w tym samym projekcie, przejdź na początek pliku (Ctrl+Home). Otwórz okno zamiany (Replace Text), naciskając kombinację klawiszy Ctrl+R. W pole poszukiwania (Text to find) wpisz słowo Click, a w pole zamiany (Replace with) słowo Test. Wyłącz opcję potwierdzania zamiany (Prompt on replace), a następnie kliknij na przycisku Replace All. Przejrzyj plik, aby ocenić efekty wykonanego polecenia.

0x01 graphic

Cofnij ostatnią operację poleceniem menu EditUndo. Zamknij projekt nie zapisując go (na wszelki wypadek).

  1. Otwórz plik w Edytorze Kodu. Z menu kontekstowego Edytora Kodu wybierz polecenie Properties. Zmień podświetlanie składni dla łańcuchów, zmiennych całkowitych i zmiennoprzecinkowych na kolor ciemnoszary. Po potwierdzeniu zmian przyciskiem OK oceń rezultaty w Edytorze Kodu.

  2. Przywróć domyślny schemat kolorystyczny.

Redakcja wydania polskiego nie do końca zgadza się z tym stwierdzeniem (przyp. red.)

Jeżeli jesteś zainteresowany zagadnieniem bazowego adresu ładowania modułu, zajrzyj na strony 394-395 książki Delphi 4 Vademecum Profesjonalisty, wyd HELION 1999 (przyp. red.)

Nie pojawił się - jak dotąd - sensowny polski odpowiednik, zdecydowaliśmy więc pozostawić termin gutter w wersji oryginalnej; ze względu na jego charakter (zapożyczenie językowe) będziemy jednak pisać go pochyłą czcionką (przyp. red.)

404 Część II

404 C:\Dokumenty\Roboczy\Delphi 4 dla kazdego\09.doc

C:\Dokumenty\Roboczy\Delphi 4 dla kazdego\09.doc 403

Rozdział 9. Projekty, Edytor Kodu i Eksplorator Kodu 403



Wyszukiwarka

Podobne podstrony:
(09) K 18 04 Pl omówienie
2002 09 18
pg 2005 09 18
12 09 18
09-18, sieci komputerowe
09-18, sieci komputerowe
SIMR-RR-EGZ-2012-09-18-rozw
2002 09 18 Prezentacja LPP 2002q2
La rzut piłką lekarską w tył 02 09 18
hme 05 09 18 wykład02
zapisy 2013-09-18
09 (18)
2007 09 18 1064
09 18 funkcje marki, Notatki, MARKETING
dedal 09 18 w rzymie
2003 09 18
Lekka atletyka, La- bieg na 60 m 2002.09.18, Konspekt lekcji gimnastyki

więcej podobnych podstron