Lekcja 1
Witam moje drogie dzieci :). Na pierwszej lekcji zapoznamy sie z interfejsem programu:
Zazwyczaj kursy rozpoczynają się od pierwszej aplikacji o treści "Hello Word", my nie będziemy gorsi.
Pierwszy program
1. Utwórz nową aplikację, wybierając z menu File---->New Application
2. Na formę wstaw przycisk (z zakładki Standard) i umieść go w dowolnym miejscu
3. Kliknij dwukrotnie na przycisk i pomiędzy słowami begin i end wpisz:
ShowMessage('Hello Word');
4. Kliknij na zielony trójkąt (przycisk uruchomienia)
Jeżeli wszystko zrobiłeś jak należy twoim oczom ukaże sie skąpilowany program.
Od teraz moĹźesz cieszyc sie pierwszą aplikacją napisaną w pascalu :)
<<<|ciekawostka|>>>
W zakładce properties, właściwości caption możemy zmieniać nazwy formy jak i komponętów.
Lekcja 2
W lekcji drugiej dowiemy się jak zakończyć działanie aplikacji.
1. Na formę wstawiamy przycisk (zupełnie tak samo jak na poprzedniej lekcji).
2. Własciwość caption zmieniamy na: "Zamknij program".
3. Przydatną własciwością jest HINT czyli komentarz
Wpiszmy np. Zakończ
4. Aby komentarz zadziałał musimy go uaktywnić wlaściwością Show Hint wpisując True
5. Czas na kod, klikając dwukrotnie na przycisk miedzy słowami begin a end wpisujemy:
close;
Możemy jeszcze bardziej upiększyc program dodając "MessageBox"
MessageBox jest to funkcja slużąca do wyświetlania okien dialogowych. W porownaniu do ShowMessage która wyśiwetla tylko przycisk OK, MessageBox potrafi wyświetlić różne przyciski, innym nagłówkiem i z ikonami. Jest to lepsza metoda niż tworzenie nowej formy. Oto przykład użycia MessageBox:
MessageBox(Handle,'Napis','Tytul',MB_OKCANCEL + MB_IconExclamation);
Hmmm a co to jest? Już tłumacze :)
Pierwszy parametr to uchwyt okna, drugi to napis w oknie, trzeci nagłówek okna. Ostatni parametr to tzw. Flagi-określa jakie mają zostać wyświetlone przyciski i ikona jaka ma zostać wyświetlona(oddzielone znakiem + )Możliwe parametry to:
Parametr |
Wyświetlane przyciski |
MB_AbortRetry |
Przerwij, Ponów próbę, Ignoruj |
MB_OK |
OK |
MB_OKCancel |
OK, Anuluj |
MB_RetryCancel |
Ponów próbę, Anuluj |
MB_YesNo |
Tak, Nie |
MB_YesNoCancel |
Tak, Nie, Anuluj |
Parametr |
Wyświetlane ikony |
MB_IconExclamation |
Ikona ze znakiem ! |
MB_IconQuestion |
Ikona ze znakiem ? |
MB_IconStop |
Ikona ze znakiem X |
Jak widać angielski czasami się przydaje :)
Lekcja 3
Na tej lekcji pobawimy się zegarem i datą. Zapowiada się fajnie prawda?
Zaczynamy!!!
1. Na formę wstaw komponent Timer(System).
2. Następnie daj Label(Standard).
3. Sprawdzamy czy komponent Timer ma ustawioną właściwość Enabled na True
oraz czy właściwosc Interval równa się 1000.
W events do zdarzenia Onclick dopisujemy:
label1.caption:=Timetostr(Time); //Program pobiera godzinę z systemu
Czas zająć się datą.
Dopisujemy to do poprzedniego kodu
label2.Caption:=datetostr(date); //Program pobiera date z systemu
Data oraz godzina powinna wyświetlić się na labelach
Zapomniałem o komętarzach czyli o "//"
Możemy dopisać do kodu jeśli chcemy opisać jakąś funkcje, komentarz nie jest czytamy przez program
oczywiście jeśli zawiera //
Lekcja 4
Myślę, że czas na zabawę z kolorami :) no to jedziem.
Większość komponentów (np. tło na panelu i etykiecie), a także forma programu posiadają właściwość Color. Właściwość tę można ustawiać w edytorze kolorów w oknie ObjectInspector dla komponentu; można ją również zmieniać w oknie modułu, podstawiając pod nią jedną z wartości stałych, które reprezentują kolor.
1. Utwórz aplikację, która będzie zmieniać kolor formy. Umieść w oknie programu dwa przyciski. Pierwszy z nich będzie zmieniał kolor na niebieski, a drugi na biały.
Dla pierwszego przycisku dodaj instrukcję
Form1.Color:=ClBlue;
Dla drugiego:
Form1.Color:=ClWhite;
Myślę, że wiadomo co oznacza white i blue
Blue-niebieski
White-biały
Tak wygląda całość
Lekcja 5
Zacznijmy od prostego edytora tekstu.
1.Na formę wrzuć komponent MainMenu z zakładki Standard.
2. W polu Caption okna ObjectInspector wprowadź odpowiednie dane:
Plik--->Nowy a niżej Zakończ.
3. Wstaw jeszcze komponent Memo.
4. Dla Nowy wpisz:
Memo1.clear;
5. Dla Zakończ
close;
Można dodać Messagebox jak w lekcji 2.
Lekcja 6
Stworzymy bardziej zaawansowany edytor :)).
1. Wstaw komponety:
TMemo (Standard)
4x TSpeedButton (Additional)
TPanel (Standard)
TOpenDialog (Dialogs)
TSaveDialog (Dialogs)
TColorDialog (Dialogs)
TFontDialog (Dialogs)
Zaczynamy!!
Na TPanel połóż 4 SpeedButtony.
SpeedButton1 - Otwieranie pliku
a oto kod
if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);//jesli wcisniesz przycisk nastapi zaladowanie zawartosci pliku
SpeedButton2 - Zapisywanie pliku
if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.FileName);//jesli wcisniesz to zawartosc memo zapisze sie do pliku
SpeedButton3 - Zmiana czcionki
if FontDialog1.Execute then Memo1.Font:=FontDialog1.Font;
Działania chyba nie musze tłumaczyć :)
SpeedButton4 - Zamiana koloru tła
if ColorDialog1.Execute then Memo1.Color:=ColorDialog1.Color;//zmienia kolor w komponentu
To by było na tyle. Oczywiście to nie oznacza, że nie możecie sami czegoś wymyślić. :)
Teraz tylko wystarczy poukładać wszystko żeby miało ręce i nogi.
Dla ułatwienia podam cały kod:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
FontDialog1: TFontDialog;
ColorDialog1: TColorDialog;
PrintDialog1: TPrintDialog;
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
implementation
{$R *.dfm}
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
if FontDialog1.Execute then
Memo1.Font:=FontDialog1.Font;
end;
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
if ColorDialog1.Execute then
Memo1.Color:=ColorDialog1.Color;
end;
end.
Powiedzmy co nieco o właściwościach:
DefaultExt - domyślne rozszerzenie. Z takim rozszerzeniem będą otwierane/zapisywane pliki. Oczywiście, jeśli użytkownik go nie zmieni...
Filter - bardzo fajna rzecz. :) Tutaj przechowujemy wszystkie rozszerzenia i ich opisy rozpoznawane przez nasz program.
Np. otwórz choćby głupiego notatnika. Wybierz opcję: Zapisz jako. Otworzy Ci się okienko SaveDialog. Będziesz na dole miał:
Zapisz jako typ" i tam plik tekstowy, a poniżej wszystkie pliki.
To robimy właśnie w Filter. W następujący sposób:
Plik tekstowy (*.txt)|*.txt|Wszystkie pliki(*.*)|*.*
Filter Name |Filter
------------------------
Plik txt (*.txt) |*.txt
W pierwszej kolumnie mamy to, co widzi użytkownik w liście wyboru. Druga natomiast mówi programowi, jakiego typu pliki mają być pokazane (lub jako jaki typ ma zapisać).
FilterIndex - LICZONY OD 1. Gdy mamy kilka filtrów, to to oznacza, który ma być "aktywny" A także zwraca index wybranego filtra. Pamiętajcie, że liczony jest od 1.
InitialDir - katalog, który będziemy widzieli po wykonaniu metody Execute. Czyli taki jakby katalog startujący. Np. w Notatniku jest to katalog: Moje Dokumenty.
Options - tutaj się przyjrzyjmy trochę bliżej:
ofReadOnly - tylko do odczytu,
ofOverwritePrompt - gdy próbujemy zapisać plik o nazwie pliku już istniejącego, to gdy ta opcja jest ustawiona na True, to program najpierw wyświetli okienko z pytaniem, czy na pewno chcemy nadpisać plik.
Jeśli opcja jest ustawiona na False, to program bez pytania go nadpisze...
ofHideReadOnly - ukrywa pliki tylko do odczytu,
ofNoChangeDir - gdy opcja jest na True, to wtedy gdy wybierzemy jakiś plik,
a po jakimś czasie chcemy kolejny, to wtedy open/saveDialog otworzy nam się w folderze, w którym wybraliśmy ostatni plik.
ofShowHelp - pokazuje przycisk pomocy,
ofAllowMultiSelect - można wybierać więcej niż jeden plik, jeśli opcja jest na TRUE,
ofForceShowHidden - pokazuje ukryte pliki.
Więcej opcji nie ma sensu przedstawiać, bo albo nazwy mówią same za siebie, albo należy samemu trochę pokombinować. :) To były te najważniejsze i najczęściej używane.
Title - tytuł okienka, np: "Wybierz plik do odczytu", lub "Zapisz se plika" Pojawi się ten tytuł w okienku dialogowym.
Lekcja 7
No to czas na zmienne :). Kto zetknął sie z jakimś językiem programowania takim jak np. rodzina jezykow C na pewno mial do czynienia z deklaracją zmiennych.
Zakładam, że to twój pierwszy raz a wiec wytłumacze na czym to wszystko polega.
Zmienne
Zmienne to miejsce w pamięci, które przechowuje jakąś wartość ( tekst, znaki, cyfry ). Zmienne deklaruje się przy użyciu słowa var. Po tym słowie możesz napisać swoją zmienną. Oto przykład deklaracji zmiennej typu Integer, czyli takiej, która przechowuje wartości liczbowe:
var
MojaZmienna : Integer;
Zmienne możesz deklarować w dowolnym miejscu programu poza blokiem begin..end. Po lewej stronie piszesz unikalną nazwę zmiennej, a po znaku dwukropka wpisujesz typ zmiennej. Typów tych jest duzo więcej. Np. typ. który przechowuje tekst to typ String. Oto deklaracja kilku zmiennych:
var
Liczba : Integer;
Tekst : String;
Możesz zadeklarować kilka zmiennych danego typu - np:
var
I, Z, Y : Integer;
Albo:
var
I : Integer;
Z : Integer;
Y : Integer;
Oczywiącie to nie wszystko. Musisz bowiem przypisać tej zmiennej jakąś wartość, prawda? Robi się to w bloku begin..end i dokonuje się to za pomocą operatora := Oto przykład wypełnienia zmiennej.
procedure MojaProcedura;
var
I : Integer;
begin
I := 29;
end;
W tym momencie nastąpiło do zmiennej I przypisanie wartości liczbowej, a konkretnie cyfry 29. Jeżeli chcesz do zmiennej przypisać tekst to robisz to za pomocą znaków ' i '. Np:
procedure MojaProcedura;
var
I : Integer;
S : String;
begin
I := 29;
S := 'Jakią tam tekst';
end;
Każda zmienna ma swoje ograniczenia:
Integer -2147483648..2147483647
Cardinal -0..4294967295
Shortint -128..127
Smallint -32768..32767
Longint -2147483648..2147483647
Int64 -2^63..2^631
Byte 0..255
Word 0..65535
Longword 0..4294967295
Jak więc widzisz chyba nie będziesz miał problemów z za małym zakresem zmiennej? :) Pewnie sobie myślisz: "A co mi tam, zawsze będę używał zmiennej typu Int64 bo ma największy zakres". Tak, ale też najwięcej zajmuje w pamięci komputera. Typ Integer zamuje 8 bajtów, a typ Int64 już 10 bajtów. Myślisz sobie, że to nie dużo, ale jeżeli masz kilkadziesiąt zmiennych???. Czy przy małych obliczeniach nie lepiej używać typu Byte, który zajmuje jedynie 1 bajt???
Na następnej lekcji omówie funkcje i procedury :).
Lekcja 8
Na ósmej lekcji pokaże jak deklarować procedury. Nie jest to trudne ponieważ my używamy Delphi,
w którym wystarczy dać komponent na forme a po kliknięciu procedura zostaje utworzona. No dobra teraz teaoria.
Procedury
Procedury to wydzielony blok kodu, który wykonuje określoną czynność. Procedury deklaruje się za pomocą kluczowego słowa - procedure. Oto przykłady:
interface
procedure MojaProcedura;
procedure Moja2Procedura;
implementation
procedure MojaProcedura;
begin
{ tresc procedury }
end;
procedure Moja2Procedura;
begin
{ tresc procedury }
end;
Nagłówki, czyli tzw. deklarację procedur wpisuje się w sekcji Interface. Definicję procedurę, czyli jej treść wpisujesz natomiast w sekcji Implementation. Treść procedury wpisuje się pomiędzy słowami begin i end. Jak wspomniałem na początku procedury nie są nam potrzebne jeśli wstawiamy komponenty. Pomyślisz pewnie po co on pisze o tych procedurach :). Otoż używamy procedur to pisania modułów ale o tym pózniej :). Jeśli używasz kompilatora zwanego free pascal kod nie zostaje ci wygenerowany, wszystko piszesz sam.
Lekcja 9
Były procedury to teraz funkcje:
Funkcje
Funkcja różni się tym od procedury, że zwraca rezultad operacji. W sekcji Interface dodaj deklarację funkcji:
function DoKwadratu(Liczba: Integer) : Integer;
Funkcję deklaruje się za pomocą słowa kluczowego function. Następnie następuje nazwa funkcji. Tak, tak, Ty także możesz w nawiasie podawać parametry, które będą wymagane przy uruchamianiu funkcji. Na samym końcu deklaracji wpisywany jest rezultad wykonanej operacji w postaci zmiennej typu Integer. Teraz w sekcji Implementation wpisz definicję funkcji:
function DoKwadratu(Liczba: Integer) : Integer;
begin
Result := Liczba * Liczba;
end;
W funkcjach możliwe jest do wykorzystania słowo kluczowe Result. Oznacza ono rezultad wykonanej operacji. W tym wypadku rezultatem jest przemnożenie zmiennej Liczba. Teraz możesz wykorzystać te funkcje:
DoKwadratu(2); // da rezultad w postaci cyfry 4
Wywoływna zostaje funkcja, w której jako parametr podawany zostaje cyfra 2. No dobrze, ale jak wyświetlić wynik wykonanej operacji??? Możesz wyświetlić ten wynik w postaci okienka - słuzy do tego polecenie ShowMessage. Oto przykład:
ShowMessage(DoKwadratu(2));
Spróbuj skompilować ten przykład. Aaaa, nie da się? :) Tak, kompilator wyświetli błąd:
[Error] Unit1.pas(36): Incompatible types: 'String' and 'Integer'
Oznacza to niekompatybilny typ. Otóż parametrem polecenia ShowMessage jest parametr w postaci zmiennej typu String - np: ShowMessage('Oto okienko, które się teraz pojawi');
Natomiast funkcja "DoKwadratu" zwraca rezultat w postaci zmiennej typu Integer. Innymi słowy kompilator nie może odpowiednio skonwertowac tych dwóch typów. Na szczęści z pomocą przychodzi polecenie IntToStr. Tak więc, aby przykład się prawidłowo skompilował musisz zrobić coś takiego: ( cały kod powinien wyglądać tak: )
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function DoKwadratu(Liczba: Integer) : Integer;
implementation
{$R *.DFM}
function DoKwadratu(Liczba: Integer) : Integer;
begin
Result := Liczba * Liczba;
end; procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(DoKwadratu(2)));
end;
Za dużo zamieszania prawda? No ale nikt nie mówił, że będzie łatwo. Na razie nie będziemy sie tym bawić.
Kto chce może się zainteresować glębiej, gdyż jest troche stron z kursami :). Ja powracam niedlugo kiedy znajde czas na dokonczenie.