Rozdział 4.
Środowisko zintegrowane (IDE)
Pierwszym krokiem w poznawaniu nowego środowiska programistycznego jest zapozna-
nie się z ogólną filozofią działania tego środowiska, ze strukturą menu oraz znaczeniem
poszczególnych opcji. Jeżeli spotykasz się z Object Pascalem po raz pierwszy, masz
utrudnione zadanie: musisz poznać nowy program (Delphi IDE) oraz jednocześnie na-
uczyć się nowego języka. Może to być czasem bardzo trudne. Ze swojej strony uczynię
wszystko, żeby nauka IDE była dla Ciebie przyjemnością. Będzie to przede wszystkim
nauka na przykładach, co uczyni ją, mam nadzieję, interesującą i efektywną.
Delphi IDE
Jeżeli masz już doświadczenie z Delphi, możesz uznać ten rozdział za mało interesują-
cy. Jeżeli tak jest, przejrzyj go przynajmniej pobieżnie. Może znajdziesz w nim coś,
czego akurat nie wiedziałeś, szczególnie jeśli chodzi o nowości wprowadzone dopiero
w wersji 4.
Na Delphi IDE składają się z następujące elementy:
υ
Menu główne i paski narzędzi
υ
Paleta komponentów
υ
Projektant Formularzy
υ
Edytor Kodu
υ
Inspektor Obiektów
υ
Eksplorator Kodu
υ
Menedżer Projektów
130
Część I
130
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Rysunek 4.1.
Środowisko
zintegrowane
Delphi 4
Omówienie tych wszystkich części składowych zajmie mi kilka następnych rozdziałów.
W tym rozdziale omówię projekty i sposoby ich używania przy pisaniu aplikacji Delphi.
Następnie zajmiemy się paskami narzędzi i Paletą Komponentów. Szczegółowe omó-
wienie formularzy zostawiam na koniec.
Czytając ten rozdział będziesz jednocześnie pisał przykładowe programy ilustrujące po-
szczególne zagadnienia. Przyjrzysz się także bliżej Inspektorowi Obiektów. Będzie to
rozgrzewka do rozdziału 6. „Praca z Projektantem Formularzy i Projektantem Menu”,
w którym poznasz Projektanta Formularzy od podszewki. Pod koniec bieżącego rozdziału
dowiesz się, co to są okna dokowalne IDE. Pozwalają one dostosować IDE do własnych
potrzeb i stylu pracy.
Projekty
Jak już wiesz, cała masa rzeczy dzieje się w tle podczas pisania aplikacji w Delphi. Jest
tego dużo więcej, niż mogłeś przypuszczać wnioskując z dotychczasowej lektury. Znajo-
mość szczegółów nie jest konieczna, jeżeli chodzi o tworzenie aplikacji, jednak dobrze
jest mieć ogólne pojęcie o tych wszystkich ukrytych mechanizmach.
Projekt jest to zestaw plików wzajemnie ze sobą powiązanych, które po
kompilacji składają się na program wykonywalny albo bibliotekę DLL.
Oprócz pojedynczych projektów, Delphi umożliwia tworzenie tzw. grup pro-
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
131
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
131
jektów. Grupa projektów jest to zestaw powiązanych projektów Delphi.
Grupa projektów służy do zarządzania projektami Delphi, które składają się na określony
produkt software’owy (pakiet). Grupy projektów omówię bardziej szczegółowo w roz-
dziale 9. „Projekty, Edytor Kodu i Eksplorator Kodu”. Na razie trzeba Ci wiedzieć, że
Delphi przy każdym uruchomieniu tworzy nową (bez nazwy) grupę projektów (jeżeli
nie włączyłeś opcji zachowywania obszaru roboczego przy wyjściu z Delphi). Każdy
nowy projekt automatycznie włączony będzie do tej grupy. Jeżeli chcesz, możesz tę
grupę projektów zapisać na dysk.
Pliki używane w projektach
Delphi zarządza projektami używając do tego kilku plików pomocniczych. Żeby zoba-
czyć, co się dzieje w czasie tworzenia nowego pliku wykonywalnego, stwórzmy prostą
aplikację:
1.
Utwórz na dysku nowy katalog, gdzie będą zapisywane wszystkie pliki projektu
(nadaj mu dowolnie wybraną nazwę).
2.
Wybierz z menu
File | Close All
żeby się upewnić, że nie ma żadnych
otwartych plików ani projektów. Następnie wybierz
File | New Application
,
aby utworzyć nową aplikację.
3.
Wybierz opcję
File | Save All
. Otworzy się okienko z pytaniem o nazwę
pliku źródłowego modułu. W polu „Zapisz w” wskaż utworzony przed chwilą
katalog.
4.
W polu „Nazwa pliku” wpisz
MojModul
. i naciśnij przycisk „Zapisz”.
5.
Teraz musisz podać nazwę projektu. W polu „Nazwa pliku” wpisz
Test
i po-
nownie naciśnij przycisk „Zapisz”.
6.
Wybierz z menu
Project | Build Test
. Delphi skompiluje program (zajmie
to kilka sekund).
7.
Wybierz
File | Close All
.
8.
Uruchom teraz Eksploratora Windows i wyszukaj katalog z plikami projektu.
Znajdziesz ich tam kilka.
W katalogu tym powinno być około ośmiu plików (dokładna ich liczba zależy od usta-
wień IDE). Pozwól, że najpierw powiem, co się dokładnie dzieje w czasie kompilacji
projektu. Potem objaśnię, jakie znaczenie mają poszczególne pliki.
Pliki z rozszerzeniem rozpoczynającym się od znaku tyldy (
∼) są kopiami
zapasowymi. Delphi może utworzyć kilka kopii zapasowych zależnie od
liczby plików źródłowych w projekcie i od ustawień poszczególnych opcji
132
Część I
132
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
projektu. Opcje projektu opisane są w rozdziale 9.
Przy tworzeniu nowego projektu Delphi zakłada minimum 4 pliki (jeżeli jest to typowa
aplikacja GUI):
υ
Plik źródłowy projektu
υ
Moduł formularza głównego
υ
Plik zasobów formularza głównego
υ
Plik zasobów projektu
Plik źródłowy projektu zawiera kod, który jest wykonywany przy uruchamianiu aplikacji.
Plik ten można wyświetlić wybierając opcję
Project | View Source
z menu głównego.
Moduł formularza głównego zawiera deklarację i definicję klasy formularza głównego.
Dla każdego stworzonego przez Ciebie formularza Delphi utworzy dodatkowy plik modułu.
Plik. Plik zasobów formularza głównego oraz plik zasobów projektu są to pliki binarne
zawierające opis formularza głównego i ikony aplikacji.
Po wydaniu polecenia kompilacji projektu, Delphi kompiluje plik źródłowy projektu,
moduł formularza głównego i wszystkie pozostałe moduły włączone do projektu. Proces
ten można podzielić na kilka etapów. W pierwszym etapie kompilator Object Pascala
kompiluje moduły do plików binarnych
.OBJ
. Następnie kompilator zasobów kompiluje
wszystkie zasoby, m. in. ikonę programu i pliki formularzy, do postaci binarnych pli-
ków zasobów. W następnym etapie wkracza do akcji konsolidator („linker”). Łączy on
pliki binarne utworzone przez kompilator z potrzebnymi bibliotekami i generuje osta-
teczny plik wykonywalny, który może być uruchamiany przez użytkownika komputera.
Tabela 4.1 zawiera listę typów plików używanych przez Delphi wraz z opisem roli, jaką
każdy z nich odgrywa w procesie budowania aplikacji.
Oprócz powyższych, istnieją w Delphi także inne typy plików. Na przykład,
rozszerzenie
.bpg
oznacza grupę projektów,
.dpk
używane jest do ozna-
czenia pliku źródłowego pakietu, natomiast
.bpl
oznacza skompilowany
pakiet. Pakiety omówione są szerzej w rozdziale 8. „Tworzenie aplikacji”,
natomiast grupy projektów omówione są w rozdziale 9.
Wszystkie te typy plików można podzielić na dwie kategorie: pliki, które zawierają da-
ne wejściowe dla aplikacji oraz pliki, które tworzone są przez Delphi podczas różnych
etapów kompilacji. Gdybyś chciał przenieść pliki źródłowe aplikacji na inny komputer,
wystarczyłoby jedynie przenieść pliki zawierające dane wejściowe. Są one z reguły ob-
jętościowo mniejsze od tych drugich, więc ich archiwizacja na przykład na dysku nie
zajęłaby wiele miejsca.
Niezbędne są tylko pliki
.pas
,
.dfm
i
.dpr
. Wszystkie pozostałe zostaną odtworzone
podczas ponownej kompilacji. Oprócz tego, jeżeli chcesz zachować ustawienia obszaru
roboczego, musisz również zabezpieczyć plik
.dsk
.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
133
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
133
Tabela 4.1. Typy plików używanych w Delphi
Rozszerzenie
Opis
.pas
Plik źródłowy modułu. Zawiera jego kod źródłowy (każdy moduł ma swój plik
źródłowy)
.dfm
Plik formularza. Jest to właściwie zakamuflowany binarny plik zasobów
(
.res
). Zawiera opis formularza i umieszczonych na nim komponentów.
Każdy formularz posiada swój własny plik
.dfm
.dsk
Plik obszaru roboczego projektu. Zawiera on informacje na temat wyglądu
obszaru roboczego podczas ostatniego zachowywania lub zamykania projektu.
Zapisywane są w nim rozmiary i umiejscowienie wszystkich okien, dzięki
czemu projekt po ponownym otwarciu wygląda dokładnie tak, jak w momencie
zamykania. Plik ten jest tworzony tylko wtedy, gdy opcja zachowywania
obszaru roboczego jest włączona
.dof
Plik opcji projektu. Zawiera ustawienia wszystkich opcji z okna dialogowego
Project Options
.exe
Wynikowy program wykonywalny
.cfg
Plik konfiguracyjny projektu. Zawiera głównie ustawienia kompilatora
i konsolidatora
.dcu
Binarne pliki wynikowe kompilatora (skompilowane moduły)
.dpr
Plik źródłowy projektu
.res
Skompilowany binarny plik zasobów
Oprócz plików źródłowych, o których wspomniałem wcześniej, istnieją
także skrypty zasobów (mają one rozszerzenie
.rc
). Są to pliki tekstowe
używane do definiowania takich zasobów jak bitmapy, ikony lub kursory.
Jeżeli używasz takich plików, zachowuj je razem z innymi plikami danych
wejściowych. Skrypty zasobów są raczej rzadko używane w Delphi.
Rysunek 4.2 obrazuje przebieg kompilacji i łączenia plików źródłowych do postaci fi-
nalnego programu wykonywalnego.
Jeżeli masz mało miejsca na dysku twardym, możesz skasować część pli-
ków z projektów, nad którymi akurat nie pracujesz. Można na przykład
usunąć pliki
.dcu
. Delphi może je w każdej chwili odtworzyć.
Nie kasuj żadnych plików z katalogów, w których zainstalowałeś Delphi,
poza katalogiem
EXAMPLES
. Pamiętaj o zdrowej zasadzie: Jeżeli masz jakieś
wątpliwości – nie kasuj.
134
Część I
134
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Rysunek 4.2.
Proces kompilacji
i łączenia
Pliki źródłowe modułów
Jak już wcześniej wspomniałem, każda aplikacja Delphi (z interfejsem graficznym) posiada
kilka plików źródłowych, nazywanych modułami. Za każdym razem, kiedy tworzysz
nowy formularz, Delphi wykonuje następujące kroki:
υ
Tworzy plik formularza (
.dfm
)
υ
Tworzy nową klasę – potomek klasy
TForm
υ
Tworzy plik źródłowy (
.pas
) zawierający definicję tej klasy
υ
Dodaje informacje o nowym formularzu do pliku źródłowego projektu
Delphi nadaje nowo utworzonemu formularzowi domyślną nazwę
Form1
, a plikowi źró-
dłowemu odpowiadającego mu modułu nadaje nazwę
Unit1.pas
. Następny formularz
utworzony w projekcie będzie miał nazwę
Form2
, itd. Dla każdego nowo utworzonego
formularza Delphi tworzy nową parę plików:
.pas
i
.dfm
.
Zaraz po utworzeniu nowego projektu dobrze jest zapisać go na dysk na-
dając mu jakąś znaczącą nazwę. To samo odnosi się do każdego nowo
utworzonego formularza. Ułatwia to późniejszą ich lokalizację
i identyfikację. Sprawę ułatwia dodatkowo fakt, że moduły mogą mieć dłu-
gie nazwy.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
135
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
135
Pisząc tę książkę często staję przed następującym problemem: aby ułatwić
zrozumienie pewnych zagadnień, często muszę przytaczać odpowiednie
przykłady. W przykładach tych muszę czasami używać technik czy metod
jeszcze nie omawianych. Nie mogę jednak omówić tych metod nie dając
przedtem kilku odpowiednich przykładów. I koło się zamyka. Zamierzam
więc teraz zboczyć trochę z tematu i omówić menu główne, paski narzędzi i
paletę komponentów. To odejście od głównego wątku ma jednak swój cel.
Menu główne i paski narzędzi
Menu główne zawiera wszystkie opcje niezbędne do pracy. Ponieważ jednak progra-
mowanie w Delphi jest wysoce „wizualne", nie ma potrzeby używania menu tak często,
jak w innych środowiskach programistycznych. Jeżeli mimo to preferujesz używanie
menu głównego, znajdziesz tam wszystko, co potrzebne. Nie będę teraz szczegółowo
omawiał wszystkich dostępnych opcji. Zetkniesz się z każdą z nich podczas lektury kilku
następnych rozdziałów.
Paski narzędzi zawierają bardzo wygodne skróty do często powtarzanych poleceń. Ła-
twiej odnaleźć przycisk na pasku niż jakąś głęboko ukrytą opcję w menu, nie mówiąc
już o tym, że wymaga to mniej ruchów myszą. Paski narzędzi Delphi pokazane są na
rysunku 4.3 (Paleta Komponentów została usunięta dla zwiększenia przejrzystości).
Rysunek 4.3.
Paski narzędzi
Mnie często zdarza się zapominać o istnieniu tych pasków mimo, że są one naprawdę
użyteczne. Stare przysłowie mówi: „Rób tak, jak mówię, a nie tak, jak robię”. Jeżeli teraz
poświęcisz trochę czasu na naukę korzystania z pasków, pozwolą Ci one zaoszczędzić
mnóstwo czasu w przyszłości. Kupiłeś przecież Delphi między innymi po to, żeby pisać
aplikacje Windows naprawdę szybko.
Paski narzędzi można dostosować do swoich upodobań. Można je umieścić w dowolnym
miejscu w oknie głównym Delphi, podobnie jak menu główne i Paletę Komponentów.
Można bardzo łatwo dodawać, usuwać i zmieniać kolejność przycisków na pasku na-
rzędzi. W tym celu należy umieścić kursor na pasku i nacisnąć lewy klawisz myszy.
Z menu kontekstowego należy wybrać opcję
Customize
(dostosuj). Po wybraniu tej
opcji otworzy się okno dialogowe.
136
Część I
136
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Rysunek 4.4.
Dostosowywanie
pasków narzędzi
Okno dialogowe
Customize
posiada trzy karty:
υ
Na pierwszej karcie,
Toolbars
, widać listę dostępnych pasków narzędzi z za-
znaczonymi wyświetlonymi paskami. Można je dodawać i usuwać z listy,
a także przywrócić ich domyślne ustawienia.
υ
Druga karta –
Commands –
zawiera wszystkie dostępne przyciski. Żeby umie-
ścić przycisk na pasku narzędzi, wystarczy przeciągnąć go na odpowiednie
miejsce. Żeby zaś usunąć przycisk z paska, należy go chwycić i upuścić poza
obszarem paska. Na rysunku 4.4 widać umieszczanie przycisku na pasku narzędzi.
Jeżeli za mocno sobie namieszasz w tych wszystkich paskach, wystarczy na
karcie
Toolbars
użyć przycisku
Reset
. Paski narzędzi powrócą wtedy do swej
domyślnej postaci.
υ
Na trzeciej karcie –
Options
– można włączać i konfigurować podpowiedzi
pojawiające się po umieszczeniu kursora nad przyciskiem.
IDE istnieje po to, żeby ułatwiać Ci życie, więc skonfiguruj je sobie stosownie do potrzeb.
Używanie Palety Komponentów
Paleta Komponentów służy do wybierania komponentów albo innych kontrolek (na
przykład kontrolek ActiveX)w celu umieszczenia ich na formularzu. Paleta ta składa się
z wielu kart. Kliknięcie na odpowiedniej zakładce powoduje otwarcie odpowiadającej
jej karty.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
137
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
137
Proces umieszczania komponentu na formularzu składa się z dwóch kroków. Pierw-
szym krokiem jest wybranie odpowiedniego komponentu, drugim zaś jest umieszczenie
tego komponentu na formularzu (przy pomocy myszy).
W podstawowym zakresie używałeś Palety Komponentów już wcześniej. Niżej opiszę
jej bardziej zaawansowane możliwości.
Umieszczanie wielu kopii danego komponentu
na formularzu
Do tej pory umieszczałeś na formularzu komponenty wybierając je z Palety, a następnie
przenosząc je w miejsce umieszczenia. Wiele komponentów tego samego typu można
umieszczać na formularzu bez konieczności każdorazowego wybierania go z palety.
Aby to zrobić, należy podczas wybierania komponentu na palecie nacisnąć klawisz
Shift (po wybraniu komponentu można puścić ten klawisz).
Przycisk wybranego komponentu na palecie będzie wciśnięty i będzie miał niebieską
ramkę. Kliknij teraz na formularzu. Pokaże się na nim wybrany komponent. Zwróć
uwagę, że przycisk na formularzu jest nadal wciśnięty. Możesz teraz pojedynczymi
kliknięciami myszy dodawać nowe komponenty. Żeby wyłączyć tę funkcję, trzeba nacisnąć
na palecie komponentów przycisk ze strzałką (narzędzie wybierania komponentów).
Przycisk komponentu zostanie zwolniony.
Przekonaj się sam, jak to działa. Wykonaj następujące czynności:
1.
Utwórz nowy projekt.
2.
Naciśnij i przytrzymaj klawisz Shift. Jednocześnie kliknij na komponencie
Label
na Palecie Komponentów.
3.
Trzykrotnie kliknij na formularzu, zmieniając za każdym razem położenie kursora.
Przy każdym kliknięciu na formularzu umieszczona zostaje nowa etykieta.
4.
Kliknij na przycisku ze strzałką, aby zakończyć ten proces i powrócić do trybu
projektowania formularza.
Najszybciej rozmieszcza się komponenty na formularzu stosując właśnie tę
technikę. Zawsze potem będzie je można poustawiać i dopasować.
Często zdarza się zapomnieć o naciśnięciu przycisku za strzałką po zakoń-
czeniu rozmieszczania komponentów. Jeżeli przypadkowo umieścisz na
formularzu więcej komponentów niż zamierzałeś, zawsze możesz skasować
te niepotrzebne.
138
Część I
138
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Umieszczanie komponentów na środku formularza
Kolejną sztuczką wykorzystywaną przy projektowaniu formularza jest podwójne klik-
nięcie na komponencie w Palecie. Komponent ten zostanie wtedy automatycznie
umieszczony na środku formularza. Można go będzie oczywiście przesunąć na odpo-
wiednie miejsce.
Jeżeli kilkakrotnie klikniesz podwójnie na danym komponencie w Palecie,
w centrum formularza umieszczonych zostanie kilka jego kopii, jeden na
drugim, Będą one wszystkie miały domyślny rozmiar, więc czasami mo-
żesz sobie nie zdawać sprawy, że pod widocznym komponentem kryją się
następne. Jeżeli zdarzy Ci się taka sytuacja, po prostu skasuj niepotrzebne
kopie.
Menu kontekstowe palety komponentów
Jeżeli umieścisz kursor na palecie komponentów i naciśniesz prawy klawisz myszy,
otworzy się menu kontekstowe Palety Komponentów (patrz rysunek 4.5).
Rysunek 4.5.
Menu kontekstowe
palety komponentów
Opcja
Show Hints
włącza i wyłącza podpowiedzi pojawiające się po zatrzymaniu kursora
nad poszczególnymi komponentami w Palecie. Powinna ona być włączona, chyba że
naprawdę przeszkadzają Ci te podpowiedzi. Opcja
Hide
ukrywa Paletę Komponentów
(powoduje, że staje się ona niewidoczna). Żeby pokazać ponownie Paletę Komponentów,
należy wybrać opcję
Component Palette
z menu kontekstowego pasków narzędzi.
Wybranie opcji
Help
z menu kontekstowego Palety Komponentów wyświetla na ekra-
nie pomoc Delphi na temat tej palety. Opcja
Properties
(właściwości) wywołuje okno
dialogowe, w którym można zmieniać ustawienia Palety. Można tam dodawać i usuwać
poszczególne karty palety komponentów, można także zmieniać uporządkowanie kom-
ponentów na poszczególnych kartach. Szczegółowo zajmiemy się tymi ustawieniami
w rozdziale 11. „Narzędzia i opcje Delphi”, którego tematem będą m. in. poszczególne
ustawienia środowiska.
Poruszanie się po Palecie Komponentów
Jeżeli paleta komponentów jest tak skonfigurowana, że nie widać na ekranie wszystkich
jej zakładek, można dostać się do tych niewidocznych przy pomocy przycisków prze-
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
139
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
139
wijania umiejscowionych w prawym górnym rogu palety. Tak samo jest w przypadku
poszczególnych kart – jeżeli komponenty nie mieszczą się na ekranie, kliknięcie na
przyciskach przewijania (są to małe trójkąty widoczne blisko krawędzi palety) powoduje
przewinięcie karty i wyświetlenie komponentów dotychczas niewidocznych. Rysunek 4.6
pokazuje paletę komponentów z widocznymi dwoma typami przycisków przewijania.
Rysunek 4.6.
Przyciski
przewijania palety
komponentów
Korzystanie z Palety Komponentów nie jest wcale skomplikowane, a jej opanowanie
jest niezbędne przy programowaniu w Delphi. Teraz, kiedy mamy już za sobą ten krótki
przegląd głównego okna Delphi, możemy wrócić do głównego tematu tego rozdziału.
Aplikacja składająca się
z wielu formularzy
Żeby zilustrować, w jaki sposób właściwie Delphi używa modułów, stwórzmy aplikację
posiadającą więcej niż jeden formularz. Aplikacja ta będzie wyświetlać dodatkowy
formularz po naciśnięciu przycisku na formularzu głównym:
1.
Utwórz nowy projekt wybierając opcję
File | New Application
z głównego
menu.
2.
Zmień właściwość
Name
formularza głównego na
MainForm
, a właściwość
Caption
tego formularza na
Program testowy wielu formularzy
.
3.
Zachowaj projekt. Zachowaj moduł jako
Main
, a projekt jako
Multiple
.
4.
Umieść przycisk na formularzu. Właściwość
Name
tego przycisku ustaw na
ShowForm2
, a właściwość
Caption
na
Pokaż drugi
.
5.
Wybierz z głównego menu
File | New Form
(albo naciśnij przycisk
New Form
na
pasku narzędzi). Nowo utworzony formularz posiada nazwę
Form1
i umieszczony
jest dokładnie na formularzu głównym. Zmienimy jego rozmiar tak, żeby był
trochę mniejszy od formularza głównego i znajdował się mniej więcej w jego
środku.
6.
Ustaw rozmiar nowego formularza tak, żeby zajmował on mniej więcej połowę
obszaru formularza głównego i ustaw go na jego środku.
140
Część I
140
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
7.
Zmień właściwość
Name
nowego formularza na
SecondForm
, a właściwość
Caption
zmień na
Drugi formularz
.
8.
Wybierz
File | Save
z menu głównego (albo kliknij przycisk
Save File
na
pasku narzędzi) i zachowaj ten nowy formularz pod nazwą
SecondForm
.
9.
Umieść na formularzu
SecondForm
komponent
Label
. Ustaw właściwość
Caption
tej etykiety na
To jest Drugi formularz
. Rozmiar i kolor etykiety ustaw według
własnego uznania. Wyśrodkuj tę etykietę na formularzu. Formularz powinien
teraz wyglądać mniej więcej jak na rysunku 4.7.
Rysunek 4.7.
Wygląd drugiego
formularza
10.
Kliknij na głównym formularzu. Wysunie się on na pierwszy plan przykrywając
drugi formularz. Kliknij podwójnie na przycisku
Pokaż drugi
. Otworzy się
Edytor Kodu z kursorem umieszczonym w procedurze obsługi zdarzenia
OnClick
tego przycisku.
11.
Zmodyfikuj procedurę
TMainForm.ShowForm2Click
tak, żeby wyglądała ona
następująco:
procedure TMainForm.ShowForm2Click(Sender: TObject);
begin
SecondForm.ShowModal;
end;
12.
Uruchom program.
Po uruchomieniu programu na ekranie zostanie wyświetlony komunikat:
Form 'FormG-
lowny' references form 'DrugiFormularz' declared in unit 'Drugi' which is
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
141
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
141
not in your USES list. Do you wish to add it?
Kliknij „Tak”. Delphi doda moduł
Second
do listy
uses
modułu
Main
. Uruchom program ponownie, tym razem powinien
uruchomić się bez problemu. Jeżeli klikniesz teraz na przycisku
Pokaż drugi
, drugi
formularz zostanie wyświetlony na ekranie. Można go będzie zamknąć klikając na ikonie
systemowej umieszczonej w prawym górnym rogu formularza.
Dodawanie modułów
Zamiast pozostawiać Delphi obowiązek dodawania odpowiednich modułów do listy
uses
, lepiej robić to samemu. Można wpisać wprost w Edytorze Kodu nazwę modułu
do listy
uses
, albo można użyć opcji
File | Use Unit
z głównego menu. W tym dru-
gim przypadku zostanie wyświetlone okno dialogowe
Use Unit
(pokazane na rysunku
4.8). Okno to pokazuje listę dostępnych modułów. Aby dodać moduł do listy
uses
, na-
leży wybrać go z listy (kliknąć na jego nazwie) i kliknąć OK. Delphi doda nazwę tego
modułu do listy
uses
bieżącego formularza. Zwróć uwagę, że lista dostępnych modu-
łów zawiera tylko te, które istnieją w bieżącym projekcie i nie zostały jeszcze dodane
do listy
uses
. Modułów, które wcześniej zostały wpisane na listę
uses
, nie ma w oknie
Use Unit
.
Rysunek 4.8.
Okno dialogowe
Use Unit
Jak widzisz, Delphi jest bardzo pomocne w zarządzaniu modułami. Później, kiedy
Twoje potrzeby w tym względzie staną się znacznie większe, będziesz musiał robić
własnoręcznie trochę więcej, ale na etapie, na którym jesteś obecnie, Delphi robi prawie
wszystko za Ciebie.
Spójrzmy teraz na dostępne opcje dotyczące kompilacji dostępne w czasie pisania pro-
gramów.
Kompilowanie, budowanie i łączenie
Po każdym naciśnięciu przycisku
Run
, Delphi kompiluje i łączy Twoją aplikację. Nie
musi jednak kompilować wszystkich modułów w projekcie. Kompiluje tylko te, które
zmieniły się od czasu ostatniej kompilacji. Oszczędza to sporo czasu, gdyż nie jest on
niepotrzebnie tracony na kompilowanie w kółko tego samego. Określanie, czy dany
moduł zmienił się od ostatniej kompilacji, czy nie, odbywa się całkowicie automatycznie.
142
Część I
142
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Z reguły w czasie pisania programu wprowadzasz jakieś poprawki i chcesz na bieżąco
sprawdzać ich efekt. Naciskasz wtedy przycisk
Run
i program jest kompilowany, łączo-
ny i wykonywany. Czasami jednak nie chcesz uruchamiać programu. Na przykład,
chcesz tylko sprawdzić, czy w kodzie źródłowym nie ma błędów składniowych.
Oprócz opcji
Run
Delphi posiada jeszcze trzy dodatkowe opcje, które pozwalają Ci
kontrolować proces kompilacji i łączenia. Jeżeli wybierzesz z menu głównego opcję
Project
, otworzy się podmenu zawierające trzy wyżej wspomniane opcje:
Compile
(kompiluj),
Build
(odbuduj) i
Syntax Check
(sprawdź składnię). Opcje te są uzupełnione
nazwą bieżącego projektu – przykładowo, zaraz po uruchomieniu Delphi opcje te będą
brzmieć:
Compile Project1
,
Build Project1
i
Syntax Check Project1
. Są tam także
opcje
Compile All Projects
(kompiluj wszystkie projekty) i
Build All Projects
(odbuduj wszystkie projekty), jednak omówię je dopiero w rozdziale 9 przy okazji
omawiania grup projektów.
Rozważmy te opcje po kolei od najprostszej do najbardziej skomplikowanej (z punktu
widzenia kompilatora).
υ
Opcja
Syntax Check
jest bardzo wygodna. Po jej wybraniu następuje kompilacja
projektu i wypisanie wszystkich błędów i ostrzeżeń. Jest to najszybszy sposób
na sprawdzenie, czy w kodzie nie występują błędy składniowe. Delphi tylko
kompiluje projekt – nie przeprowadza łączenia – opcja ta działa dzięki temu
bardzo szybko.
υ
Opcja
Compile
kompiluje te moduły, których zawartość zmieniła się od czasu
ostatniej kompilacji (tak jak robi to
Syntax Check
), a także przeprowadza łą-
czenie całego projektu – dlatego trwa to trochę dłużej niż sprawdzenie składni.
Opcji
Compile
używa się, żeby mieć pewność, że cały projekt prawidłowo się
skompiluje i skonsoliduje (nie następuje tu uruchamianie programu).
Skrót klawiaturowy opcji
Compile
to
Ctrl+F9
.
υ
Opcja
Build
wykonuje się najdłużej. Uruchomienie jej powoduje kompilację
każdego modułu źródłowego w projekcie, niezależnie od tego, czy jego zawartość
zmieniła się od czasu ostatniej kompilacji, czy też nie. Po skompilowaniu cało-
ści, przeprowadzane jest łączenie całego projektu.
Do tej pory pozwalałeś Delphi dodawać moduły do swojego projektu. W miarę jak będziesz
stawał się coraz bardziej zaawansowanym użytkownikiem Delphi, będziesz pewnie
edytować własnoręcznie pliki źródłowe, np. żeby dodać jakieś dyrektywy kompilatora.
Może nawet będziesz ingerować w główny plik źródłowy projektu. Może się wówczas
zdarzyć (wszyscy w końcu popełniamy błędy), że za którymś razem projekt nie będzie
chciał się skompilować. Przeprowadzenie odbudowywania aplikacji sprawi, że wszystkie
pliki zostaną uaktualnione, co może ułatwić zlokalizowanie problemu. Czasami samo
wykonanie tej czynności naprawia błędy zgłaszane przez kompilator i konsolidator.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
143
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
143
Za każdym razem, kiedy kompilator będzie zgłaszał jakieś nieoczekiwane
błędy, spróbuj najpierw uruchomić opcję
Build
. Wystarczy czasami, że ja-
kiś plik zostanie uaktualniony, i problem znika. Jeżeli jednak ta operacja
nie pomaga, jedynym wyjściem jest wówczas analiza kodu i „ręczne” loka-
lizowanie błędu.
Delphi umożliwia obserwację na bieżąco postępów kompilacji w specjalnym oknie (jego
wyświetlanie można włączyć poprzez
Tools | Environment Options
– karta
Preferences
– opcja
Show compiler progress
). Okno statusu kompilacji wyświetla nazwę każdego
aktualnie kompilowanego modułu. Jeżeli podczas kompilacji wystąpiły jakieś błędy,
widoczny będzie komunikat
There are errors
wraz z podaną liczbą błędów i ostrzeżeń.
Na rysunku 4.9 pokazane jest okno statusu kompilacji po wykryciu błędów. Delphi
kompiluje projekty tak szybko, że okno to nie jest właściwie potrzebne. Włączenie tego
okna powoduje tylko wydłużenie czasu kompilacji ze względu na konieczność wyświetlania
informacji na ekranie.
Rysunek 4.9.
Okno statusu
kompilacji
Bez względu na wybraną metodę kompilacji (
Compile
,
Build
czy
Syntax Check
), jeżeli
zostały wykryte jakieś błędy, otworzy się Edytor Kodu wraz z oknem
Message
, w którym
wyświetlona będzie lista błędów i ostrzeżeń. Linia kodu zawierająca pierwszy błąd będzie
podświetlona.
Kompilacja innych rodzajów programów w
Object Pascalu
Cała siła Delphi leży w jego wizualnym środowisku programowania. Jest to środowisko
ściśle i nierozdzielnie związane z biblioteką VCL. W Delphi pisze się głównie programy
oparte właśnie na VCL. Oprócz tego jednak za pomocą Delphi można tworzyć także inne
typy programów.
Biblioteka dołączana dynamicznie (ang. dynamic link library – DLL) jest
plikiem zawierającym kod binarny, który może być wywoływany (urucha-
144
Część I
144
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
miany) z poziomu aplikacji lub innej biblioteki DLL.
Najprawdopodobniej tym „innym” typem programu, który mógłbyś chcieć napisać, by-
łaby właśnie biblioteka DLL. Nazwa ta brzmi bardzo tajemniczo, ale w istocie rzeczy
nie jest to zagadnienie bardzo skomplikowane: jest to po prostu skompilowany kod, który
można wywoływać z poziomu innego programu. Po stworzeniu biblioteki DLL, wy-
wołanie funkcji w niej zawartej niczym się nie różni od zwykłego wywołania funkcji.
Tak to wygląda w uproszczeniu. Biblioteki DLL omówione są ze szczegółami w rozdziale
19. „Tworzenie i używanie bibliotek DLL”
Innym typem aplikacji, które można tworzyć w Delphi, są aplikacje konsoli Win32.
Aplikacja konsoli jest 32-bitowym programem uruchamianym w oknie
MS-DOS systemu Windows 95 albo Windows NT.
Aplikacjami konsoli są zwykle niewielkie programy narzędziowe, serwery (np. TCP/IP
albo mail) itp. Każdy program, który nie wymaga graficznego interfejsu użytkownika,
jest dobrym kandydatem na aplikację konsoli.
Więcej o formularzach Delphi
Muszę w tym miejscu przerwać na chwilę omawianie IDE i zająć się formularzami.
Widziałeś już do tej pory kilka formularzy w akcji, a w rozdziale 6 poznasz dokładnie
Projektanta Formularzy. Zanim jednak do tego dotrzesz, chcę Ci przekazać trochę do-
datkowych informacji na ten temat.
Formularze okna głównego
Formularze są głównym elementem składowym aplikacji Delphi. Każda aplikacja GUI
posiada przynajmniej jeden formularz, który jest jednocześnie oknem głównym tej apli-
kacji. Formularz okna głównego (zwany po prostu „formularzem głównym”) może być
po prostu pusty, może zawierać jakieś kontrolki, lub może na nim być wyświetlona mapa
bitowa. Typowe okno główne programu w Windows posiada menu. Może oprócz tego
posiadać takie elementy jak pasek narzędzi czy pasek statusu. W oknie głównym spotyka
się najróżniejsze elementy, zgodnie z charakterem i potrzebami danej aplikacji.
Formularze okien dialogowych
Innym rodzajem formularzy są okna dialogowe. Użytkownik nie widzi żadnej różnicy
między formularzem Delphi wyświetlonym w charakterze okna dialogowego i praw-
dziwym oknem dialogowym (Przez „prawdziwe okno dialogowe” rozumiem tutaj okno
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
145
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
145
utworzone w tradycyjny sposób za pomocą edytora zasobów i skryptu zasobów. Tak
właśnie okna dialogowe są tworzone w innych środowiskach programowania. Delphi
nie używa tradycyjnych okien dialogowych, nie będziesz musiał prawdopodobnie mieć
do czynienia z oknami dialogowymi na tym poziomie). Okna dialogowe posiadają kilka
cech, które odróżniają je od zwykłych okien:
υ
Okna dialogowe mają stałe wymiary. Nie można zmieniać ich rozmiaru. Mają
one do spełnienia ściśle określoną funkcję, więc zmienianie ich rozmiaru nie
jest potrzebne, a czasem nawet jest szkodliwe.
υ
Okna dialogowe prawie zawsze posiadają przycisk OK. Niektóre posiadają
przycisk
Close
(lub
Zamknij
), który spełnia tę samą funkcję. Najprostsze okna
dialogowe (np. typu
About
), posiadają tylko przycisk OK.
υ
Okna dialogowe mogą także posiadać przycisk
Cancel
(lub
Anuluj
) i Help (lub
Pomoc
).
υ
Na pasku tytułowym okna dialogowego jest zwykle tylko jeden systemowy
przycisk (Zamknij). Nie posiadają one przycisków Minimalizuj i Maksymalizuj.
υ
Niektóre okna dialogowe zawierają kilka kart z zakładkami. Po kliknięciu na
danej zakładce otwiera się skojarzona z nią karta.
υ
W większości okien dialogowych do przemieszczania się pomiędzy kontrolkami
można używać klawisza
Tab
.
Jak zwykle, od każdej reguły są jakieś wyjątki. Przeważająca większość okien dialogowych
ma podobny charakter, ale zdarzają się też bardzo specyficzne okna służące do specy-
ficznych celów.
Tradycyjne okna dialogowe
W programach dla Windows pisanych w Borland Pascalu albo z użyciem bibliotek ta-
kich jak OWL, okna dialogowe tworzyło się za pomocą edytora okien dialogowych.
Edytory okien dialogowych w większości przypadków są narzędziami wizualnymi
działającymi podobnie jak Projektant Formularzy Delphi. Po zakończeniu projektowania
okna dialogowego, reprezentacja graficzna okna była konwertowana na definicję tego
okna w pliku skryptowym zasobów. Jako przykład okna dialogowego może posłużyć
okno przedstawione na rysunku 4.10.
Plik skryptowy zasobów jest to plik tekstowy kompilowany przez kompi-
lator zasobów do postaci binarnego pliku zasobów.
Na rysunku 4.10 widać typowe okno dialogowe
About
. Zawiera ono nazwę programu
i informację o prawach autorskich. Plik skryptowy dla tego okna przedstawiony jest na
listingu 4.1
146
Część I
146
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Rysunek 4.10.
Typowe okno
dialogowe About
Listing 4.1. Skrypt okna dialogowego
1:
IDD_ABOUT DIALOG 58,53,194,119
2:
STYLE DS._MODALFRAME or WS_POPUP |
3:
WS_VISIBLE or WS_CAPTION or WS_SYSMENU
4:
CAPTION 'O programie'
5:
FONT 8, 'MS Sans Serif'
6:
{
7:
DEFPUSHBUTTON 'OK.', IDOK, 72, 96, 50, 14
8:
CTEXT 'AudioVideo Player', -1, 48, 22, 128, 8
9:
CTEXT 'Copyright © 1996 by NewSoftware', -1, 32, 47, 136, 8
10:
CTEXT 'March 15, 1996', -1, 24, 59, 146, 8
11:
CONTROL '', 99, 'button', BS_GROUPBOX |
12:
WS_CHILD or WS_VISIBLE or WS_GROUP, 12, 4, 176, 70
13:
}
Skrypt zasobów zawiera informacje potrzebne do utworzenia okna dialogowego w czasie
wykonywania programu. Jest tam podana liczba i typ kontrolek, ich rozmiar, rozmiesz-
czenie, atrybuty itd.
Niektórzy programiści w ogóle nie używają edytora dialogów. Wolą za to ręcznie pisać
skrypty w edytorze tekstowym. Nie można co prawda im tego zabronić, ale trzeba
powiedzieć, że wydajność takiego sposobu pracy jest dużo mniejsza w porównaniu z pro-
jektowaniem graficznym.
Zazwyczaj wszystkie zdefiniowane okna dialogowe aplikacji zawarte są w pojedyn-
czym pliku skryptowym z rozszerzeniem
.rc
. Na określonym etapie tworzenia aplikacji
skrypty te są kompilowane do plików binarnych z rozszerzeniem
.res
, które później są
przez linker włączane do programu wykonywalnego. W czasie wykonywania programu
okno to jest wyświetlane jako modalne lub nie w zależności od jego przeznaczenia.
Kiedy okno jest wywoływane, Windows ładuje do pamięci odpowiedni zasób z pliku
wykonywalnego, generuje okno i wyświetla je na ekranie.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
147
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
147
Okna dialogowe Delphi
W Delphi, okna dialogowe są po prostu formularzami. Tworzy się je tak samo jak okno
główne lub każde inne. Aby uniemożliwić użytkownikowi zmianę rozmiarów okna, je-
go właściwość
BorderStyle
ustawia się na
bsDialog
albo
bsSingle
. Jeżeli ustawi się tę
właściwość na
bsDialog
, okno dialogowe będzie posiadało tylko jeden przycisk syste-
mowy (
Close
) na pasku tytułowym, co jest cechą charakteryzującą tradycyjne okna
dialogowe. Oprócz tego nie trzeba robić nic więcej, żeby formularz zachowywał się jak
okno dialogowe. Wszystkie formularze Delphi mają wbudowany mechanizm prze-
mieszczania się pomiędzy kontrolkami za pomocą klawisza Tab. Kolejność, w jakiej
określone komponenty są zaznaczane, można określić w ich właściwości
TabOrder
.
Modalne okno dialogowe musi być zamknięte dla umożliwienia dalszego
korzystania z aplikacji. Okno główne aplikacji jest nieaktywne, dopóki
otwarte jest modalne okno dialogowe. Większość okien dialogowych sta-
nowią okna modalne.
Niemodalne okno dialogowe pozwala użytkownikowi korzystać z aplikacji w
czasie, gdy jest ono wyświetlone na ekranie. Przykładem takiego okna jest
okno dialogowe
Find
(lub
Znajdź
) występujące np. w edytorach tekstu.
Każde okno dialogowe Delphi (właściwiej: każdy formularz) jest albo modalne, albo
nie, w zależności od tego, w jaki sposób zostało wyświetlone. Aby wyświetlić modalne
okno dialogowe, wywołuje się metodę
ShowModal
obiektu
TForm
. Do wyświetlenia nie-
modalnego okna dialogowego służy metoda
Show
.
Tworzenie formularza okna dialogowego
Dodajmy teraz okno dialogowe
About
(„O programie”) do aplikacji składającej się z dwóch
formularzy, nad którą pracowaliśmy wcześniej. Jeżeli nie masz tego projektu otwartego,
wybierz z menu opcję
File | Open Project
albo kliknij na przycisku
Open Project
na pasku narzędzi i otwórz ten projekt (zachowałeś go wcześniej pod nazwą
Multiple
).
Delphi przechowuje listę ostatnio otwieranych plików i projektów. Jest ona do-
stępna po wybraniu opcji
File | Reopen
. Lista ta jest podzielona na dwie
części. Górna część zawiera ostatnio otwierane projekty, natomiast dolna –
ostatnio otwierane pojedyncze pliki. Żeby otworzyć ostatnio używany pro-
jekt, wystarczy kliknąć na odpowiedniej pozycji listy.
Najpierw dodaj przycisk na formularzu głównym, którego kliknięcie spowoduje wy-
świetlenie okna „O programie”:
1.
Wyświetl główny formularz. Na palecie komponentów wybierz
Button
i umieść
go na formularzu.
148
Część I
148
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
2.
Wyrównaj dwa znajdujące się obecnie na formularzu przyciski.
3.
Zmień właściwość
Name
nowego przycisku na
AboutButton
, a właściwość
Caption
zmień na
O programie
.
4.
Kliknij podwójnie na przycisku
AboutButton
. Otworzy się Edytor Kodu.
W miejscu, gdzie umieszczony jest kursor, wpisz:
AboutBox.ShowModal;
Nie stworzyłeś na razie jeszcze faktycznie tego formularza, ale gdy to zrobisz, nazwiesz
go
AboutBox
.
Zbuduj teraz to okno dialogowe wykonując następujące kroki:
1.
Utwórz nowy formularz (kliknij przycisk
New Form
na pasku narzędzi). Zmień
wielkość tego okienka do rozmiaru typowego okna „O programie” (mniej więcej
na wielkość formularza
SecondForm
stworzonego wcześniej).
2.
Zmień właściwość
Name
tego formularza na
AboutBox
i jego właściwość
Caption
na
O programie
.
3.
Znajdź w Inspektorze Obiektów właściwość
BorderStyle
(powyżej właściwości
Caption
) i zmień ją na
bsDialog
.
4.
Umieść na formularzu 3 etykiety. Ustaw je i zmień umieszczony w nich tekst
tak, żeby okno
O programie
przypominało to przedstawione na rysunku 4.11
(możesz oczywiście wpisać dowolny tekst). Nazwy etykiet możesz pozostawić
domyślne. Nie będą one do niczego potrzebne, więc nie muszą być opisowe.
Rysunek 4.11.
Formularz
„O programie”
z umieszczonymi
etykietami
Następnie umieść na formularzu ikonę:
1.
Kliknij zakładkę
Additional
na palecie komponentów i wybierz z niej kom-
ponent
Image
. Umieść go na formularzu po lewej stronie napisów.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
149
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
149
Znak Copyright (©) ma w większości czcionek kod ASCII wynoszący 169.
Aby wprowadzić ten symbol z klawiatury, na klawiaturze numerycznej
wpisz liczbę 0169 trzymając jednocześnie naciśnięty klawisz
Alt
(upewnij
się wcześniej, że
NumLock
jest włączony). Kiedy zwolnisz klawisz
Alt
, na
ekranie powinien pojawić się symbol ©. W ten sposób można wprowadzać
kody ASCII wszystkich znaków (trzeba zawsze wpisywać wszystkie cztery
znaki – razem z wiodącymi zerami). Na przykład, żeby wpisać literę A,
trzeba nacisnąć klawisz
Alt
, wpisać z klawiatury numerycznej liczbę 0065
i zwolnić klawisz
Alt
.
2.
Zmień właściwość
AutoSize
dopiero co umieszczonego komponentu
Image
na
True
.
3.
Znajdź właściwość
Picture
i kliknij na przycisku z trzema kropkami. Otworzy
się okno dialogowe
Picture Editor
.
4.
Kliknij przycisk
Load
. Otworzy się okno dialogowe
File Open
. Znajdź folder
Borland\Shared Files\Images\Icons
i wybierz jakąś ikonę z listy. Ikona,
którą wybrałeś, zostanie wyświetlona w oknie
Picture Editor
. Kliknij OK,
aby zamknąć okno
Picture Editor
. Wybrana ikona zostanie wyświetlona na
formularzu. Zauważ, że rozmiar komponentu
Image
dostosował się automatycznie
do wyświetlanej na nim ikony.
5.
Ustaw ikonę w odpowiednim miejscu na formularzu.
W oknie dialogowym „O programie” potrzebny jest także przycisk OK.:
1.
Kliknij zakładkę
Additional
na palecie komponentów. Wybierz z tej karty
komponent
BitBtn
i umieść go na środku na dole formularza.
2.
Właściwość
Kind
komponentu
BitBtn
ustaw na
bkOK
. Zauważ, że na przycisku
pojawił się zielony „ptaszek”, a jego właściwość
Caption
zmieniła się na OK.
To już wszystko, co trzeba zrobić z tym przyciskiem. Komponent
BitBtn
zawiera
już kod zamykający formularz przy naciśnięciu przycisku OK.
Teraz pozostała już tylko kosmetyka, jeżeli chodzi o okno
O programie
:
1.
Zlokalizuj komponent
Bevel
na karcie
Additional
palety komponentów
i kliknij na nim.
2.
Umieść go na formularzu, lecz nie poprzez kliknięcie, ale obrysowując myszą
kształt obejmujący umieszczone wcześniej napisy. Po zakończeniu rysowania
ukaże się na formularzu komponent
Bevel
. Możesz go teraz dokładnie ustawić
i dopasować w miarę potrzeby.
3.
Właściwość
Shape
komponentu
Bevel
ustaw na
bsFrame
. Masz teraz trójwy-
miarową ramkę obejmującą napisy.
Formularz powinien teraz wyglądać mniej więcej tak, jak na rysunku 4.12. Zachowaj
bieżący moduł (
File | Save
) pod nazwą
About
.
150
Część I
150
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Rysunek 4.12.
Ukończony
formularz
„O programie”
Czy można już uruchomić ten program? Jeszcze nie. Trzeba dodać moduł
OProgramie
do listy
uses
formularza głównego. Wykonaj w tym celu następujące czynności:
1.
Przełącz się do Edytora Kodu (naciśnij
F12
) i wybierz zakładkę
Main
.
2.
Wybierz z menu
File | Use Unit
.
3.
Wybierz z listy moduł
About
i kliknij OK.
Teraz program jest już gotowy. Naciśnij przycisk
Run
. W oknie głównym aplikacji kliknij
przycisk
O programie
. Winieta programu zostanie wyświetlona. Zauważ, że wyświetlone
okno dialogowe jest modalne (nie można przełączyć się do okna głównego aplikacji,
dopóki okno to jest wyświetlone). Nie można też zmienić jego rozmiaru. Zachowuje się
więc tak, jak przystało na okno dialogowe Windows.
Często używane klasy okien dialogowych (
TOpenDialog
,
TSaveDialog
,
TFontDialog
itp.) nie są zwykłymi formularzami Delphi. Bazują one na
oknach dialogowych będących częścią Windows (zawartych w pliku
COMDLG32.DLL
). Klasy VCL reprezentujące te właśnie okna dialogowe są
„oprawą” dla okien systemowych, oferując użytkownikowi dużo większą
wygodę obsługi.
Delphi zawiera kilka predefiniowanych formularzy, które można wykorzy-
stywać jako bazę do szybkiego projektowania swoich własnych okien dia-
logowych. Będą one omówione w rozdziale 8.
Okna drugorzędne a okna dialogowe
Okno drugorzędne jest to okno wywołane z poziomu okna głównego. Czy można więc
określić, kiedy formularz jest oknem drugorzędnym, a kiedy oknem dialogowym? Otóż
w Delphi nie ma właściwie pomiędzy nimi żadnej różnicy. Wszystkie okna są po prostu
formularzami i nie ma większego sensu klasyfikować je na okna drugorzędne i okna
dialogowe.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
151
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
151
W tradycyjnych środowiskach programowania, trzeba było oddzielnie tworzyć okna
dialogowe i oddzielnie okna drugorzędne. Delphi uwalnia programistę od tego ograni-
czenia i umożliwia traktowanie wszystkich okien jednakowo.
Model aplikacji wielodokumentowej
Jak dotąd, budowaliśmy jedynie aplikacje jednodokumentowe (SDI – Single Document
Interface). Aplikacja SDI ma pojedyncze okno główne i w razie potrzeby wyświetla
okna dialogowe. Nie wyświetla żadnych okien - potomków, nazywanych dokumentami.
Niektóre aplikacje tworzone są według modelu wielodokumentowego.
Aplikacje MDI (ang. Multiple Document Interface) składają się z okna
głównego (rodzica MDI) i okien podporządkowanych (dokumentów MDI).
Przykładami aplikacji MDI są Word, Excel, Edytor konfiguracji systemu (
sysedit
) czy
Menedżer Programów Windows 3.1.
Jedną z najważniejszych cech charakterystycznych aplikacji MDI jest to, że
okna-dokumenty zależne są od okna głównego. Można przesuwać je jedynie w obrębie
okna głównego. Aplikacje MDI mają prawie zawsze w menu głównym opcję Window.
Opcja ta posiada z kolei prawie zawsze podopcje
Kaskada
i
Sąsiadująco
. Kiedy okno
podporządkowane jest zminimalizowane, jego ikona widoczna jest w obrębie okna –
rodzica. Kiedy natomiast okno aplikacji SDI jest zminimalizowane, jego ikona jest na
Pulpicie lub na Pasku Zadań.
Aby utworzyć aplikację MDI w Delphi, trzeba właściwość
FormStyle
formularza
głównego ustawić na
fsMDIform
. Każde z okien podporządkowanych MDI musi swoją
właściwość
FormStyle
mieć ustawioną na
fsMDIchild
. Oprócz tego ograniczenia nie
ma właściwie żadnych innych.
Najważniejsze właściwości formularzy
Klasa
TForm
posiada bardzo dużo różnych właściwości. Niektóre z nich są mało znane
i bardzo rzadko używane, inne są używane powszechnie. Omówię tutaj tylko te najpo-
pularniejsze. Nie będę omawiał właściwości o oczywistym znaczeniu, jak
Caption
,
Color
,
Left
,
Top
,
Width
i
Height
, jeżeli nie będą posiadały jakiegoś specjalnego znaczenia,
o którym powinieneś wiedzieć.
Właściwości ustawiane
w czasie projektowania aplikacji
Właściwości wymienione w tym podrozdziale mogą być ustawiane zarówno w czasie
projektowania aplikacji poprzez Inspektor Obiektów, jak również w czasie jej wykony-
152
Część I
152
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
wania z poziomu kodu. Prawie wszystkie z nich mogą być także odczytywane w czasie
działania programu.
ActiveControl
–
właściwość ta oznacza wyróżnienie danego komponentu w momencie
aktywacji formularza. Na przykład, chcesz żeby dane pole edycji było aktywne w mo-
mencie wyświetlenia okna dialogowego. W czasie projektowania formularza dostępna
jest list umieszczonych na nim komponentów, z których jeden można ustawić jako ak-
tywny.
AutoScroll, HorzScrollBar i VertScrollBar
– te trzy właściwości odpowiadają za paski
przewijania formularza. Jeżeli właściwość
AutoScroll
ma wartość
True
(ustawienie
domyślne) i formularz jest za mały, żeby pomieścić wszystkie umieszczone na nim
komponenty, automatycznie pojawiają się na jego dolnej i prawej krawędzi paski przewija-
nia. Właściwości
HorzScrollBar
i
VertScrollBar
mają zestaw własnych właściwości,
które określają ich działanie.
BorderIcons
– właściwość ta określa, które z systemowych przycisków mają się poja-
wić na pasku tytułowym formularza podczas działania programu. Do wyboru są: menu
systemowe, przycisk minimalizacji, przycisk maksymalizacji i przycisk pomocy.
BorderStyle
– za pomocą tej właściwości ustawia się typ ramki, którą będzie posiadał
formularz podczas wykonywania programu. Wartość domyślna to
bsSizeable
co ozna-
cza, że rozmiar i położenie formularza będą mogły być zmieniane przez użytkownika
programu. Style ramki, w których zmiana rozmiarów okna nie będzie możliwa, to
bsDialog
i
bsNone
.
ClientWidth i ClientHeight
– zamiast określać szerokość i wysokość całego formularza,
można ustawić wymiary jego obszaru klienckiego (obszaru wewnątrz ramki i poniżej
paska tytułowego i paska menu). Przypisanie wartości tym właściwościom powoduje,
że wymiary całego okna dopasowują się automatycznie.
Constrains
– właściwość ta używana jest do określania minimalnej i maksymalnej sze-
rokości i wysokości formularza. Poszczególne wartości ustala się wpisując je wprost do
właściwości
MaxHeight
,
MaxWidth
,
MinHeight
i
MinWidth
.
DefaultMonitor
– właściwość ta używana jest do określenia, na którym monitorze ma
być wyświetlony dany formularz (w środowisku z więcej niż jednym monitorem – np.
Windows 98).
DockSite
– właściwość ta stanowi o tym, czy w danym formularzu można dokować
komponenty. Miejsca dokowania i dokowalne komponenty omówione są w rozdziale 13.
Font
– właściwość ta określa, jakich czcionek używa dany formularz. Ważne jest to, że
właściwość tę dziedziczą wszystkie komponenty umieszczane na formularzu. Oznacza
to także, że można zmienić czcionkę wszystkich komponentów na formularzu zmienia-
jąc jedynie właściwość
Font
formularza. Jeżeli „ręcznie” zmieni się właściwość
Font
któregoś z komponentów na formularzu, nie będzie się ona już zmieniać wraz ze zmianą
czcionki formularza.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
153
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
153
FormStyle
– właściwość ta zwykle ustawiona jest na
fsNormal
. Jeżeli wymagane jest,
aby dany formularz pozostawał zawsze na wierzchu, należy ustawić tę właściwość na
fsStayOnTop
. Formularze MDI muszą mieć właściwość
FormStyle
ustawioną na
fsMDIForm
, a formularze podporządkowane MDI –
fsMDIChild
. Aplikacje MDI były
omówione w rozdziale „Model aplikacji wielodokumentowej”.
HelpContext i HelpFile
– właściwość
HelpContext
używana jest do ustawiania identyfi-
katora pomocy kontekstowej dla danego formularza. Jeżeli pomoc kontekstowa jest
włączona, po naciśnięciu klawisza F1 uaktywni się System Pomocy Windows. Identyfi-
kator jest potrzebny do określenia, która strona pliku pomocy ma być wyświetlona.
Właściwość
HelpFile
zawiera nazwę pliku pomocy użytego po naciśnięciu klawisza F1.
Icon
– właściwość ta ustawia ikonę wyświetloną na pasku tytułowym formularza w czasie
wykonywania programu oraz na pasku zadań, w czasie gdy program jest zminimalizowany.
Czasem jednak właściwość ta jest ignorowana, np. gdy
FormStyle
ustawiony jest na
fsDialog
.
KeyPreview
– gdy właściwość ta ma wartość
True
, będzie generowane zdarzenie for-
mularza
OnKeyPress
i
OnKeyDown
, gdy użytkownik naciśnie jakiś klawisz w którymkolwiek
komponencie na formularzu. Normalnie, formularze nie otrzymują informacji o zdarze-
niach pochodzących z klawiatury, kiedy jakiś komponent na formularzu jest aktywny.
Position
– właściwość ta określa początkowy rozmiar i pozycję formularza na ekranie.
Można wybrać jedną z trzech wartości:
poDesigned
,
poDefault
i
poScreenCenter
:
υ
ustawienie
poDesigned
oznacza, że formularz będzie dokładnie tak ustawiony,
jak podczas jego projektowania.
υ
poDefault
umożliwia systemowi Windows ustawienie rozmiaru i pozycji
formularza według specjalnego algorytmu (Z-ordering) – nowe okno jest wy-
świetlane trochę poniżej i na prawo względem ostatnio wyświetlonego.
υ
wartość
poScreenCenter
oznacza wyświetlanie formularza na środku ekranu.
Visible
– właściwość ta określa, czy formularz jest widoczny na ekranie. W czasie dzia-
łania programu można za pomocą tej właściwości ukrywać albo wyświetlać formularz i
sprawdzać aktualny stan.
WindowState
– można użyć tej właściwości do odczytania aktualnego stanu formularza
(czy jest zmaksymalizowany, zminimalizowany czy normalny). Właściwość ta określa
także sposób, w jaki formularz ma być wyświetlony po jego utworzeniu. Dostępne
wartości to
wsMinimized
,
wsMaximized
i
wsNormal
.
Właściwości ustawiane w czasie działania programu
Do niektórych właściwości można się odwoływać jedynie z poziomu kodu. Poniżej
przedstawione są te najczęściej używane.
154
Część I
154
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
ActiveMDIChild
– jest to właściwość tylko do odczytu. Zawiera wskaźnik do aktywnego
okna podporządkowanego MDI. Jeżeli akurat nie istnieje takie okno, lub aplikacja jest
typu SDI, wskaźnik ten ma wartość nil.
Canvas
to obszar roboczy formularza (powierzchnia, na której można rysować bitmapy,
linie, kształty czy tekst). Zwykle do wypisania tekstu używa się komponentu
Label
, do
wyświetlania grafiki – komponentu
Image
, a do rysowania różnych figur – komponentu
Shape
, ale czasem trzeba coś narysować bezpośrednio na formularzu w czasie działania
programu. Do tego służy właśnie właściwość
Canvas
. Właściwość ta może być także
użyta do zapisania zawartości graficznej formularza na dysk. Zagadnienie to jest szerzej
omówione w rozdziale 12, „Programowanie grafiki i multimediów”.
ClientRect
zawiera współrzędne górnej, lewej, prawej i dolnej krawędzi obszaru klienc-
kiego formularza. Jest to informacja użyteczna w wielu sytuacjach. Na przykład, aby
umieścić bitmapę na środku formularza, trzeba odczytać szerokość i wysokość jego obszaru
klienckiego.
Handle
zawiera uchwyt okna (
HWND
) danego formularza. Jest to użyteczne przy wywołaniach
funkcji Windows API.
ModalResult
określa, w jaki sposób zostało zamknięte modalne okno dialogowe. Jeżeli
posiada ono przycisk
OK
i
Cancel
(ew.
Anuluj
), można właściwości tej przypisać war-
tość
mrOK
, żeby zasymulować naciśnięcie klawisza OK i
mrCancel
, żeby zasymulować
naciśnięcie klawisza
Cancel
. Można także użyć tej właściwości do sprawdzenia, w jaki spo-
sób okno dialogowe zostało zamknięte. Inne możliwe wartości to
mrYes
,
mrNo
i
mrAbort
.
Owner
zawiera wskaźnik do właściciela danego formularza. Właściciel formularza jest
to obiekt odpowiedzialny za usunięcie tego formularza, gdy nie jest on już potrzebny.
Z kolei rodzic danego komponentu jest to okno (formularz albo inny komponent), który
zawiera dany komponent. W przypadku okna głównego, obiekt typu aplikacja jest za-
równo właścicielem i rodzicem okna. W przypadku komponentów, ich właścicielem jest
formularz, na którym są umieszczone, zaś rodzicem może być inny komponent (np.
Panel
).
Parent
zawiera wskaźnik do rodzica danego formularza. Różnica między właścicielem a
rodzicem wyjaśniona jest wyżej.
Metody formularzy
Formularze są także komponentami i jako takie, posiadają wspólne z innymi kompo-
nentami metody, np.
Show
,
ShowModal
i
Invalidate
. Istnieją jednak metody, które
odnoszą się tylko do formularzy. Omówię tu tylko te najczęściej spotykane.
BringToFront
– metoda ta powoduje przesunięcie danego formularza na wierzch (ponad
inne, przykrywające go).
Close
i
CloseQuery
– metoda
Close
wywołuje metodę
CloseQuery
aby się upewnić, że
można zamknąć formularz i zamyka go. Funkcja
CloseQuery
z kolei wywołuje metodę
obsługi zdarzenia
OnCloseQuery
. Jeżeli zmienna typu
Boolean
przekazana do niej ma
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
155
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
155
wartość
False
, formularz nie jest zamykany, w przeciwnym przypadku jest. Metodę ob-
sługi zdarzenia
OnCloseQuery
można wykorzystać np. do wyświetlenia komunikatu dla
użytkownika informującego o konieczności zamknięcia wszystkich plików lub do
sprawdzenia własnego warunku zamknięcia formularza.
– metoda ta służy do drukowania zawartości formularza (ściślej mówiąc obszaru
klienckiego – bez paska tytułowego, menu i ramek) na drukarce.
ScrollInView
– metoda ta przewija zawartość formularza tak, żeby określony komponent
stał się widoczny.
SetFocus
– metoda ta powoduje aktywację formularza i przesunięcie go na wierzch. Je-
żeli na formularzu jest jakiś komponent wskazany we właściwości
ActiveControl
formularza, jest on aktywowany.
Show
i
ShowModal
– metody te służą do wyświetlenia formularza na ekranie. Metoda
Show
wyświetla formularz jako niemodalny (inne formularze mogą być aktywowane
w czasie, gdy dany formularz jest wyświetlony), natomiast
ShowModal
wyświetla for-
mularz jako modalny (modalne okno dialogowe trzeba zamknąć, żeby możliwa była
dalsza praca z aplikacją).
Metody MDI
Istnieją specjalne metody przeznaczone do operowania na formularzach MDI. Metoda
ArrangeIcons
porządkuje ikony zminimalizowanych okien podporządkowanych MDI
w oknie-rodzicu. Metoda
Cascade
wyświetla kaskadowo wszystkie nie zminimalizowa-
ne okna podporządkowane MDI. Metoda
Tile
wyświetla te okna sąsiadująco. Metoda
Next
aktywuje (umieszcza na wierzchu) następne na liście okno podporządkowane
MDI, metoda
Previous
robi to samo z oknem poprzednim na liście. Metody MDI mają
zastosowanie wyłącznie do okien-rodziców.
Zdarzenia formularzy
Formularze mogą odpowiadać na szeroki wachlarz zdarzeń, z których niektóre najczę-
ściej używane opisane są poniżej.
OnActivate
– zdarzenie to zachodzi, gdy formularz jest pierwszy raz aktywowany. Formu-
larz może być aktywowany w wyniku jego utworzenia lub kiedy użytkownik przełącza się
pomiędzy formularzami. Obiekt typu
Application
także posiada zdarzenie
OnActivate
,
które generowane jest, gdy użytkownik przełączy się na tę aplikację z innej.
OnClose
i
OnCloseQuery
– kiedy aplikacja jest zamykana, generowane jest zdarzenie
OnClose
. Zdarzenie to generuje z kolei zdarzenie
OnCloseQuery
. Jeżeli
OnCloseQuery
zwraca wartość
False
, formularz nie jest zamykany.
OnCreate
– zachodzi w momencie utworzenia formularza w czasie działania programu.
Dla każdego formularza (obiektu klasy tego formularza) zdarzenie to może zajść tylko
156
Część I
156
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
jeden raz. Zdarzenia tego używa się do przeprowadzenia wszelkich czynności, które są
niezbędne do prawidłowego działania formularza.
OnDestroy
– zdarzenie to jest przeciwne do
OnCreate
. (wywoływane jest przy niszczeniu
formularza). Używa się go do zwalniania wszelkiej przydzielonej dynamicznie pamięci
lub innych końcowych czynności.
OnDragDrop
– zdarzenie to generowanie jest, gdy na danym formularzu upuszczany jest ja-
kiś obiekt. Zdarzenie to ma znaczenie przy włączonej obsłudze drag and drop formularza.
OnMouseDown
,
OnMouseMove
i
OnMouseUp
– zdarzenia te generowane są przy klikaniu
lub poruszaniu myszą w obszarze formularza.
OnPaint
– zdarzenie to generowane jest, gdy zachodzi potrzeba odświeżenia formularza
na ekranie. Zazwyczaj wszystkie komponenty same troszczą się o prawidłowe wyświe-
tlanie, jednak czasem trzeba przerysować jakieś elementy graficzne bezpośrednio
umieszczone na formularzu.
OnResize
– zdarzenie to generowane jest po każdej zmianie rozmiarów formularza. Mo-
że czasami przydać się do korekty położenia komponentów na formularzu lub do jego
przerysowania.
OnShow
– zdarzenie to zachodzi na moment przed wyświetleniem formularza na ekranie.
Inspektor Obiektów
Inspektor Obiektów jest integralną częścią Delphi IDE. Współpracuje on z Projektan-
tem Formularzy. Projektant formularzy zostanie omówiony szczegółowo w rozdziale 6,
lecz przedtem chciałbym wspomnieć właśnie o Inspektorze Obiektów.
Służy on do nadawania wartości na etapie projektowania aplikacji poszczególnym wła-
ściwościom komponentów. Inspektor Obiektów składa się z trzech głównych elementów:
υ
Listy wyboru komponentu
υ
Karty właściwości
υ
Karty zdarzeń
Przy tworzeniu formularza generowanych jest wiele zdarzeń, tak jak przy
jego niszczeniu. Kolejność zdarzeń przy tworzeniu formularza jest nastę-
pująca:
1.
Wywołanie konstruktora formularza
2.
Zdarzenie
OnCreate
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
157
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
157
3.
Metoda
AfterConstruction
4.
Zdarzenie
OnShow
5.
Zdarzenie
OnActivate
Kiedy formularz jest niszczony, występują następujące zdarzenia:
1.
Zdarzenie
OnCloseQuery
2.
Zdarzenie
OnClose
3.
Metoda
BeforeDestruction
4.
Zdarzenie
OnDestroy
5.
Wywołanie destruktora formularza
W większości przypadków wyżej wymieniona kolejność nie jest taka istot-
na. Niekiedy jednak może być bardzo ważna. Znajomość tej kolejności mo-
że Ci w tych przypadkach bardzo pomóc.
Do tej pory zdążyłeś już zapewne dość dobrze zapoznać się z Inspektorem Obiektów.
Podsumuję zatem, co już wiesz i dodam kilka informacji, z którymi się prawdopodobnie
jeszcze nie zetknąłeś.
Lista wyboru komponentu
Najprościej jest wybrać komponent, którego właściwości mają być wyświetlone w In-
spektorze Obiektów, klikając go na formularzu. Alternatywnym sposobem jest skorzy-
stanie z listy wyboru komponentu. Znajduje się ona w górnej części Inspektora Obiektów.
Zwykle komponent wybiera się klikając na formularzu. Jednak gdy poszu-
kiwany komponent jest przykryty innym komponentem, lub jest poza wi-
docznym obszarem formularza, korzystanie z listy wyboru komponentu
staje się uzasadnione.
W polu wybranego elementu listy wyboru wyświetlana jest nazwa obiektu i klasa, do
jakiej należy. Na przykład, komponent o nazwie
Memo
wyświetlony byłby następująco:
Memo: TMemo
Na rozwijanej liście nazwa klasy obiektu nie jest wyświetlana, jest ona widoczna tylko
w polu wybranego elementu. Aby wybrać komponent z listy, należy kliknąć przycisk
umieszczony po prawej stronie pola wybranego elementu, co spowoduje rozwinięcie się
listy. Teraz wystarczy już kliknąć na nazwie odpowiedniego komponentu.
158
Część I
158
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Lista wyboru komponentu zawiera tylko komponenty umieszczone na bie-
żącym formularzu włącznie z nazwą tego formularza. Nieaktywne formula-
rze i umieszczone na nich komponenty nie są umieszczone na liście.
Jeżeli wybierze się jakiś komponent z listy, na formularzu automatycznie pojawia się
jako zaznaczony. Karty
Properties
i
Events
są uaktualniane stosownie do wybranego
komponentu (formularz także jest komponentem). Na rysunku 4.13 przedstawiony jest
Inspektor Obiektów z wyświetloną listą wyboru komponentu.
Rysunek 4.13.
Lista wyboru
komponentu
Karta Properties
Karta
Properties
zawiera wszystkie właściwości zaznaczonego komponentu ustawiane
w czasie projektowania aplikacji. Karta ta podzielona jest na dwie kolumny. W lewej
kolumnie są nazwy właściwości, w prawej zaś wartości tych właściwości.
Jeżeli wszystkie właściwości nie mieszczą się w oknie Inspektora Obiektów, pojawiają
się na nim paski przewijania.
Wygląd Inspektora Obiektów z wyświetlonymi właściwościami komponentu
Memo
przedstawiony jest na rysunku 4.14.
Jeżeli zaznaczyłeś kilka komponentów na formularzu, w Inspektorze
Obiektów wyświetlone są tylko właściwości wspólne dla nich wszystkich.
Można to wykorzystać do jednoczesnej zmiany właściwości dla kilku kom-
ponentów. Na przykład, żeby zmienić szerokość kilku komponentów na
raz, trzeba zaznaczyć te komponentu i w Inspektorze Obiektów zmodyfi-
kować odpowiednio właściwość
Width
.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
159
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
159
Rysunek 4.14.
Inspektor Obiektów
z wyświetlonymi
właściwościami
komponentu Memo
Właściwości mogą mieć wartości typu całkowitego, wyliczeniowego, zbiorowego, in-
nych obiektów, łańcuchowego i innych typów (właściwości omówione są szczegółowo
w następnym rozdziale). Inspektor Obiektów umożliwia wprowadzanie poszczególnych
wartości stosownie do ich typu. Delphi posiada kilka wbudowanych edytorów właściwości.
Na przykład, właściwość
Top
może posiadać wartości typu
Integer
. Ponieważ jest to
typ podstawowy, edytor właściwości tego typu jest bardzo prosty. Umożliwia on wpi-
sywanie odpowiednich wartości wprost do kolumny wartości w Inspektorze Obiektów.
W większości przypadków edytor właściwości dokonuje sprawdzenia
podanych wartości typu całkowitego. Na przykład, właściwość
Width
nie
może być ujemna. Jeżeli wprowadzisz mimo to liczbę ujemną, Delphi
ustawi tę wartość na najmniejszą możliwą (zwykle 0). Jeżeli natomiast do
właściwości typu całkowitego wpiszesz łańcuch, pojawi się komunikat o
błędzie. Jednym z zadań edytorów właściwości jest właśnie sprawdzanie
wprowadzanych wartości.
W wielu przypadkach edytor właściwości zawiera listę dostępnych wartości, z których
można wybierać. Po kliknięciu w polu wartości pokazuje się przycisk opuszczanej listy
z dostępnymi wartościami.
Podwójne kliknięcie w polu wartości spowoduje cykliczne przechodzenie
poprzez kolejne elementy listy dozwolonych wartości. Na przykład, żeby
szybko zmienić wartość typu
Boolean
, wystarczy podwójnie kliknąć na tej
wartości (lista możliwych opcji zawiera w tym przypadku tylko dwa ele-
menty –
True
i
False
).
W Inspektorze Obiektów przed nazwami niektórych właściwości widać znak +. Ozna-
cza to, że dana właściwość jest klasą albo zbiorem. Nazwa tej właściwości jest węzłem,
160
Część I
160
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
który można rozwijać, aby dostać się do poszczególnych pod-właściwości. W celu roz-
winięcia węzła trzeba kliknąć podwójnie na jego nazwie albo z menu kontekstowego
wybrać opcję
Expand
. Aby zwinąć otwarty węzeł, należy ponownie podwójnie kliknąć
na jego nazwie albo z menu kontekstowego wybrać opcję
Collapse
.
Jako przykład właściwości, której wartości tworzą zbiór (
set
), weźmy właściwość
BorderIcons
formularza. Zaznacz formularz, następnie w Inspektorze Obiektów kliknij
podwójnie na właściwości
BorderIcons
. Rozwinie się ona w listę czterech elementów
zbioru. Można teraz włączać lub wyłączać każdy z tych elementów.
W przypadku właściwości będących obiektami (realizacjami klas VCL) właściwości
można edytować na dwa sposoby. Pierwszym jest kliknięcie w kolumnie wartości a na-
stępnie kliknięcie na przycisku oznaczonym znakiem wielokropka (… – ang. ellipsis).
Na przykład, kliknij właściwość
Font
, a następnie kliknij na przycisku z wielokropkiem.
Otworzy się odpowiedni edytor do tej właściwości (okno dialogowe wyboru czcionki).
Drugim sposobem na edycję tej właściwości jest rozwinięcie jej węzła. Wyświetlone
zostaną właściwości tej właściwości (tak – właściwości też mogą posiadać swoje wła-
ściwości) i można je edytować jak każde inne. Zlokalizuj ponownie właściwość
Font
formularza i kliknij podwójnie na niej. Węzeł rozwinie się ukazując takie właściwości
jak
Height
,
Color
,
Name
itd.
Niektóre właściwości można edytować jedynie klikając przycisk z wielokropkiem.
Wcześniej używałeś komponentu
Image
jako ikony dla programu
Multiple
. Właściwość
Picture
komponentu
Image
można było edytować jedynie wywołując edytor właściwości.
W tym przypadku jest to Image Editor.
Ogólnie mówiąc, Inspektor Obiektów troszczy się o to, żeby zawsze uruchomić odpowiedni
dla danej właściwości edytor, Ty nie musisz się tym przejmować. W trakcie poznawania
nowych komponentów będziesz po prostu spotykać się z różnymi edytorami właściwości.
Karta Events
Na karcie tej wyświetlone są wszystkie zdarzenia, które obsługiwane są przez dany
komponent. Używanie tej karty jest bardzo proste. Aby utworzyć procedurę obsługi
określonego zdarzenia, należy po prostu kliknąć podwójnie w prawej kolumnie karty
obok tego zdarzenia. Delphi tworzy automatycznie szkielet procedury wraz ze wszystkimi
odpowiednimi parametrami. Otwierany jest Edytor Kodu z kursorem umieszczonym
wewnątrz nowo utworzonej procedury. Wystarczy teraz po prostu wpisać odpowiedni
kod. Nazwa funkcji generowana jest na bazie właściwości
Name
komponentu i nazwy
obsługiwanego zdarzenia. Na przykład, procedura obsługi zdarzenia
OnClick
przycisku
o nazwie
OkBtn
będzie nazywać się
OKBtnClick
.
Możesz pozwolić Delphi wygenerować nazwę procedury obsługi zdarzenia, albo możesz
tę nazwę podać samemu. Aby zrobić to drugie, należy wpisać nazwę procedury w polu
edycji po prawej stronie nazwy zdarzenia i nacisnąć
Enter
. Wyświetla się wówczas
Edytor Kodu z odpowiednio nazwaną procedurą.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
161
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
161
W czasie kompilowania, uruchamiania czy zachowywania modułu na dys-
ku, Delphi usunie automatycznie z kodu źródłowego wszystkie „puste”
procedury obsługi zdarzenia. Powiedzmy, że utworzyłeś procedurę obsługi
zdarzenia
OnCreate
, ale nie wpisałeś do niej żadnego kodu. Przy pierwszym
uruchomieniu, kompilacji modułu czy zachowaniu go na dysku procedura ta
zostanie usunięta. Jest to bardzo przydatna cecha Delphi, jednak niewtajem-
niczony użytkownik może być nieprzyjemnie zaskoczony. Jeżeli nie chcesz,
żeby Delphi usunął daną procedurę, wystarczy wpisać do niej pojedynczą li-
nię komentarza.
Po utworzeniu procedury obsługującej dane zdarzenie, można użyć jej wielokrotnie
w różnych komponentach posiadających to samo zdarzenie. Czasami na przykład kilka
przycisków umieszczonych na formularzu może mieć taką samą obsługę zdarzenia
OnClick
. Idąc krok dalej – można utworzyć opcję w menu głównym, opcję w menu
kontekstowym i przycisk na pasku narzędzi, które wywołują wspólną procedurę obsługi
zdarzenia
OnClick
. Gdy nabierzesz doświadczenia w programowaniu w Delphi, docenisz
te możliwości powtórnego wykorzystania kodu. Na karcie zdarzeń Inspektora Obiektów
pola w prawej kolumnie posiadają przyciski opuszczania listy, na której umieszczone są
zgodne z danym zdarzeniem procedury obsługi.
Dokowalne okna IDE
Nowością w Delphi 4 są okna dokowalne.
Okno dokowalne jest to okno, które może być przeciągnięte przy pomocy
myszy z jego aktualnego położenia i zadokowane w jednym z punktów do-
kowania.
Miejsce dokowania jest to lokalizacja w IDE, w którym może być zado-
kowane (zaczepione) okno dokowalne. IDE posiada kilka takich miejsc do-
kowania.
Prawie każde okno w Delphi jest dokowalne. Dokowalne jest okno Menedżera Projektów,
Eksploratora Kodu, Inspektora Obiektów, okno podglądu zmiennych, okno komunikatów
i wiele innych.
Największą zaletą okien dokowalnych jest to, że umożliwiają one dostosowanie środo-
wiska do wymagań i preferencji użytkownika, co czyni pracę przyjemniejszą i bardziej
efektywną.
162
Część I
162
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Miejsca dokowania
Okna dokowalne można rozmieszczać po całym ekranie w dowolnym jego miejscu.
Efektem takiego działania byłoby jednak całe mnóstwo pojedynczych okien rozrzuconych
po całym obszarze roboczym. Poruszanie się w tym gąszczu byłoby bardzo trudne. Aby
okna dokowalne miały w ogóle sens, potrzebne jest określone miejsce do ich zaczepienia.
W Delphi IDE miejscem takim jest najczęściej Edytor Kodu.
Edytor Kodu posiada trzy miejsca dokowania. Pierwsze z nich leży po lewej stronie –
zaraz po uruchomieniu Delphi zadokowany jest w nim Eksplorator Kodu. Drugie miejsce
dokowania znajduje się przy dolnej krawędzi Edytora Kodu – w domyślnej konfiguracji
Delphi umieszczone jest tam okno komunikatów (nie jest ono widoczne, dopóki nie w nim
nic do wyświetlenia). Trzecie miejsce dokowania w Edytorze Kodu znajduje się wzdłuż
lewej krawędzi jego okna. Te trzy miejsca dokowania w zupełności wystarczają do pełnego
skonfigurowania IDE do swoich wymagań.
Oprócz tego jest jeszcze jedno miejsce dokowania, o którym chcę wspomnieć. Jeżeli
masz otwarte okno narzędzi (np. Menedżera Projektów), możesz zadokować w tym
oknie inne okno narzędzi. Umożliwia to zgrupowanie dwóch albo więcej okien Delphi
w jednym oknie narzędziowym. Na przykład w jednym „pływającym” oknie narzę-
dziowym mogą zostać umieszczone: Eksplorator Kodu i Menedżer Projektów. Okno takie
posiada pięć miejsc dokowania: krawędź lewa, prawa, górna, dolna i środek.
Po zadokowaniu okna w środku okna narzędzi, okno narzędzi staje się oknem wielo-
stronicowym (posiada zakładki poszczególnych kart). Na każdej z zakładek wypisany
jest tytuł odpowiadającego okna. Może wykład ten nie jest zbyt jasny, najlepiej więc
będzie przećwiczyć to na przykładzie.
Eksperymentowanie z oknami dokowalnymi
Zaczniemy od najbardziej podstawowych operacji dokowania, przechodząc później do
przykładów bardziej skomplikowanych.
Oto pierwsze ćwiczenie:
1.
Utwórz nową aplikację i przełącz się do Edytora Kodu. Zwróć uwagę, że Eks-
plorator Kodu jest zadokowany po lewej stronie Edytora Kodu.
2.
Kliknij na uchwycie w górnej części Eksploratora Kodu i przesuń go w prawo.
Widoczny będzie przesuwający się wraz z kursorem myszy szary prostokąt.
Prostokąt ten wyobraża umiejscowienie Eksploratora Kodu, gdyby zakończyć
w tym miejscu przesuwanie.
3.
Przeciągnij okno Eksploratora Kodu na środek Edytora Kodu i puść klawisz my-
szy. Eksplorator Kodu zamienił się w samodzielne, pływające okno narzędziowe.
4.
Kliknij na pasku tytułowym Eksploratora Kodu i przeciągnij go z powrotem na
lewą stronę Edytora Kodu. Kiedy kursor myszy wraz z szarym prostokątem
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
163
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
163
osiągnie lewą krawędź okna Edytora Kodu, szary prostokąt wyobrażający prze-
suwane okno Eksploratora Kodu „wskoczy” w odpowiednie miejsce Edytora
Kodu. Puść klawisz myszy i Eksplorator Kodu zostanie zadokowany.
5.
Przeciągnij jeszcze raz Eksplorator Kodu do dolnej krawędzi okna Edytora
Kodu i zadokuj go w miejscu dokowania znajdującym się wzdłuż dolnej kra-
wędzi Edytora Kodu. Rozmiar Eksploratora Kodu dopasuje się automatycznie.
Uchwyt Eksploratora Kodu ma teraz orientację pionową i znajduje się po lewej
jego stronie.
6.
Przeciągnij Eksplorator Kodu do punktu wyjściowego (do miejsca dokowania
na lewej krawędzi Edytora Kodu). Edytor Kodu i Eksplorator Kodu powinny
teraz wyglądać tak, jak na początku ćwiczenia.
Ćwiczenie to było bardzo proste, ale ilustruje ono ogólną ideę dokowania. Następne będzie
trochę bardziej interesujące. Wykonaj następujące czynności:
1.
Przeciągnij Eksplorator Kodu z punktu dokowania na prawą stronę Edytora
Kodu i upuść go tam.
2.
Zmień rozmiar okna Eksploratora Kodu tak, żeby było ono mniej więcej kwa-
dratowe.
3.
Wybierz z menu
View | Project Manager
. Ukaże się na ekranie Menedżer
Projektów.
4.
Przeciągnij okno Menedżera Projektów na okno Eksploratora Kodu. Kiedy szary
prostokąt przesuwany wraz z myszą umiejscowi się na środku okna Eksplora-
tora Kodu, puść klawisz myszy. Okno narzędziowe powinno teraz wyglądać
tak, jak na rysunku 4.15. Zwróć uwagę, że okno to posiada teraz dwie karty:
Eksploratora Kodu i Menedżera Projektów.
5.
Przeciągnij to okno narzędziowe na lewą stronę Edytora Kodu i zadokuj je
tam. Masz teraz łatwy i szybki dostęp zarówno do Eksploratora Kodu, jak i do
Menedżera Projektów.
Rysunek 4.15.
Eksplorator Kodu
i Menedżer
Projektów
zadokowane razem
w oknie
narzędziowym
164
Część I
164
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Zróbmy teraz jeszcze jedno ćwiczenie. W czasie poprawiania błędów w programie często
potrzeba mieć widoczne okno podglądu zmiennych –
Watch List
(znajdowanie i po-
prawianie błędów w programach omówione jest szczegółowo w rozdziale 10). Pokażę
Ci jak zrobić, żeby okno podglądu zmiennych było cały czas pod ręką:
1.
Kliknij prawym klawiszem myszy na Edytorze Kodu i z menu kontekstowego
wybierz opcję
Message View
. W dolnym miejscu dokowania Edytora Kodu
ukaże się okno komunikatów.
2.
Wybierz z menu głównego
View | Debug Windows | Watches
. Lista podglądu
zmiennych otworzy się jako nowe okno narzędziowe.
3.
Przeciągnij okno
Watch List
na okno komunikatów i zadokuj je w jego środku.
W dolnym miejscu dokowania Edytora Kodu będą teraz umieszczone dwie
karty:
Messages
i
Watch List
.
Możesz teraz zaglądać do listy podglądu zmiennych, kiedy tylko chcesz klikając na za-
kładkę
Watch List
. Karta
Messages
zostanie wyświetlona automatycznie wtedy, gdy
pojawią się na niej komunikaty do wyświetlenia. Rysunek 4.16 przedstawia wygląd IDE
po przeprowadzeniu ostatniego ćwiczenia.
Wyłączanie dokowania
Możliwość dokowania jest bardzo przydatna i wygodna. Czasami jednak, gdy chcesz
umieścić na ekranie jakieś okno nie dokując go, trudno znaleźć odpowiednie miejsce
– gdzie się nie ruszyć, zawsze jest jakieś czekające miejsce dokowania. Na szczęście
dokowalność okna narzędziowego można wyłączyć.
Każde dokowalne okno narzędziowe ma w swoim menu kontekstowym opcję
Dockable
.
Jeżeli opcja ta jest zaznaczona, okno jest dokowalne. Jeżeli nie jest, okno nie jest dokowalne
i można je swobodnie umieszczać w całym obrębie IDE.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
165
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
165
Rysunek 4.16.
Cztery okna
narzędziowe
zadokowane
w Edytorze Kodu
Przykładowy program MDI
Żeby utrwalić przyswojoną w tym rozdziale wiedzę na temat projektów i formularzy,
stwórzmy przykładową aplikację MDI. Będzie to przeglądarka plików graficznych. Jak
na ten etap nauki będzie to dość rozbudowana aplikacja, potrzebny więc będzie ogólny
plan działania. Oto on:
1.
Utworzenie formularza głównego MDI, posiadającego menu.
2.
Napisanie kodu obsługującego opcje
Plik | Otwórz
i
Plik | Zapisz
.
3.
Napisanie kodu obsługującego opcje
Uporządkuj Sąsiadująco
,
Uporządkuj
Kaskadowo
i
Uporządkuj Wszystkie
z menu
Okno
.
4.
Utworzenie formularzy podporządkowanych MDI.
5.
Utworzenie formularza „O Programie”.
6.
Zakończenie pracy połączone z podziwianiem jej efektów.
Bierzmy się więc do roboty.
166
Część I
166
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Utworzenie formularza głównego
Pierwszym krokiem jest utworzenie formularza głównego. Okno główne aplikacji MDI
musi mieć właściwość
FormStyle
ustawioną na
fsMDIForm
. Następnie trzeba będzie
utworzyć menu i okna dialogowe
Otwórz
i
Zapisz
. Wykonaj następujące czynności:
1.
Uruchom Delphi i wybierz opcję
File | New Application
z menu głównego.
2.
Zmień właściwość
Name
formularza na
MainForm
.
3.
Zmień właściwość
Caption
na
Przeglądarka plików graficznych
.
4.
Ustaw właściwość
Height
na 450, a
Width
na 575 (albo inne wartości odpo-
wiednie dla ustawionego aktualnie trybu graficznego).
5.
Zmień właściwość
FormStyle
na
fsMDIForm
.
W porządku, główny szkielet formularza głównego jest już gotowy. Teraz dodaj do nie-
go menu główne. Ponieważ nie omawiałem jeszcze Projektanta Menu, ułatwimy sobie
sprawę wykorzystując do utworzenia menu predefiniowany szablon:
1.
Kliknij na zakładce
Standard
na Palecie Komponentów i kliknij na komponencie
MainMenu
.
2.
Kliknij na formularzu, aby umieścić na nim menu główne. Można je umieścić
w dowolnym miejscu formularza, ponieważ komponent menu w czasie działania
programu nie będzie widoczny.
3.
Zmień właściwość
Name
menu na
MainMenu
.
4.
Kliknij podwójnie na umieszczonym na formularzu komponencie
MainMenu
.
Otworzy się Projektant Menu (szczegółowe omówienie Projektanta Menu
znajdziesz w rozdziale 6).
5.
Umieść kursor na Projektancie Menu i kliknij prawy klawisz myszy. Z menu
kontekstowego wybierz opcję
Insert from Template
. Otworzy się okno dialo-
gowe
Insert Template
. Rysunek 4.17 pokazuje to okno dialogowe na tle
Projektanta Menu.
Rysunek 4.17.
Okno dialogowe
Insert Template na
tle Projektanta menu
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
167
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
167
6.
Wybierz opcję
MDI Frame Menu
i kliknij OK.
7.
Zamknij Projektanta Menu klikając ikonę systemową umieszczoną w prawym
górnym rogu okna.
Teraz powinieneś być z powrotem na formularzu głównym. Zwróć uwagę, że teraz posiada
on menu główne. Możesz klikać poszczególne opcje menu głównego, żeby zobaczyć
rozwijane listy poszczególnych podopcji. Nie wybieraj ich na razie – zrobisz to za
chwileczkę. Sporo jest tam tych opcji, prawda? Nie będziesz potrzebował ich wszystkich
– zostaw po prostu nie używane tak, jak są.
Przygotuj teraz okna dialogowe
Otwórz
i
Zapisz
:
1.
Kliknij na zakładce
Dialogs
na Palecie Komponentów. Wybierz komponent
OpenPictureDialog
i umieść go na formularzu. Tak samo jak menu główne,
można go umieścić w dowolnym miejscu formularza.
2.
Zmień właściwość
Name
tego okna dialogowego na
OpenPictureDialog
.
3.
Właściwość
Title
zmień na
Otwórz rysunek
.
4.
Umieść na formularzu komponent
SavePictureDialog
.
5.
Zmień właściwość
Name
nowo umieszczonego komponentu na
SavePicture-
Dialog
, a jego właściwość
Title
na
Zapisz Rysunek
.
Formularz główny powinien wyglądać, jak na rysunku 4.18.
Rysunek 4.18.
Aktualny wygląd
formularza
głównego
168
Część I
168
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Napisanie kodu obsługującego opcje
File | Open i File | Save as…
Następnym etapem tworzenia naszej aplikacji jest wpisanie kodu obsługującego opcje
File|Open
i
File|Save As
. Delphi jak zwykle ułatwia bardzo to zadanie. Nie utworzyliśmy
jeszcze okien podporządkowanych MDI, ale wiemy wystarczająco dużo, żeby napisać
procedury obsługi wyżej wymienionych opcji. Pamiętaj tylko o tym, że kompilacja apli-
kacji nie będzie możliwa przed utworzeniem okien podporządkowanych MDI. Wykonaj, co
następuje:
1.
Na głównym formularzu aplikacji wybierz opcję
File|Open
. Procedura obsługi
tej opcji zostanie utworzona automatycznie, w Edytorze Kodu wystarczy tylko
w miejscu umieszczenia kursora wpisać odpowiedni kod.
2.
Uzupełnij procedurę
TMainForm.Open1Click
tak, żeby wyglądała następująco:
procedure TMainForm.Open1Click(Sender: TObject);
var
Child : TChild;
begin
if OpenPictureDialog.Execute then begin
Child := TChild.Create(Self);
with Child.Image.Picture do begin
LoadFromFile(OpenPictureDialog.FileName);
Child.ClientWidth := Width;
Child.ClientHeight := Height;
end;
Child.Caption := ExtractFileName(OpenPictureDialog.FileName);
Child.Show;
end;
end;
W procedurze tej najpierw wywoływane jest okno dialogowe
Otwórz Plik
, w którym
pobierana jest od użytkownika nazwa pliku z rysunkiem. Jeżeli użytkownik naciśnie
przycisk
Anuluj
, okno jest zamykane i żadna akcja nie jest podejmowana. Jeżeli nato-
miast użytkownik naciśnie klawisz OK, utworzony zostaje nowy obiekt klasy
TChild
(okno podporządkowane MDI). Następnie plik z rysunkiem jest ładowany do komponentu
Image
w oknie podporządkowanym MDI i rozmiar tego okna zostaje automatycznie do-
pasowany do rozmiaru rysunku. Na końcu do właściwości
Caption
zostaje wpisana na-
zwa pliku zawierającego rysunek i rysunek zostaje wyświetlony.
W metodzie
Open1Click
użyta jest funkcja
ExtractFileName
, która od-
dziela ścieżkę dostępu od nazwy pliku i zwraca tę ostatnią. Związane tema-
tycznie funkcje to
ExtractFilePath
,
ExtractFileDir
,
Extract-
FileDrive
i
ExtractFileExt
.
3.
Naciśnij F12, żeby przełączyć się z powrotem do formularza. Wybierz teraz
opcję
File|Save as.
W Edytorze Kodu wyświetlona zostaje procedura obsługi
tej opcji.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
169
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
169
Pamiętasz, gdy w poprzednim rozdziale pisałem o wywołaniu funkcji
Free
przy likwidacji obiektów przydzielanych dynamicznie? Wygląda na to, że
łamię tę zasadę w przytoczonej wyżej procedurze. W rzeczywistości jednak
zadanie odzyskiwania pamięci alokowanej dla okien podporządkowanych
MDI wykonuje biblioteka VCL. Zwróć uwagę, że parametrem konstruktora
klasy
TChild
jest
Self
. Mówi to VCL, że właścicielem okna podporządko-
wanego MDI jest okno główne MDI. Kiedy okno główne jest zamykane,
następuje automatyczna likwidacja wszystkich okien podporządkowanych.
4.
Zmodyfikuj tę procedurę, aby wyglądała jak poniżej:
procedure TMainForm.SaveAs1Click(Sender: TObject);
begin
if SavePictureDialog.Execute then
with ActiveMDIChild as TChild do
Image.Picture.SaveToFile(SavePictureDialog.FileName);
end;
Procedura ta jest krótka i prosta. Najpierw wyświetlone zostaje okno dialogowe
Zapisz
Plik
. Jeżeli użytkownik naciśnie OK, rysunek zostaje zapisany na dysku pod nazwą
określoną w metodzie
SaveToFile
klasy
TPicture
.
W powyższej procedurze widać w akcji operator
as
. Właściwość
Ac-
tiveMDIChild
zwraca wskaźnik na obiekt klasy
TForm
. To, czego po-
trzeba w tej sytuacji to wskaźnik na obiekt klasy
TChild
, aby mieć dostęp
do jego właściwości
Image
. Operator
as
konwertuje zmienną
ActiveMDI-
Child
na wskaźnik do
TChild
. Jeżeli z jakichś powodów konwersja nie
jest możliwa, następujący po tym wyrażeniu kod nie jest wykonywany.
Zanim będziemy kontynuować, warto zapisać aktualny stan projektu na dysku. Wybierz
z menu głównego opcję
File | Save All
. Zapisz
Unit1
(domyślna nazwa nadawana
nowemu modułowi) jako
PctViewU
, a projekt jako
PictView
.
Napisanie kodu obsługującego opcje menu Window
Teraz można wpisać kod obsługujący opcje menu
Window
. Jest on bardzo prosty:
1.
Przełącz się z powrotem do formularza naciskając klawisz
F12
. Wybierz opcję
Window | Tile
.
2.
Do procedury obsługującej tę opcję trzeba wpisać tylko jedną linię kodu:
procedure TMainForm.Tile1Click(Sender: TObject);
begin
Tile;
end;
170
Część I
170
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
3.
Przełącz się do formularza i powtórz to samo dla opcji
Window | Cascade
.
Gotowa procedura powinna wyglądać następująco:
procedure TMainForm.Cascade1Click(Sender: TObject);
begin
Cascade;
end;
4.
Powtórz powyższe czynności dla opcji
Window | Arrange All
. Kod, który
trzeba wpisać do procedury to pojedyncza instrukcja:
ArrangeIcons;
Formularz główny jest już gotowy. Teraz przejdziemy do tworzenia okien podporząd-
kowanych MDI.
Utworzenie okna podporządkowanego MDI
Utworzenie takiego okna jest zaskakująco proste. Nie trzeba właściwie w tym celu
wpisywać żadnego kodu. Wystarczy wykonać następujące kroki:
1.
Utwórz nowy formularz używając przycisku
New Form
na pasku narzędzi lub
opcji
File | New Form
z menu głównego.
2.
Ustaw właściwość
Name
nowego formularza na
Child
. Właściwość
Caption
można zostawić bez zmian, ponieważ ustawiana będzie w czasie wykonywania
programu.
3.
Zmień właściwość
FormStyle
na
fsMDIChild
. Jest to wymagane, żeby okno to
było traktowane jak okno podporządkowane MDI.
To wszystko, jeżeli chodzi o sam formularz. Umieść teraz na nim komponent
Image
.
Jego zadaniem będzie wyświetlenie grafiki z pliku wybranego przez użytkownika.
1.
Kliknij na zakładce
Additional
palety komponentów. Następnie kliknij na
komponencie
Image
i umieść go gdziekolwiek na formularzu.
2.
Zmień właściwość
Name
komponentu
Image
na
Image
.
3.
Zmień właściwość
Stretch
na
True
.
4.
Zmień właściwość
Align
na
alClient
. Rozmiar komponentu
Image
zostanie
dopasowany do obszaru klienckiego formularza.
5.
Wybierz z menu głównego opcję
File | Save
i zapisz moduł formularza na
dysku jako
MDIChild
.
6.
Przełącz się do Edytora Kodu (naciśnij F12). Kliknij na zakładce
PctViewU
.
Wybierz z menu głównego opcję
File | Use Unit
, wybierz moduł
MDIChildU
i kliknij OK.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
171
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
171
Formularz nie wygląda na razie zbyt interesująco, powinien wyglądać mniej więcej jak
na rysunku 4.19.
Rysunek 4.19.
Formularz okna
podporządkowanego
MDI z komponentem
Image
Pozostało jeszcze utworzyć okno „O Programie”, ale pewnie niecierpliwisz się już, żeby
uruchomić program i zobaczyć, jak działa. Kliknij więc na przycisku
Run
. Po krótkiej
chwili program powinien się uruchomić. Możesz wybrać opcję
File|Open
i otworzyć
plik z rozszerzeniem
.bmp
,
.wmf
albo
.ico
.
Zwróć uwagę, że okno podporządkowane MDI dopasowuje swój rozmiar do rozmiaru
wyświetlanej grafiki. Otwórz kilka obrazów i wypróbuj opcje
Cascade
i
Tile
z menu
Window
. Jeżeli chcesz, możesz zapisywać grafiki pod inną nazwą korzystając z opcji
File
| Save As
.
Utworzenie okna „O Programie”
Myślę, że potrafisz już wystarczająco dużo, żeby utworzyć formularz O Programie sa-
memu. Zaprojektuj go tak, żeby wyglądał mniej więcej jak na rysunku 4.20. Jeśli nie
dasz sobie z czymś rady, możesz wrócić do rozdziału, w którym opisane było tworzenie
formularza „O Programie” dla aplikacji Multiple.
Po utworzeniu formularza trzeba wykonać następujące czynności, żeby można było
wywoływać to okno poleceniem menu:
1.
Zmień właściwość
Name
formularza na
AboutBox
.
2.
Zapisz moduł jako
PVAboutU
.
Delphi w pełni obsługuje długie nazwy plików. Ze względu na wymogi publi-
kacji elektronicznej stosuję w tej książce konwencję „8-kropka-3”, ale Ty
możesz oczywiście stosować długie nazwy.
172
Część I
172
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Rysunek 4.20.
Okno
„O Programie”
3.
Przełącz się do karty
PctViewU
w Edytorze Kodu (naciskając
F12
). Wybierz
opcję
File | Use Unit
z menu głównego i włącz do listy
uses
bieżącego modułu
moduł
PVAboutU
.
4.
Naciśnij
F12
, żeby przełączyć się z powrotem do głównego formularza. Wy-
bierz z menu głównego opcję
Help | About
. Wyświetlony zostanie Edytor
Kodu z kursorem ustawionym w procedurze
OnClick
.
5.
Wpisz poniższą linię:
AboutBox.ShowModal;
Na razie, to byłoby już wszystko. Naciśnij ikonę
Run
i wypróbuj opcję
About
z menu
Help
. Na rysunku 4.21 przedstawiony jest działający program z wyświetlonymi kilkoma
oknami podporządkowanymi MDI.
Rysunek 4.21.
Przeglądarka plików
graficznych
w działaniu
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
173
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
173
Końcowe poprawki
Mimo, że program jest w pełni funkcjonalny, nie jest jeszcze dopracowany w najdrob-
niejszych szczegółach. Chociaż, jak na półgodzinne programowanie, nie jest wcale tak
źle. Jest jeszcze kilka problemów, które mogą wystąpić w czasie użytkowania programu.
Jeżeli spróbujesz otworzyć plik, który nie zawiera grafiki, wystąpi wyjątek. Wyjątki
i sposoby postępowania z nimi omówię w rozdziale 14. „Zaawansowane techniki pro-
gramowania”. Oprócz tego w menu jest dużo niepotrzebnych opcji, których można by się
pozbyć. Pokażę Ci, jak to zrobić, w rozdziale 6 podczas omawiania Projektanta menu.
Z dwoma problemami powinieneś jednak już sobie poradzić, są dość proste. Po pierw-
sze, po uruchomieniu aplikacji otwierane jest puste okno podporządkowane MDI. Jest
to spowodowane tym, że Delphi automatycznie tworzy wszystkie zaprojektowane wcześniej
formularze zaraz po uruchomieniu programu. W przypadku okna podporządkowanego
MDI oznacza to, że jest ono wyświetlane, kiedy okno główne staje się widoczne na
ekranie. W tym programie okna podporządkowane tworzone są przez użytkownika
w razie potrzeby, nie jest więc konieczne, żeby Delphi tworzyło je automatycznie.
Na szczęście, usunięcie okna podporządkowanego MDI z listy okien tworzonych auto-
matycznie jest bardzo proste. Wykonaj następujące czynności:
1.
Wybierz z menu głównego opcję
Project | Options
. Wyświetlone zostanie
okno dialogowe opcji projektu.
2.
Jeżeli nie jest aktualnie wyświetlona karta
Forms
, kliknij jej zakładkę. Zostanie
wyświetlona lista formularzy tworzonych automatycznie.
3.
Kliknij na formularzu podporządkowanym MDI i naciśnij przycisk >. Spowoduje
to usunięcie tego formularza z listy formularzy tworzonych automatycznie,
i dodanie go do listy dostępnych formularzy.
Teraz uruchom program ponownie. Tym razem puste okno podporządkowane MDI nie
jest wyświetlane.
W Twojej aplikacji jest jeszcze jedna pułapka, o której muszę wspomnieć. Kiedy naci-
śnie się przycisk zamknięcia okna podporządkowanego MDI, okno to zamiast się za-
mknąć, zostaje zminimalizowane. Możesz wierzyć lub nie, takie zachowanie się okien
jest uznawane przez Microsoft jako standardowe.
Jeżeli usuniesz jakiś formularz z listy formularzy tworzonych automatycz-
nie, musisz „ręcznie” utworzyć ten formularz przed jego użyciem. Jeżeli
nie utworzysz formularza, wskaźnik na niego pozostanie nieokreślony – nie
zostanie mu przypisana żadna konkretna wartość (pamiętaj o tym, że
wskaźniki tworzone są automatycznie w Delphi). Próba użycia takiego
wskaźnika będzie skutkować naruszeniem dostępu lub błędnym działaniem
programu.
174
Część I
174
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
Rysunek 4.22.
Okno dialogowe
Project Options
Zachowanie standardowe czy nie, jest na pewno dziwne. Trzeba ten błąd naprawić, tak
aby okno zamykało się po naciśnięciu przycisku zamknięcia (tak, jak spodziewa się tego
każdy normalny człowiek). Aby to zrobić, wykonaj co następuje:
1.
Otwórz okno podporządkowane MDI w Projektancie Formularzy. Upewnij się,
że wybrany jest sam formularz, a nie umieszczony na nim komponent
Image
(jeżeli trzeba, wybierz formularz z listy wyboru komponentu).
2.
Kliknij podwójnie w prawej kolumnie karty
Events
Inspektora Obiektów, obok
zdarzenia
OnClose
. Zmodyfikuj procedurę
TChild.FormClose
tak, aby wyglą-
dała następująco:
Procedure TChild.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
Action := caFree;
end;
Wpisanie wartość
caFree
do zmiennej
Action
mówi VCL, żeby zamknęła okno
podporządkowane MDI i zwolniła przydzieloną mu pamięć. Teraz okna te po-
winny zachowywać się tak, jak trzeba.
3.
Uruchom program i sprawdź jego działanie.
Podsumowanie
W Delphi IDE można się czasami pogubić, dopóki nie nabierze się trochę doświadczenia.
W tym rozdziale sporo się nauczyłeś na temat różnych elementów IDE. Następnie zapozna-
łeś się z używaniem projektów do tworzenia programów wykonywalnych. Dowiedziałeś się
także więcej o formularzach, oknach dialogowych i oknach podporządkowanych MDI.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
175
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
175
Poznałeś dobrze Inspektora Obiektów i jego użycie przy zmianie wartości właściwości
poszczególnych komponentów, poznałeś także okna dokowalne. Na koniec stworzyłeś
program, który wykonuje coś pożytecznego i ciekawego.
Warsztat
Warsztat składa się z pytań kontrolnych oraz ćwiczeń utrwalających i pogłębiających
zdobytą wiedzę. W razie trudności lub wątpliwości, odpowiedzi do tych pytań zamiesz-
czone są w Dodatku A. „Quiz – odpowiedzi”.
Pytania i odpowiedzi
υ
Paski narzędzi Delphi nie zawierają przycisków poleceń, których używam
najczęściej. Czy mogę modyfikować paski narzędzi?
Oczywiście. Paski narzędzi są w pełni konfigurowalne. Można swobodnie doda-
wać i usuwać poszczególne ikony.
υ
Umieściłem na formularzu kilka komponentów
Label
i próbowałem wybrać
je wszystkie poprzez przeciąganie wskaźnika myszy. Zamiast tego dostałem
kolejny duży komponent
Label
. Co zrobiłem nie tak?
Zapomniałeś wyłączyć opcji wielokrotnego umieszczania komponentów. Wyłą-
cza się ją poprzez kliknięcie na narzędziu wyboru komponentu (ikona ze strzałką).
υ
Usiłuję umieścić jedno z okien IDE poza obszarem Edytora Kodu. Za każdym
razem jednak okno to zostaje zadokowane w Edytorze Kodu. Jak mogę temu
zapobiec?
Przyciśnij prawy klawisz myszy w obszarze okna i menu kontekstowym wyłącz
opcję
Dockable
.
υ
Kiedy przez przypadek wpiszę jakąś literę do właściwości
Top
mojego formu-
larza, zostaje wyświetlony komunikat o błędzie. Zdaję sobie sprawę, że
powinienem wpisywać tam cyfry a nie litery, ale skąd właściwie biorą się takie
komunikaty?
Inspektor Obiektów wie, jakie wartości są prawidłowe dla poszczególnych wła-
ściwości. Litera nie jest prawidłową wartością dla właściwości typu
Integer
,
więc wyświetlany jest komunikat o błędzie. W niektórych przypadkach za kontrolę
wprowadzanych danych odpowiedzialne są odpowiednie edytory właściwości.
υ
Co muszę zrobić, żeby moja aplikacja była aplikacją MDI?
Główny formularz powinien mieć właściwość
FormStyle
ustawioną na
fsMDIForm
,
a wszystkie okna podporządkowane MDI powinny mieć tę właściwość ustawioną
na
fsMDIChild
.
176
Część I
176
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
υ
Jaka jest różnica między oknem dialogowym i zwykłym oknem aplikacji?
Właściwie nie ma żadnej różnicy. Formularz okna dialogowego może mieć stałe
wymiary, zamiast być skalowalne, przyciski
OK
,
Anuluj
i
Pomoc
i może nie mieć
ikon minimalizacji i maksymalizacji. Poza tym okno dialogowe jest jak każdy
inny formularz.
υ
Czy mogę sprawdzić, czy w module, nad którym aktualnie pracuję nie ma
błędów, bez uruchamiania aplikacji?
Tak. Trzeba wybrać opcję
Project | Syntax Check
z menu głównego. Delphi
skompiluje wszystkie moduły, które zostały zmienione od czasu ostatniej
kompilacji i wypisze komunikaty o wszystkich wykrytych błędach.
Quiz
1.
Jak wywołuje się okno dialogowe
Customize
(Dostosuj) głównego okna Delphi?
2.
Jeżeli otwarte jest okno
Customize
, w jaki sposób dodaje się przyciski do paska
narzędzi?
3.
Jak usuwa się przyciski z paska narzędzi?
4.
Jaki jest najprostszy sposób umieszczania na formularzu wielu takich samych
komponentów?
5.
Jaki jest najprostszy sposób umieszczenia komponentu dokładnie na środku
formularza?
6.
Wymień typy plików niezbędnych do zbudowania aplikacji w Delphi.
7.
Jakiej metody VCL używa się do wyświetlenia formularza niemodalnego?
8.
Jakiej metody VCL używa się do wyświetlenia formularza modalnego?
9.
Jak można dołączyć do zdarzenia procedurę obsługi, która została już wcze-
śniej zdefiniowana?
10.
Jak, używając Inspektora Obiektów, uaktywnić wartości właściwości typu
zbiorowego?
Ćwiczenia
1.
Usuń z paska narzędzi
View
przyciski
Pause
,
Step Over
i
Trace Into
. Dodaj
zamiast nich przyciski
Compile
,
Build
i
Syntax Check
.
2.
Przywróć paskowi narzędzi jest domyślne ustawienia.
3.
Poświęć trochę czasu na przyjrzenie się wszystkim komponentom umieszczonym
na Palecie Komponentów. Umieść te szczególnie interesujące na formularzu
i poeksperymentuj z nimi.
Rozdzia³ 4.
♦ Środowisko zintegrowane (IDE)
177
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc
177
4.
Utwórz na dysku twardym nowy katalog. Utwórz w Delphi nową aplikację.
Dodaj do projektu 3 nowe formularze (jeśli chcesz, mogą być puste). Zapisz
projekt do nowo utworzonego katalogu i uruchom program. Zamknij program.
Sprawdź teraz, jakie pliki znajdują się w katalogu aplikacji. Porównaj pliki,
które tam są z typami plików z tabeli 4.1.
5.
Uruchom program „Przeglądarka plików graficznych”, który utworzyłeś wcze-
śniej. Otwórz kilka plików graficznych. Przeciągaj okna podporządkowane
MDI w obrębie okna głównego. Spróbuj wyciągnąć któreś z nich poza obszar
okna głównego. Co się dzieje?
6.
Poeksperymentuj z dokowaniem różnych okien IDE w Edytorze Kodu.
7.
Utwórz nową aplikację. Umieść na formularzu kilka różnych komponentów.
Kliknij na każdym z komponentów obserwując jednocześnie uważnie Inspektor
Obiektów.
8.
Utwórz nowy, pusty formularz. Kliknij podwójnie w Inspektorze Obiektów
w prawej kolumnie obok właściwości
Color
, żeby wywołać okno dialogowe
wyboru koloru. Wybierz jakiś kolor i kliknij OK.
178
Część I
178
C:\WINDOWS\Pulpit\Szymon\Delphi 4 dla każdego\04.doc