plik


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:
roz04
Roz04
ROZ04
haasPl roz04

więcej podobnych podstron