delphi kurs Lekcja04

Delphi, cz. 4


Na jakiś czas skończmy omawiać sam język Object Pascal i zajmijmy się samym "Delphi". Zaczniemy pisać też program - edytor tekstów.


Informacje ogólne


Teraz na temat Delphi i jego podst. funkcji. Po wybraniu opcji "File" -> "New Application" Delphi tworzy nowa aplikacje. Jeżeli wybierzesz "File" -> "New Form" utworzona zostanie nowa forma. Po wybraniu "File" -> "New Frame" zostanie stworzony taki prosty formularz. Na pierwszy rzut okna nie różni się niczym od zwykłego formularza, ale formę te można dodać na palety komponentów, a później umieszczać jako zwykły komponent! Żeby to zrobić klękasz na te formę prawym przyciskiem myszy i wybierasz "Add To Palet te". Zostaniesz poproszony o zapisanie samej formy, a następnie wyświetli się okienko, w którym musisz podać nazwę formy i wybrać zakładkę, na której zostanie umieszczona.

Jeżeli stworzysz jakiś program to zapewne zauważysz, że jest on delikatnie mówiąc.... dużych rozmiarów. :) To jest poważna wada Delphi - tworzy on zbyt duże pliki wykonywalne. jednak na to sposoby. Jeżeli np. wysyłasz przez Internet program kumplowi tylko po to, aby ten ocenił Twoja prace, a kumpel Twój posiada Delphi to możesz zrobić cos takiego:


Z menu "Project" wybierz "Options"; teraz kliknij na zakładkę "Packages". Zaznacz pole "build with runtime packages". Teraz Twój program zmniejszy Twoje rozmiary. Ale uwaga! Jeżeli dasz taki program innemu kumplowi, który nie posiada Delphi to ten program mu się nie uruchomi.


Drugim sposobem na zmniejszenie rozmiaru EXEca jest zastosowanie specjalnych programów kompresujących. Ja polecam UPX. Program ten możesz ściągnąć ze strony: www.programowanie.of.pl

Dobra dosyć gadania, zaczynamy pisać program! :)


Piszemy edytor tekstów


Pierwszym krokiem będzie wybranie z menu "File" -> opcji "New Application". Hmm... Jak by tu nazwać nasz program? Może: "Bardzo fajny edytor tekstów"? No nie, lepiej: "TXTEdit", inaczej: "TeXTEditor". Co Wy na to? Może być? :) Zmieni właściwość "Name" formy na "MainFrm". Teraz wybierz z menu "File" -> "Save All". Stwórz nowy katalog - np.: "TXTEdit". Jako nazwę formy wpisz: "MainFrmU". Jako nazwę projektu podaj: "TXTEdt". Teraz dodamy trochę nowy komponentów.

1. Na zakładce "Additional" znajduje się komponent "ControllBar" - umieść go na formie. Teraz zmień w Inspektorze Obiektów właściwość "Align" tego komponentu na "alTop". Właściwość "Align" określa położenie komponentu ( alTop - na górze; alBottom - na dole; alLeft - po lewej; alRight - po prawej; alClient - na całej formie; alNone - brak określonego położenia ).

2. Teraz na komponencie "ControllBar" umieść "ToolBar" [ na zakładce: "Win32" ]. Jest to komponent, na którym znajdować się będą przyciski. Zmień właściwość "Name" tegoż komponentu na "Tools". Teraz kliknij raz na "ContollBar". W Inspektorze Obiektów odszukaj właściwość "AutoSize". Zmień ja na True" - spowoduje to dopasowanie się "ContollBara" do wymiarów "Toolsa".

3. Teraz raz kliknij na komponencie "Tools". Możesz go swobodnie przeciągać po komponencie "ContollBar". Ok, odszukaj teraz w Inspektorze Obiektów właściwość "EdgeBorders". Kliknij na małym krzyżyku obok nazwy tej właściwości - rozwinie się nowa gałąź właściwości. Ta właściwość określa obramowanie tego komponentu. Każda może mięć wartość "True" lub "False" i określa obramowanie. W "ebTop" zmień na "False". Obramowanie zniknie.

4. Na palecie "Win32" znajduje się "StatusBar". Umieść go na formularzu - zostanie umieszczony u dołu formularza. Ten komponent nie robi nic innego - wyświetla pomoc, jeżeli np. najedzież kursorem na przycisk to na tym komponencie ( "StatusBar" ) wyświetli się tekst pomocy. Komponent ten nazwij "HelpBar".

5. Na palecie "Win32" znajduje się komponent "RichEdit". Jest to kontrolka edycyjna. Umożliwia przechowywanie tekstu. Nazwij ten komponent "RichEdit", a właściwość "Align" zmień na "alClient" - komponent wypełni cały dostępny obszar formularza. Teraz mając zaznaczony komponent "RichEdit" w Inspektorze Obiektów odszukaj właściwość "Lines". Jeżeli na nią klikniesz w polu po prawej pojawi się mały przycisk z trzykropkiem - naciśnij go. Ta właściwość umożliwia modyfikacje tekstu, który jest wyświetlany wewnątrz komponent. Usuń cały tekst tam zawarty i kliknij OK.

6. Teraz możesz już zbudować program ("Project" -> "Build" ). Zapisz także projekt ("File" -> "Save All").


Teraz możesz przejść do katalogu, w którym zapisałeś program. Ile zajmuje plik wykonywalny EXE? U mnie 362 kB. Ponad to jest opatrzony niezbyt efektywna ikona.

Można to zmienić. Ponownie przejść do opcji programu ( Shift + Ctrl + F11 ). Kliknij na zakładce "Application". Możesz teraz wybrać odpowiednia ikonę dla programu klikajac na przycisku "Icon". Jeżeli już wybrałeś ponownie zbuduj program.

No dobrze szkielet programu już mamy.


1. Przełącz się teraz do edytora kodu ( F12 ). Na samej górze znajduje się sekcja uses. Poniżej dopisz taka linie:


const

AppName = 'TeXT Edit 1.0'; // nazwa aplikacji


Pewnie się zastanawiasz, po co to? Będziemy wykorzystywali ta stała przy okazji pisania programu. Np. będziemy pisać komunikat "ShowMessage(AppName);". W rezultacie wyświetli się okienko z informacja: "TeXT Edit 1.0". W stałej możesz zmienić jedynie nazwę lub wersje programu i automatycznie będzie ona zmieniana we wszystkich okienkach.


2. Przełącz się znów do formularza ( F12 ); kliknij na zakładce "Events". Na tej liście znajduje się lista wszystkich zdarzeń. Zdarzenie to procedura, która wykonywana jest podczas zajścia jakiejś czynności. Cóż lista jest długa. Na razie nie będę się rozpisywał na temat znaczenia wszystkich z nich. Odszukaj zdarzenie "OnCreate" - kliknij na nią. Teraz przesuń kursor trochę na lewo nad białe pole - kursor zmieni swój kształt. Teraz kliknij dwukrotnie myszą. Zostaniesz przeniesiony do edytora kodu i uzupełniona zostanie procedura "OnCreate". Ta procedura będzie wykonywana po starcie programu. Wpisz tutaj taki oto tekst:


// wyswietlenie tytulu aplikacji na pasku

Caption := AppName;


Jak zapewne pamiętasz właściwość "Caption" służy do przechowywania tytułu aplikacji. W tym wypadku na pasku tytułowym pojawi się nazwa naszej aplikacji. Ponownie przełącz się do formy. Kliknij prawym klawiszem myszy na komponencie "Tools". Z menu, które się rozwinie wybierz pozycje: "New Button" - stworzony zostanie nowy przycisk. Jeżeli przycisk jest odrobinę większy od samego paska to zaznacz ten komponent "Tools" i w Inspektorze Obiektów we właściwości "AutoSize" zmień na "True". Nazwę nowo powstałego przycisku zmień na "btnNew". Stwórz jeszcze jeden przycisk i nazwij go "btnOpen".


3. Odnajdź teraz zakładkę "Dialogs". Na zakładce tej odnajdź komponent "OpenDialog" - umieść go na formularzu i zmień właściwość "Name" komponentu na "OpenDialog". Ten komponent służy do wyświetlania okna "Otworz".

4. Teraz kliknij podwójnie na komponencie "btnOpen". Wpisz taki oto tekst w procedurze:


{ Proceudra wczytuje do RichEdit plik tekstowy }


OpenDialog.Execute; // wywolanie okna ( wyswietlanie ).

{ Wczytaj do RichEdit plik tekstowy. Właściwość "FileName" komponentu

"OpenDialog" przechowuje nazwę pliku tekstowego }

RichEdit.Lines.LoadFromFile(OpenDialog.FileName);


To wszystko! Teraz odpal program ( F9 ) i naciśniesz na ten przycisk. Możesz teraz wczytać plik tekstowy. Tylko dwie linie wystarczyły! Wszystko za sprawa procedury "LoadFromFile", która wczytuje plik tekstowy. Właściwość "FileName" przechowuje ścieżkę pliku tekstowego. Ja do tej procedury dopisałem jeszcze jedna linie:


// wyswietlenie na pasku tytulowym nazwy wczytanego pliku

Caption := ExtractFileName(OpenDialog.FileName) + ' - ' + AppName;


Już wyjaśniam, o co chodzi. Funkcja "OpenDialog.FileName" przechowuje PEŁNĄ nazwę pliku np.: C:\dokumenty\plik.txt. Funkcja "ExtractFileName" wyciąga z tej ścieżki jedynie nazwę pliku! Możliwe jeszcze inne:


ExtractFileDrive wyciąga dysk, z którego wczytywany jest plik tekstowy

ExtractFileExt wyciąga rozszerzenie

ExtractFieDir katalog, w którym znajduje się plik tekstowy


Pewnie zauważyłeś, że gdy wczytujesz się duży plik to nie można go przesunąć?! W Inspektorze Obiektów musisz właściwość "ScrollBars" zmienić z "ssNone" na "ssVertical" - jedynie pasek pionowy; możliwe jest jeszcze: "ssHorizontal" - pasek poziomy; "ssBoth" - pionowy i poziomy.


Zmodyfikujemy teraz trochę nasz program. Pod słowem "private" dodaj taka oto linie:


procedure OpenFile(FName : String);


W ten sposób stworzyłeś swoja procedurę. Pamiętasz jak ja uzupełnić? Jeżeli tak to dobrze, a jak nie to już mowie: najedz kursorem na nazwę procedury i wybierz kombinacje klawiszy: Shift + Ctrl + C; Do tej procedury wytnij ( Ctrl + X ), a następnie wklej ( Ctrl + V ) tekst z procedury "btnOpenClick" z wyjątkiem linii: "OpenDialog.Execute". Teraz do procedury "btnOpenClick" dopisz taka oto linie:


OpenFile(OpenDialog.FileName);


Zmodyfikuj teraz procedurę "OpenFile" zastępując słowo "OpenDialog.FileName" na "FName". Całość powinna wyglądać tak:


procedure TMainFrm.btnOpenClick(Sender: TObject);

begin

{ Proceudra wczytuje do RichEdit plik tekstowy }


OpenDialog.Execute; // wywolanie okna ( wyswietlanie ).

OpenFile(OpenDialog.FileName);

end;


procedure TMainFrm.OpenFile(FName: String);

begin

{ Wczytaj do RichEdit plik tekstowy. Właściwość "FileName" komponentu

"OpenDialog" przechowuje nazwę pliku tekstowego }

RichEdit.Lines.LoadFromFile(FName);

// wyswietlenie na pasku tytulowym nazwy wczytanego pliku

Caption := ExtractFileName(FName) + ' - ' + AppName;

end;


Pewnie się zastanawiasz:, „Po co on tak kombinuje?". Stworzyliśmy nowa procedurę, która wczytuje plik tekstowy ze zmiennej "FName". Zobaczysz, ze w przyszłych rozdziałach będziemy tak unowocześniać nasz program, ze ta procedura nam się przyda. Po prostu wczytuje ona plik tekstowy nie pokazując okna "Otwórz". Mogę teraz np. napisać tak:


OpenFile('C:\Moje dokumenty\PlikTekstowy.txt');


Po takim wywołaniu automatycznie zostanie do RichEdit wczytany plik tekstowy.


Ok, teraz wypadałoby napisać procedurę zapisującą plik textowy.


1. Utwórz nowy przycisk i zmień jego właściwość "Name" na "btnSave [ następnym razem będę pisał po prostu: "nazwij go.... " ].

2. Umieść na formie nowy komponent "SaveDialog", nazwij go: "SaveDialog".

2. Utwórz kolejny przycisk i nazwij go "btnSaveAs". Kliknij na niego dwukrotnie. Wpisz taki oto kod:


{

W tej procedurze nastepuje wywolanie okna "Otworz", a

następnie zapisanie pliku. Wartość "SaveDialog.FileName"

przechowuje ścieżkę pliku tekstowego pod jakim zapisałeś

swoj dokument. Na samym koncu nastepuje zmiana wlasciwoscie

"Caption" okna, a później ustawienie wartosci "Modified" na

"False"

}

if SaveDialog.Execute then

RichEdit.Lines.SaveToFile(SaveDialog.FileName); // zapisz plik

Caption := ExtractFileName(SaveDialog.FileName) + ' - ' + AppName;

RichEdit.Modified := False; // ustaw wartość na "False"


Ta procedura wymaga parę słow. komentarza. Na samym początku wywołany zostaje komponent "SaveDialog". Komponent ten jest na pierwszy rzut oka bardzo podobny do innego "OpenDialog". W odróżnieniu od tego drugiego nie odczytuje pliku, a zapisuje go. No nie zupełnie zapisuje, bo to realizuje polecenie "SaveToFile" komponentu "RichEdit". Pod postacią: "SaveDialog.FileName" kryje się pełna nazwa i ścieżka pliku, który mamy zamiar zapisać. Następnie właściwość "Caption" głównej formy przybiera nowa wartość. Ta nowa wartością jest nazwa zapisywanego pliku. Oprócz tego do tej nazwy dołączony zostaje znak myślnika i nazwa naszej aplikacji kryjąca się pod postacią zmiennej "AppName". Następnie właściwość "Modified" komponentu "RichEdit" zostaje zmieniona na "False". Właściwość ta określa to, czy plik został zmodyfikowany, czy tez nie. Jeżeli przypiszemy jej wartość "False" to znaczy, ze plik już nie jest modyfikowany [ zapisaliśmy go ].

Teraz uzupełni procedurę "btnSave". Kliknij wiec na tym przycisku dwukrotnie - kod, który musisz wpisać wygląda tak:


{

Jeżeli plik nie został wczesniej zapisany wywolana

zostaje procedura "btnSaveAsClick". Jeżeli plik został już

wczesniej zapisany nastepuje zapisanie pliku bez

wywolywania okna "Otwórz".

}

if SaveDialog.FileName = '' then // jeżeli nie znamy nazwy pliku

btnSaveAsClick(Sender) // wywolaj procedurę...

else //... w przeciwnym wypadku zapisz plik...

RichEdit.Lines.SaveToFile(SaveDialog.FileName);


Ta procedura jest prostsza od poprzedniej. Na początku sprawdzany jest warunek "SaveDialog.FileName". Jeżeli jest on pusty to znaczy, ze plik nie został wcześniej zapisany - nie wywołano okna "Zapisz". Wtedy uruchamiana jest procedura "btnSaveAsClick", która napisaliśmy wcześniej. Pewnie zauważyłeś parametr "Sender". Pewnie zauważyłeś tez, ze w każdej procedurze występuje ten parametr. Co on oznacza? Omówię w kolejnym pod punkcie. Jeżeli plik zostaj już wcześniej zapisany [ tj. właściwość "FileName" komponentu "SaveDialog" <> ' ' ] to następuje zapisanie pliku bez wywoływania komponentu "SaveDialog".


Co to jest ten "Sender"?


Jak zapewne zauważyłeś w każdej procedurze występuje przynajmniej jeden parametr, którym jest "Sender". Co on właściwie oznacza? Najlepiej wytłumaczyć to na przykładzie:


1. Umieść na formularzu dwa komponenty: Button i Label.

2. Zaznacz pojedynczym kliknięciem komponent "button". Teraz w Inspektor Obiektów kliknij na zakładce "Events" [ zdarzenia ]. Widzisz tam wiele procedur. Zdarzenie jest to procedura, która zostaje wygenerowana, gdy ytkownik wykona taka czynność. Być może to jest niezrozumiale wiec już tłumaczę. Na tej liście widzisz wiele taki zdarzeń m. in. "OnClick". Ta procedura zostanie wygenerowana, gdy ktoś kliknie na komponent. "OnMouseDown" zostanie wygenerowana, gdy ktoś kliknie klawiszem myszy na przycisk. "OnMouseMove" gdy przejedziesz kursorem nad komponentem, itd... Kliknij wiec na polu "OnClick". Przesuń kursor myszy nad białe pole i kliknij dwukrotnie. Od tej pory już nie będę tak tego tłumaczył. Napisze tylko: "Wygeneruj procedurę OnClick". OK? No wiec teraz w procedurze "OnClick" wpisz:


if Sender is TButton then

ShowMessage(

'Tak to jest komponent Button');

if Sender is TLabel then

ShowMessage(

'To jest komponent Label');


Parametr "Sender" posiadał każdy komponent właśnie, dlatego, ze jest komponentem. Właściwość "Sender" jest typu "TObject", a obiekt to inaczej komponent.

Później omówię powyższą procedurę. Teraz przełącz się do formularza ( F12 ) i kliknij na komponencie "Label". W Inspektor Obiektów kliknij na zakładkę "Events". Kliknij na polu "OnClick". Po prawej stronie pokaże się strzałka - rozwiń ja i z listy wybierz "Button1Click". Od tej chwili oba komponenty korzystają z tej samej procedury. Uruchom program ( F9 ). Kliknij na oba komponenty. Co zauważyłeś? Tak... w ten sposób możesz w jednej procedurze zawrzeć kod obsługi dla kilku komponentów.

Teraz omówię poniższy kod. Na samym początku następuje sprawdzenie czy aktualnie aktywny komponent [ aktywny, czyli przed chwila kliknięty ] jest typu "TButton". Tak jak napisałem wcześniej każdy komponent ma swój typ. Np. dla Label jest to TLabel, dla Button jest to TButton, a dla Edit - TEdit. Możesz to zauważyć podczas umieszczania na formularzu różnych komponentów. Pod słowem "class" wypisane wszystkie nazwy komponentów, a po prawej ich typy. Ale wróćmy do naszego programu. Następuje sprawdzenie jakiego typu jest urywany komponent. Tego dokonuje operator "is". W zależności od typu wykowane jest inne polecenie - w tym wypadku wyświetlenie odpowiedniego okna jeżeli masz wiecej komponentów? Umieść na formularzu jeszcze komponent "TSpeedButton" [ na zakładce: "Additional" ] i Panel. Wszystkim przypisz taka sama procedurę "Button1Click". Nasza procedurę należy jeszcze odpowiednio zmodyfikować:


if Sender is TButton then

ShowMessage('Tak to ten komponent... hurra!!!')

else

ShowMessage(

'Nie, to nie jest komponent Button, ale: ' + Sender.ClassName);


Jeżeli jest to TButton to wyświetlone zostaje okienko. Jeżeli inny ( else ) to wyświetlone zostaje okno z typem tego komponentu ( Sender.ClassName ). Zresztą sprawdź sam!


Wiedza, która teraz poznaliśmy przyda się w następnym odcinku, gdyż odetchniemy trochę od pisania edytora tekstów :) i zajmiemy się pisaniem gry: "Kolko i Krzyk". Nie jest to wcale takie trudne, zobaczysz!


Jak zwykle czekam na pytania pod adresem: boduch@poland.com

Moja strona www: http://www.programowanie.of.pl


Adam Boduch




Wyszukiwarka