Delphi od podstaw - rozdział 4
Rozdział 4 - IDE
Spis treści:
Pasek narzędziowy
Repozytorium
Projektant formularzy
Menu projektanta formularzy
Ustawienia pulpitu
Opcje projektu
Strona Forms
Strona Application
Strona Compiler
Strona Linker
Strona Directories/Conditionals
Strona Version Info
Strona Packages
Kilka formularzy w jednym projekcie
Wskaźnik Self
Aplikacje wielo dokumentowe MDI
Projektowanie głównego formularza
Tworzenie menu
Projektowanie okna Child
Pisanie kodu
Podsumowanie
W poprzednich rozdziałach przede wszystkim uczyłeś się języka
Object Pascal. Dzisiaj zapoznasz się bardziej z opcjami oferowanymi przez
Delphi. W językach niskiego poziomu nie było za bardzo nic do wyjaśniania z
opcjami gdyż ich albo nie było, albo było tak mało, że wyjaśniane ich było
zbędne. Pamiętam gdy ja uruchamiałem po raz pierwszy Delphi zaskoczyła mnie
mnogość opcji oferowanych przez te środowisko. Dzisiaj trochę się z tym
zapoznasz.
Na Delphi IDE składają się: paski narzędzi, eksplorator
kodu, inspektor obiektów, projektant formularzy, paleta komponentów.
Wiem, że część z tego omawiałem już wcześniej, ale tylko pobieżnie
tak abyś miał podstawy do pracy z Delphi. Tutaj zamierzam dokładniej objaśnić
środowisko IDE.
Pasek narzędziowy
Rysunek 4.1
Oczywiście opcje, które są dostępne na pasku narzędziowym istnieją także
w menu, ale skoro masz paski to po co korzystać z menu? Ja i tak nauczyłem się
korzystać ze skrótów klawiaturowych i według mnie jest to lepsze rozwiązanie.
Wiem, że do kompilacji służy skrót Ctrl + F9, a do uruchomienia projektu
klawisz F9 i to mi wystarczy. No może jeszcze skrót zapisywania plików - Ctrl
+ S.
Jeżeli chcesz wczytać nowy projekt to nie stosujesz opcji Otwórz,
ale Otwórz projekt. Dlatego, że jeżeli chcesz otworzyć nowy projekt musisz
wczytać plik DPR, a nie PAS!
Jeżeli chcesz zakończyć pracę z danym projektem wybierasz z
menu File -> Close All. Polecenie Close zamyka tylko używany formularz, a
nie cały projekt.
W prosty sposób możesz stworzyć nowy formularz. Wybierając
opcje z menu File -> New Form. Jeżeli chcesz rozpocząć pracę z nowym
projektem to wybierasz File -> New Application. Proste, nie?
Repozytorium
Repozytorium możesz otworzyć wybierając z menu File ->
New.
Rysunek 4.2
Im nowsza wersja Delphi tym więcej jest tam zakładek i ikon.
Większość z nich nie jest przeważnie używane - niektóre są bardzo często.
Tabela 4.1
Zakładka
Opis
zakładki
New
Najczęściej używana zakładka.
Pozwala stworzyć nowy projekt, komponent, bibliotekę DLL, formularz
lub np. zwykły tekst. czy moduł.
ActiveX
Pozwala na stworzenie kontrolek
ActiveX, obiektów typu COM oraz innych pochodnych kontrolek ActiveX.
Multitier
Dostępna tylko w wersji Client/Server.
Pozwala na stworznie obiektów typu COBRA lub MTS.
Forms
Delphi oferuje na ten zakładce
gotowe formularze do wykorzystania w Twojej aplikacji. Są to np. okna
dialogowe lub okno "O programie".
Dialogs
Również zawiera kilka
gotowych formularzy - wzorców.
Projects
Zawiera gotowe wzorcowe i kompletne
projekty do wykorzystania.
Data Modules
Umożliwia wybór danych dla
Twojej aplikacji.
Business
Ta zakładka przedstawia
kreator przeznaczony do tworzenia formularzy dla baz danych.
W repozytorium możesz umieszczać własne formularze do późniejszego
wykorzystania. Twój formularz może być np. umieszczony na zakładce Forms.
Nie jest to trudne. Jeżeli masz otwarty projekt musisz go zapisać. Teraz z
menu Project wybierasz Add to Repositotory. Pierwsze pole, które musisz wypełnić
to tytuł nowego pola - możesz wpisać np. FormaTestowa. W polu Description
wpisz opis kontrolki - np: To jest kontrolka testowa. Kolejne pole to Page. Z
listy rozwijalnej wybierz zakładkę na której ma być umieszczony formularz. W
polu Author wpisz autora kontrolki.
Po naciśnięciu przycisku Browse możesz wybrać ikonę, która reprezentować
będzie formularz. To wszystko - teraz OK.
Projektant formularzy
Na pewno już zauważyłeś, że podczas projektowania aplikacji na
formularzu wyświetlana jest siatka, która później znika po uruchomieniu
aplikacji. Ta siatka czasem się przydaje. Wtedy gdy zależy Ci na tym, aby
grupa komponentów ustawiona była według jakiejś krawędzi. Komponenty możesz
przesuwać także przy pomocy klawiatury. Wystarczy, że zaznaczysz myszką
wybrany komponent, a następnie wciśniesz klawisz Ctrl. Następnie klawiszami
strzałek ustawiasz położenie komponentu o 1 piksel. Jeżeli zamiast Ctrl wciśniesz
Shift to możesz zwiększać lub zmniejszać rozmiary zaznaczonego komponentu.
Nie tylko jednego, ale także grupy komponentów. Wystarczy, że
zaznaczysz wybrane komponenty obrysowując je, a następnie będziesz przeciągał.
Takim sposobem możesz także kopiować, wycinać i wklejać komponenty. Nie
ma do tego odpowiedniego przycisku. Są natomiast klawisze skrótu. Ctrl + X
wycina zaznaczone komponenty; Ctrl + C kopiuje, a Ctrl + V wkleja komponenty
umieszczone w schowku. Usuwanie komponentów jest bardzo proste - wystarczy, że
naciśniesz klawisz Delete.
Jeżeli chcesz na formularzu umieścić kilka komponentów tego samego typu
to zaznaczając dany komponent w palecie komponentów przytrzymaj klawisz Shift.
Teraz możesz klikać na formę, a w każdym miejscu umieszczony będzie dany
komponent. Jest to pewne ułatwienie. Jeżeli już masz dosyć naciśnij na
przycisk strzałki w palecie komponentów.
Menu projektanta formularzy
Po naciśnięciu prawego przycisku pojawi się menu kontekstowe. W tabeli 4.2
przedstawiłem opcje wraz z opisem menu kontekstowego:
Element
Opis
Align to Grid
Jeżeli zaznaczony komponent lub komponenty
nie są na równi z siatką formularza to ta opcja wyrównuje te właśnie
obiekty.
Bring to Front
Jeżeli dwa komponenty nachodzą na siebie
to ta opcja powoduje wysunięcie na wierz zaznaczonego komponentu.
Send to Back
Tak jak w powyższym wypadku tyle, ze
powoduje schowanie zaznaczonego obiektu.
Align
Wyświetla okienko Alignment. Powoduje ono
wyrównanie względem siebie zaznaczonych komponentów. Można np. wyrównać
komponent lub komponenty w poziomie lub pionie.
Size
Wyświetla okienko Size, służące do
ustawiania szerokości lub/i wysokości danego obiektu.
Scale
Wyświetla okno Scale, w którym można
ustalić ile procent zaznaczone komponenty mają się zmniejszyć lub
zwiększyć.
Tab Order
Wyświetla okno Tab Order.
Creation Order
Wyświetla okno Creation Order.
Add to Repository
To już znasz - powoduje dodanie formy do
repozytorium.
View as Text
Powoduje wyświetlenie danego formularza w
formie tekstu - w edytorze kodu. Żeby później wyświetlić ponownie
formularz klikasz znowu prawym przyciskiem i wybierasz View as Form.
Text DFM
Zawsze odznaczaj tę opcje. Dzięki niej użytkownicy
starszych wersji będą mogli utworzyć formularz zapisany w Delphi
5. Ta opcja dostępna jest tylko w Delphi 5.
Tyle teoria. Teraz sprawdźmy to w praktyce. Umieść na formie np. dwa
komponenty Button. Teraz zaznacz je po prostu obrysowując ich krawędzie. Teraz
naciśnij na któryś z nich prawym przyciskiem myszy i wybierz opcje Align.
Ustaw pozycje Centers w polu Horizontal i Vertical. Teraz ok. Co to? Zniknął
jeden komponent? Nie. Po prostu kazałeś im ustawić się równo w pionie jak i
w poziomie. Normalnie nie ma sensu ręcznie ustawiać równo komponentów -
lepiej to zrobić tym właśnie narzędziem.
Ustawienia pulpitu
Jeżeli uruchomisz Delphi to przez cały czas okna mają tę samą długość
i szerokość. Muszę powiedzieć, że ta opcja, która jest w nowszych wersjach
Delphi bardzo się przydaje. Możesz bowiem zapisać sobie ustawienia Delphi. Ja
na przykład lubię, aby Inspektor Obiektów był rozciągnięty na całą długość
ekranu. Edytor kodu także rozciągam maksymalnie, a okienko eksploratora kodu
zamykam. Teraz jeżeli chcesz zapisać taki ustawienie pulpitu musisz użyć
tego oto paska narzędziowego:
Lista rozwijalna to Twoje ustawienia - możesz mieć ich kilka. Jeżeli jest
tam napis <None> to oznacza, że nie wybrane są żadne ustawienia. Jeżeli
chcesz zapisać takie ustawienia jak obecnie naciskasz pierwszy z lewej
przycisk. Pojawi się okienko z miejscem na wpisanie nazwy. Wpisz ja i naciśnij
przycisk OK.
Opcje projektu
Wybierając z menu Project -> Options pojawi się okno opcji projektu.
Dzieli się ona na kilka zakładek:
Strona Forms
Kluczowym elementem jest tutaj lista rozwijalna. Przedstawione są na niej
formularze zawarte w projekcie ( tak - w jednym projekcie może być więcej niż
jeden formularz - o tym za chwilę ). Z listy tej wybierasz formularz, który będzie
wyświetlany na pierwszym miejscu, czyli zaraz po uruchomieniu programu.
Po lewej stronie znajduje się okienko Auto-create Forms. Po prawej Available
forms. Kontrolka po lewej zawiera spis formularzy, które będą tworzone
automatycznie po uruchomieniu programu, ale będą one ukryte i nie pokazywane
podczas uruchomienia programu. Można oczywiście taki formularz wyświetlić i
jest to łatwiejsze bo wymaga jeden linii kodu. Po prawej stronie są
formularze, które nie są tworzone automatycznie - bo po co? Zawsze przełączaj
formularze na tą właśnie stronę. Jeżeli nie używasz formularza to po co ma
on zajmować miejsce w pamięci. Tworzenie formy, której nazwa widnieje po
prawej stronie jest trochę trudniejsze, ale da się to zrobić. Formularze możesz
przełączać między oknami za pomocą przycisków.
Strona Application
W pierwszym polu możesz ( ale nie musisz ) wpisać nazwę tytułu aplikacji.
Nazwa wpisana w tym polu będzie wyświetlona na pasku stanu Windowsa jeżeli
aplikacja będzie zminimalizowana. Drugie pole to nazwa pliku pomocy ( *.hlp )
dla programu. W przyszłych rozdziałach będziemy tworzyć pliki pomocy dla
naszej aplikacji. No i kolejne pole to ikona, która zdobić będzie plik
skompilowany EXE. Żeby wybrać ten plik naciskasz przycisk Load Icon. W
kolejnym polu Traget file extension wpisujesz rozszerzenie dla aplikacji.
Normalnie jeżeli pole to jest puste nie wpisujesz nic. Jeżeli masz zamiar używać
aplikacji jako wygaszacza ekranu wpisujesz w to miejsce .scr. Jest to
rozszerzenie dla wygaszaczy właśnie. Możesz także wpisać .dll ( biblioteki
DLL ) lub .cpl ( aplety Panelu Sterowania ). Po prostu po kompilacji plikowi
wykonywalnemu nadane zostanie rozszerzenie wpisane w tym polu.
Strona Compiler
Ta strona służy do ustawień opcji kompilatora. Na początek w oczy rzuci
Ci się mnogość opcji oferowanych przez tą zakładkę. Oto opisy poszczególnych
działów tej strony.
Pierwsze pole domyślnie jest zaznaczone. Służy ono do optymalizacji kodu
przez kompilator. Wygeneruje on możliwie jak najszybszy kod nie zwracając
uwagi na rozmiar pliku wykonywalnego.
Kolejne pole Aligned Record Files określa sposób w jaki Delphi rozmieści
rekordy w pamięci. Jeżeli opcja jest włączona to rozmiar rekordów wyrównany
jest do granicy 4 bajtów.
Kolejne to Stack Frames. Po wyłączeniu tej opcji czas kompilacji będzie możliwie
najkrótszy. Opcję tę włącza się jeżeli chce się wykryć błędy w
aplikacji.
Ostatnia opcja Pentium-safe FDIV dotyczy procesorów Pentium. Włączenie tej
opcji powoduje, że kompilator jest w stanie poradzić sobie z błędem
dzielenia zmiennopozycyjnego, który występuje w starszych wersja procesora
Pentium.
W sekcji Messages wszystkie opcje powinieneś zostawić włączone. Dzięki
temu będziesz informowany o wszelkich błędach lub ostrzeżeniach, które wystąpią
podczas próby kompilacji projektu.
Sekcja Debugging określa jak budowany będzie plik wykonywalny. Odznaczając
pole Debug information Delphi nie będzie do pliku wykonywalnego dodawać
informacji o niezbędnych dla debuggera. Wybór należy do Ciebie...
Dwie pozostałe pozycje, czyli Runtime Erorr i Syntax Options "mówią"
kompilatorowi w jaki sposób chcesz kompilować program. Jeżeli ponaznaczasz te
opcje Delphi będzie ostrzegał, sprawdzał wszelkie błędy jakie mogą wystąpić
podczas pisania programu.
Strona Linker
Ta zakładka jest bardzo rzadko używana ( przynajmniej przeze mnie ).
Najlepiej pozostawić jej domyślne ustawienia. Pierwsza pozycja określa, czy i
jak szczegółowa będzie tzw. mapa modułu. Jest to zaawansowane narzędzie
odszukiwania i wykrywania błędów w aplikacjach.
Kolejne pole EXE and DLL options zawiera opcje związane z plikiem
wykonywalnym. Po zaznaczeniu pierwszej pozycji Delphi stworzy aplikacje konsolową
zamiast zwykłej GUI. Aplikacja konsolowa to aplikacja, która wyświetlana jest
w oknie MS - DOS. Kolejna pozycja sprawia, że do pliku dołączona będzie
informacja dla debuggera TD32.exe.
Kolejna pozycja to dosyć przydatna sekcja. Normalnie Delphi generuje
skompilowane pliki PAS - DCU. Pliki DCU możesz usunąć, ale np. dostarczając
moduł nie musisz dołączać jego kodu źródłowego ( pas ), ale wystarczy
plik DCU - skompilowany moduł. Jeżeli zaznaczysz pole Generate C++ Object
Files to Delphi zamiast plików DCU stworzy pliki OBJ, które będziesz mógł
wykorzystać jako moduł w C++ Builderze.
Memory Size to sekcja, którą możesz zostawić w spokoju. Natomiast pole
EXE Description może posłużyć do zawarcia np. w pliku EXE informacji o
prawach autorskich.
Strona Directories/Conditionals
Tutaj możesz ustawić katalog, w którym Delphi poszukiwał będzie określonych
plików. Np. pole Output Directory określa miejsce gdzie będzie umieszczany
efekt kompilacji projektu, czyli plik EXE lub DLL. Kolejne Unit output directory
określa gdzie będą umieszczane skompilowane moduły DCU. Kolejne pole Search
Path służy do określenia gdzie Delphi będzie poszukiwał dodatkowych plików
niezbędnych do zbudowania aplikacji.
Ja pozostawiam te pola puste - to znaczy, że wszelkie pliki generowane będą
w katalogu, w którym aktualnie jest zapisany projekt.
Strona Version Info
Także przydatna zakładka. Możesz zaznaczając opcję Include version
information in project dołączyć do pliku wykonywalnego standardową informację
jak w większości programów - o prawie autorskim, wersji aplikacji, nazwie
aplikacji itp.
Strona Packages
Przede wszystkim dokonujesz tutaj wyboru o sposobie kompilacji ( mówiłem o
tym wcześniej ). W górnej części dokonujesz wyboru jakie pakiety będą dołączane
do pliku EXE. Pakiety to pliki zawierające skompilowany kod źródłowy
potrzebny do wykonania jakiejś funkcji. Ja mam wszystkie pola zaznaczone.
Kilka formularzy w jednym projekcie
Oczywiście, że jest to możliwe. I na dodatek nie jest trudne. Wystarczy z
menu File wybrać New Form. To wszystko. Delphi wygeneruje nowy formularz, a w
edytorze kodu powstanie nowa zakładka. Swój formularz główny nazwij "MainForm".
Teraz gdy stworzyłeś już nowy formularz nazwij go "SecondForm".
Zapisz wszystko pod nazwą: "MainFrm" oraz "SecondFrm". Tak
jak mówiłem wcześniej są dwa sposoby wywołania formularza. Umieść na
formie głównej przycisk i nazwij go "btnCreate". Wygeneruj jego
zdarzenie OnClick i napisz w nim:
procedure TMainForm.btnCreateClick(Sender: TObject);
begin
SecondForm.ShowModal;
end;
Teraz z menu File wybierz Use Unit ( używane moduły ). Na dole jest lista
formularzy używanych w programie i NIE dodanych do formularza głównego.
Zaznacz tę nazwę i naciśnij OK. Zauważ, że w pliku MainFrm po słowie
Implementation powstała nowa linia:
uses SecondFrm;
Tak, Delphi po prostu dodał nowy moduł ( formularz ) do formularza głównego
wpisując jego nazwę do listy uses. Mogłeś to zrobić ręcznie, ale...
Uruchom teraz projekt. Po naciśnięciu przycisku powinna wyświetlić się
forma. Teraz już wiesz, że polecenie ShowModal wyświetla dane okienko
modalne! Znaczy to, że jeżeli drugie okienko się wyświetli to nie możesz
nic robić na głównym formularzu. Teraz zamiast ShowModal wpisz tylko Show.
Jeszcze raz wyświetl formularz - teraz wyświetlona druga forma nie przeszkadza
Ci w wykonywaniu różnych operacji na formularzu głównym ( możesz się do głównej
formy przełączyć ). Na tym polega różnica pomiędzy poleceniem Show, a
ShowModal.
Jak widzisz wywołanie formularza tą metodą nie jest niczym nadzwyczajnym.
Dlatego, że formularz jest automatycznie tworzony podczas uruchamiania
programu. Ty tylko go wyświetlasz. A po co ma być od razu uruchomiony? Czy nie
lepiej, aby nie był tworzony automatycznie? Oszczędzimy tym sposobem pamięć.
Najpierw musisz wejść do opcji programu ( Project -> Options ). Teraz
klikasz na zakładkę Forms. Po lewej stronie masz napisane nazwy dwóch
formularzy, które są tworzone automatycznie. Zaznacz SecondForm i naciśnij
przycisk ">". Tym sposobem nazwa "przeskoczyła" ze
strony lewej na prawą. Naciskasz OK.
Teraz jednak zmieni się sposób wyświetlania formularza gdyż nie wystarczy
go wyświetlić, ale trzeba jeszcze stworzyć. Trzeba użyć znanych Ci już
metod - konstruktora nowej formy:
procedure TMainForm.btnCreateClick(Sender: TObject);
begin
SecondForm := TSecondForm.Create(Self); // stwórz
SecondForm.ShowModal; // wyświetl
SecondForm.Free; // zwolnij
end;
Chyba wszystko jest tu jasne. Wszystko z wyjątkiem słowa Self. O tym nieco
później. Na razie spójrz jak tworzy się komponenty w sposób dynamiczny:
var
Button : TButton; // zmienna wskazuje na komponent
procedure TForm1.Button1Click(Sender: TObject);
begin
Button := TButton.Create(Self); // tworzenie komponentu
Button.Parent := Self;
Button.Caption := 'Przycisk'; // tytuł komponentu
Button.Left := 10; // pozycja - lewa
Button.Top := 10; // pozycja - góra
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Button.Free; // zwolnij przy zamykaniu
end;
Pamiętaj o zwalnianiu komponentów. Wszystko co tworzysz dynamicznie musi być
zwalniane. Zwalnianie możesz przeprowadzić również tak: Button.Destroy.
Zalecane jest jednak użycie metody Free. Dlaczego? Wywołując metodę Destroy
dwa razy program wyświetli komunikat o błędzie. Jeżeli zastosujesz metodę
Free to nawet jeżeli obiekt został już zwolniony to nie wygeneruje komunikatu
o błędzie. Zauważ, że deklaracje zmiennej musiałem umieścić poza procedurą,
aby była ta zmienna widoczna w całym module. Zwróć także uwagę, że
podczas tworzenia komponentu trzeba było podać tzw. rodzica komponentu (
Parent ). W tym wypadku także napisałem Self, czyli znaczy to, że komponent będzie
umieszczony na formie.
Możliwe jest także umieszczanie komponentów na innych formularzach. Umieść
na formularzu komponent Panel. Komponent ten nie robi nic specjalnego - jest
komponentem, który może właśnie rodzicem dla innych komponentów. Jeżeli
chciałeś umieścić komponent Button na komponencie Panel to kod źródłowy
wyglądałby tak:
procedure TForm1.Button1Click(Sender: TObject);
begin
Button := TButton.Create(Panel1); // tworzenie komponentu
Button.Parent := Panel1;
Button.Caption := 'Przycisk'; // tytuł komponentu
Button.Left := 10; // pozycja - lewa
Button.Top := 10; // pozycja - góra
end;
Pod warunkiem oczywiście, że komponent TPanel nazywa się Panel1. Wtedy
nowo tworzony komponent będzie umieszczony na pozycji 10 ( lewa ), 10 ( góra )
względem komponentu Panel.
Wskaźnik Self
Jest to słowo kluczowe, które wskazuje na obiekt, który aktualnie jest używany.
Przy tworzeniu jakiegoś komponentu na formie piszesz Self. Chcesz umieścić na
formie więc na początku można by pomyśleć, że zostawiasz to pole puste. Bo
w końcu chcesz umieścić komponent na formie, a nie na żadnym komponencie,
nie? Ale ten parametr jest obowiązkowy i Delphi wygeneruje błąd - musisz tu
coś wpisać. Piszesz więc Self. Zróbmy prosty test. Napisz gdzieś w
programie:
Caption := 'Nazwa formularza';
Ty już wiesz, że zmienia to tytuł formularza. Nie odwołujesz się bezpośrednio
do żadnego komponentu więc Delphi wie, że chcesz zmienić wartość właściwości
formularza. Kompilator widzi to w ten sposób:
Self.Caption := 'Nazwa formularza';
Możesz też tak napisać - program się skompiluje i wykona żądaną
operację. Jest to tzw. pole ukryte i nie powinieneś z nim eksperymentować.
Aplikacje wielo dokumentowe - MDI
Pomysł narodził się bodajże w Excelu - tam po raz pierwszy to
zastosowano. Polega to na tym, że program może zawierać wiele otwartych okien
wśród których możesz się dowolnie przełączać. Np. edytor tekstów - możesz
mieć wiele dokumentów otwartych jednocześnie i je edytować. Takie aplikacje
nazywają się MDI. Normalnie pisaliśmy aplikacje bazujące na jednym oknie -
SDI. Okna MDI zastosowano np. w programie PaintShop Pro. Napiszemy w tym
rozdziale prosty program, który w założeniu ma być podobny do PaintShop Pro.
Nie oczekuj, że napiszesz PaintShop Pro ++, ale końcowy efekt może być
interesujący.
Projektowanie głównego formularza
Trzeba wymyślić jakąś nazwę dla aplikacji. Może View v. 1.0? Co Ty na
to? Ja formularz nazwałem MainForm, a tytuł formy to View 1.0. Dodaj do
formularza komponent TStatusBar ( paleta Win32 ). Nazwij go "StatusBar".
Jest to standardowy komponent jak w większości programów, który może posłużyć
do wyświetlania tekstu pomocy po najechaniu na konkretny komponent. Zajmiemy się
tym później. Na razie jest to tylko dla lepszego wyglądu.
Teraz żeby aplikacja była typu MDI musisz zmienić właściwość FormStyle
formularza. Zmień ją na fsMDIForm.
Projektowanie menu
Za pierwszym razem może to być czynność nieco trudna, ale później okaże
się dziecinnie prosta. Wiesz o jakie menu chodzi? Tak jak w większości
programów biurowych na górze menu rozwijalne zawierające jakieś opcje. Do
tego służy komponent MainMenu ( paleta Standard ). Nazwij go "MainMenu".
Ok, teraz kliknij na niego dwukrotnie - otworzy się okienko. W Inspektorze
Obiektów wpisz "&Plik" i naciśnij Enter. Utworzona została nowa
pozycja. Znak "&" nie będzie wyświetlany. Jest to podkreślenie.
Np. jeżeli piszesz ten znak przed literą P to ta litera będzie podkreślona.
Teraz po naciśnięciu klawisza Alt + podkreślona literaz wykonana zostanie
procedura OnClick tego menu. Dobra masz pierwszą pozycję. Nadaj jej jeszcze właściwość
Name - "FileMenu". Dobrze, teraz w tym okienku kliknij na tym napisie
- Plik. Stworzona zostanie nowa pozycja pod spodem:
Menu
Plik będzie menu głównym, a pozycja pod spodem to będzie pozycja tego menu.
Zwróć uwagę na ten kwadracik obok napisu Plik. Po kliknięciu na niego będziesz
mógł stworzyć nowe menu główne. Napis "&Edycja" i nazwij je
"EditMenu". Tak samo możesz utworzyć element głównego menu. Do
menu Plik dodaj takie pozycje:
Nazwij
kolejno te pozycje: "FileNew", "FileOpen", "FileSave",
"FileSaveAs", "FilePrint", "FilePrintSetup",
"FileExit". Te przerywniki możesz stworzyć wpisując w miejscu
Caption znak -
Menu Plik mamy już gotowe - teraz trzeba jakoś opracować menu
Edycja.
Tutaj dodałem
do poszczególnych pozycji skrót klawiaturowy. Jest to proste. Wystarczy, że
podczas gdy pozycja jest zaznaczona we właściwości ShortCut z listy
wybierzesz odpowiedni skrót.
Pozycje nazwałem odpowiednio: "EditCut", "EditCopy",
"EditPaste".
Dodaj jeszcze jedno główne menu - Pomoc:
Tutaj stworzone zostało submenu. Jest to proste. Dwie główne
pozycje nazwałem: "About", "HelpContact". Teraz na pozycji
"Kontatk z autorem" naciśnij prawym klawiszem myszy i wybierz Create
SubMenu. Tutaj kolejne dwie pozycje - "HelpNew", "HelpBug".
To wszystko jeżeli chodzi o tworzenie menu. W przyszłości
dodamy jeszcze ikonki dzięki czemu wszystko będzie wyglądało lepiej.
Projektowanie okna Child
Okno główne jest już gotowe. Teraz pozostało jeszcze drugie
okno - tzw. Child. To w nim będą wyświetlane obrazki. Stwórz więc nowy
formularz ( File -> New Form ) i nazwij go ChildForm, a zapisz pod nazwą
ChildFrm. Możesz trochę zmniejszyć rozmiary drugiego okna. Zmień jeszcze właściwość
FormStyle na fsMDIChild. Dobrze. Musisz jeszcze usunąć formularz z listy
automatycznie tworzonych formularzy. O tym pisałem wcześniej ( opcje projektu
).
To jeszcze nie koniec. W oknie Child umieść komponent Image (
paleta Additional ). Ten komponent służy do przechowywania obrazków. Nazwij
go Image. Teraz trzeba tak rozciągnąć ten komponent, aby zajmował cały
formularz. Nie rób tego ręcznie. Niektóre komponenty zawierają właściwość
Align dzięki której możesz ustalić położenie danego komponentu. Z listy
wybierz alClient. Spowoduje to rozmieszczenie komponentu na cały obszar
formularza. Oprócz tego możesz ustawić jeszcze:
Wartość
właściwości Align
Opis
alBottom
Komponent będzie ZAWSZE ustawiony u dołu
formy. Bez względu na zmianę rozmiarów formularza komponent dopasuje
się do dolnej jego krawędzi.
alClient
To już znasz - ustawiony będzie zawsze na
cały obszar formy.
alLeft
Jak łatwo się domyśleć po lewej stronie
ten komponent będzie umieszczony.
alNone
Jest to domyślna wartość - komponent nie
będzie miał szczególnego położenia.
alRight
Teraz będzie rozmieszczany po prawej
stronie.
alTop
Teraz komponent będzie umieszczony na
samej górze formy. Bez względu na rozmiar i położenie formy.
Nim zaczniemy pisanie kodu trzeba ustawić jeszcze parę szczególików co do
naszej aplikacji. Wejdź do opcji projektu. Kliknij na zakładkę Application. W
polu Title wpisz nazwę jaka się pojawi na pasku stanu podczas gdy program będzie
uruchomiony. Wpisz - np. View. No i oczywiście wybierz odpowiednią ikonę.
Pisanie kodu
Uffff. Weź głęboki oddech. Zaczynamy! Najpierw potrzebujemy jeszcze
jednego komponentu. Na palecie Dialogs jest komponent OpenPictureDialog. Jest to
komponent, który po otwarciu wyświetla listę plików i katalogów. Nazwij go
OpenPictureDialog. Teraz zaznacz pozycję Filter. Po naciśnięciu na przycisk
trzykropka wyświetla się okno, w którym wpisuje się filtry. Chyba wiesz co
to jest filtr i rozszerzenie, prawda? No więc po lewej stronie wpisz nazwę
filtra - np. Bitmapy (*.bmp). Po prawej stronie wpisz maskę - *.bmp
Teraz naciśnij OK - okno się zamknie i maska zostanie zaakceptowana. Przejdźmy
do pisania kodu.
Pierwsze co musisz zrobić to wygenerować zdarzenie OnClick jednej z pozycji
z menu. Ta pozycja to "Otwórz". Jeżeli masz otwartą formę to z
menu Plik wybierz Otwórz. Delphi wrzuciło Cię do edytora kodu i wygenerowało
zdarzenie OnClick tej pozycji.
procedure TMainForm.FileOpenClick(Sender: TObject);
begin
if OpenPictureDialog.Execute then // jeżeli okienko zostanie wyświetlone...
begin
ChildForm := TChildForm.Create(Self); //...stwórz okno Child
{ załaduj obrazek }
ChildForm.Image.Picture.LoadFromFile(OpenPictureDialog.FileName);
ChildForm.Show; // wyświetl okno
end;
end;
Komponent OpenPictureDialog posiada funkcję Execute. Tą funkcją okienko się
wywołuje. Jeżeli funkcja zwróci wartość TRUE to znaczy, że okno się wyświetliło.
Później następuje stworzenie okna Child. Właściwość FileName komponentu
OpenPictureDialog zawiera ścieżkę pliku, który został wybrany w
komponencie. Następna instrukcja kodu powoduje załadowanie do komponentu (
LoadFromFile ) właśnie obrazka, który został wybrany w komponencie
OpenPictureDialog.
Pozostało jeszcze wygenerowanie jednej ważnej procedury. Przełącz się do
formularza Child i wygeneruj jego procedurę OnClose. Napisz w niej:
procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Spowoduje to definitywne zamknięcie okna i zwolnienie pamięci przez nie
zajmowanej. Zamiast caFree możesz także przypisać wartości:
caNone
nic się nie będzie działo
caHide
spowoduje to ukrycie formularza, a nie jego zamknięcie
caMinimize
minimalizacja formularza
Teraz możesz już program uruchomić i sprawdzić jego działania. Spróbuj
wczytać jakiś obraz wybierając pozycję, której kod przed chwilą napisałeś.
Działa, prawda? Tyle, że okienko nie jest dostosowane rozmiarami do rozmiarów
samego obrazka. Trzeba trochę zmodyfikować procedurę otwierającą dany
obrazek:
procedure TMainForm.FileOpenClick(Sender: TObject);
begin
if OpenPictureDialog.Execute then // jeżeli okienko zostanie wyświetlone...
begin
ChildForm := TChildForm.Create(Self); //...stwórz okno Child
{ załaduj obrazek }
ChildForm.Image.Picture.LoadFromFile(OpenPictureDialog.FileName);
with ChildForm do
begin
{ dopasuj rozmiary obszaru roboczego do rozmiarów obrazka }
ClientWidth := Image.Picture.Width;
ClientHeight := Image.Picture.Height;
end;
ChildForm.Caption := OpenPictureDialog.FileName; // do tytułu okna przypisz wybrany plik
ChildForm.Show; // wyświetl okno
end;
end;
ClientWidth oraz ClientHeight są bardzo podobnymi właściwościami do Width
oraz Height. Jak więc jest pomiędzy nimi różnica? Te drugie to rozmiar
samego formularza, a te pierwsze to wymiary obszaru roboczego. Jak więc widzisz
w programie rozmiary tego okna są dopasowane do rozmiarów obrazka wyświetlanego
w komponencie Image.
Jak dotąd w komponencie tym możliwe jest wyświetlanie tylko i wyłącznie
plików BMP. Dlatego, że tylko taka maska wyświetlona jest w komponencie
OpenPictureDialog. Możesz ustawić jeszcze inną. Tak jak poprzednio wyświetl
to okienko. Dodaj drugą maskę:
Obrazki JPG (*.jpg)
*.jpg
Tak, że po prawej stronie należy wpisać samą maskę, a po lewej tylko
nazwę. Dodaj jeszcze jeden filtr dzięki któremu wyświetlone będą wszystkie
pliki:
Wszystkie pliki
(*.*)
*.*
Całe to okienko powinno wyglądać tak:
Żeby jednak móc wyświetlać obrazki JPG w komponencie Image
musisz dodać nazwę modułu ( jpeg ) do listy uses formularza ChildForm.
Jedziemy dalej: możemy zrobić tak, aby w którymś z menu wyświetlana
była lista otwartych okien. Nie trzeba do tego żadnego kodu. Przełącz się
do formularza głównego aplikacji. Teraz odnajdź w Inspektorze Obiektów właściwość
WindowMenu. Z listy rozwijalnej możesz wybrać menu do którego
"doklejana" będzie ta lista otwartych okien. Wybierz pozycję "HelpMenu".
Teraz możesz skompilować i uruchomić aplikację.
Jeżeli otworzysz tylko jedno okno to żadnego efektu nie będzie, ale jeżeli
okien będzie więcej to w menu tym widniały będą ścieżki otwartych plików.
Kolejna część zadanie - pisanie procedury zapisującej
zawartość obrazka do pliku. Na razie będzie możliwość zapisania tylko w
formacie *.bmp. Umieść na formularzu komponent SavePictureDialog ( paleta
Dialogs ). Tutaj także trzeba ustawić filtry. Ustaw tylko filtr umożliwiający
zapisywanie plików BMP. Wygeneruj teraz procedurę zdarzenia Zapisz z menu i wpisz
taki kod:
procedure TMainForm.FileSaveClick(Sender: TObject);
begin
if SavePictureDialog.Execute then // Jeżeli okno zostanie wyświetlone...
{ zapisz zawartość komponentu Image do pliku }
(ActiveMDIChild as TChildForm).Image.Picture.SaveToFile(SavePictureDialog.FileName);
end;
Jeżeli podczas zapisywania pliku nie podasz nazwy pliku z
rozszerzeniem to program zapisuje plik bez rozszerzenia. Trzeba więc to wpisywać
ręcznie. Jest na to rozwiązanie. Właściwość DefaultExt tegoż komponentu.
Wpisz w to miejsce słowo bmp. Teraz czy napiszesz, czy nie i tak program
zapisze plik z rozszerzeniem.
Nadszedł czas, aby stworzyć
nową pozycję menu. Nazywać się będzie Okno. Będzie zawierać pozycje: Sąsiadująco
( WinTile ), Kaskada ( WinCascade ), Uporządkuj ( WinArrange ). W nawiasach są
nazwy jakie nadałem poszczególnym pozycjom. Te trzy pozycje menu będą
powodowały rozmieszczenie okien Child w programie. Zobacz, oto kod tych trzech
procedur:
procedure TMainForm.WinTileClick(Sender: TObject);
begin
// sąsiadując
Tile;
end;
procedure TMainForm.WinCascadeClick(Sender: TObject);
begin
// kaskada
Cascade;
end;
procedure TMainForm.WinArrangeClick(Sender: TObject);
begin
// uporządkuj
ArrangeIcons;
end;
Uruchom program i sprawdź działanie tych poleceń. Aha, wcześniej
do właściwości WindowMenu przypisałeś menu Pomoc ( HelpMenu ). Może lepiej
by było przypisać tą właściwość do menu Okna? Ja tak zrobiłem.
Bardzo przydatną właściwością jest ActiveMDIChild. Np. możesz
napisać ActiveMDIChild.Next; powoduje aktywacje kolejnego na liście
formularza. Żeby aktywować poprzedni na liście formularz możesz napisać
ActiveMDIChild.Previous. Ilość otwartych okien MDI przechowuje właściwość MDIChildCount.
Oto kilka przykładów operacji na oknach MDI:
var
i : Integer;
begin
for I := 0 to MDIChildCount -1 do
MDIChildren[i].Close;
Powoduje okno po oknie zamykanie okien MDI. MDIChildren musi
zawierać w nawiasie klamrowym numer okna, którego dotyczyć będzie operacja.
W tym wypadku później polecenie Close zamykająca okno.
var
i : Integer;
begin
for I := 0 to MDIChildCount -1 do
MDIChildren[i].WindowState := wsMaximized;
W tym wypadku wszystkie okna będą maksymilizowane. WindowState
określa sposób wyświetlania okna. Może ona przyjąć następujące
parametry:
wsMaximized
okno zostanie maksymalizowane
wsNormal
okno pozostanie w normalnych wymiarach
wsMinimized
okno będzie minimalizowane
Podsumowanie
Ten rozdział być może nie był dla Ciebie zbyt ciekawy.
Poznawałeś budowę Delphi i opcje, które być może ułatwią Ci tworzenie
aplikacji. Następnie tworzyłeś edytor graficzny. Na razie jest bardzo prosty
bo oprogramowanych jest zaledwie parę procedur, ale to się zmieni - program
ten będziemy pisać przez całą książkę wciąż dodając nowe elementy.
Przypominam, że kody źródłowe programów dołączone są do niniejszej książki.
Wyszukiwarka
Podobne podstrony:
roz04Roz04ROZ04haasPl roz04wiÄcej podobnych podstron