Special Edition

Ćwiczenia praktyczne z programowania w Delphi

CZĘŚĆ I : Podstawy tworzenia aplikacji

Ćwiczenie 1

1.Wybierz z menu File -> New Application(tworzenie nowej aplikacji) i obejrzyj narzędzia do tworzenia aplikacji:
* okno Object Inspector i jego karty : Properties - właściwości komponentu i Events - zdarzenia związane z komponentem
* umieszczone na pasku narzędziowym karty : Standard, Additional,Win32 itd
* komponenty karty Standard
2.Klikając myszą element z paska narzędziowego i rysując na formatce jego żądane wymiary narysuj na nowej formatce etykietę (Label) i przycisk(Button)
3.Wyselekcjonuj etykietę i obejrzyj okno Object Inspector dla etykiety. To samo zrób w przypadku przycisku.Czy właściwości i zdarzenia dla przycisku są takie same jak dal etykiety?
4.Zwróć uwagę na właściwości Name i Caption komponentów. Dla etykiety wpisz w polu właściwości Caption słowo Etykieta. Zaobserwuj zmiany na etykiecie
5.Posługując się myszką , przesuń przycisk w inne miejsce i powiększ jego rozmiary. Zaobserwuj zmiany we właściwościach Left, Top , Width
6.Zmień napis na przycisku na Komunikat ustawiając właściwość Caption w oknie Object Inspector

Ćwiczenie 2

1.Wybierając z menu File -> New -> Application utwórz nową aplikację
2.Na formatce wstaw przycisk z napisem Komunikat
3.Przypisz do przycisku procedurę - zdarzenie, wykonując następujące czynności:
* wybierz kartę Events w oknie Object Inspector
* wybierz zdarzenie OnClick
* przejdź do edycji procedury (klikając podwójnie w polu edycji zdarzenia OnClick lub klikając dwukrotnie przycisk)
* wpisz między begin a end treść:
ShowMessage('To komunikat') // wywołanie procedury wyświetlającej okno komunikatu
4.Zapisz projekt wybierając z menu File -> Save All
* wybierz ikonę tworzenia folderu i nadaj jej nazwę
* przejdź do folderu i klikając przycisk Zapisz zapisz moduł Unit1.pas i projekt Projekt1.dpr. Zapisywanym plikom możesz nadać wybrane przez siebie nazwy.
5.Uruchom projekt (przycisk Run lub z menu Run -> Run) i sprawdź działanie przycisku Komunikat
6.Przejdź do edycji (zamknięcie okna z aplikacją) i dodaj na formatkę nowy przycisk - jego zadaniem będzie zamknięcie formatki:
* zmień napis na przycisku na Zamknij ustawiając właściwość Caption w oknie Object Inspector
* dla zdarzenia OnClick przycisku wpisz treść procedury :
Close; //zamknięcie aktywnego okna
Wciśnięcie przycisku spowoduje wyjście z aplikacji
7.Obejrzyj wszystkie elementy projektu, przejdź do modułu (Unit1.pas) i sprawdź jakie fragmenty kodu powstały tam w wyniku twoich działań
8.Zapisz plik aplikacji wybierając z menu File -> Save All

Ćwiczenie 3

1.Otwórz dowolny katalog z aplikacją Delphi i sprawdź jakie pliki tam występują .Zwróć uwagę na rozszerzenia plików oraz na pliki o takich samych nazwach różniące się od siebie rozszerzeniem
2.Sprawdź zawartość pliku o rozszerzeniu *.dpr, *.pas
3.Obejrzyj w Notatniku zawartość plików *.dfm, *.dof
AAQAplikacja tworzona w Delphi składa się z następujących elementów: * moduł z opisami procedur: Unit1.pas
* projekt - Project1.dpr - jest to główny plik programu zawierający spis wszystkich formularzy aplikacji oraz kod inicjujący
* plik z rozszerzeniem *.dfm, nazwa taka jak nazwa modułu - jest to graficzny plik formularza
* plik z rozszerzeniem *.dof, nazwa taka jak nazwa pliku projektu : Project1.dof - jest to plik tekstowy, zawierający ustawienia opcji kompilatora, parametry programu itp.
* plik z rozszerzeniem *.dsk, nazwa taka sama jak plik projektu : Project1.dsk - jest to plik ustawień środowiska (Enviromment Option) ) * plik z rozszerzeniem *.res - plik zasobów graficznych zawierający ikony, przyciski rysunkowe itp.
* pliki z tyldą w rozszerzeniu : *.~* - są to pliki zapasowe
* pliki powstałe po kompilacji:
- *.exe - plik wykonywalny
- *.dcu - plik skompilowanego modułu

Ćwiczenie 4

1.Otwórz poprzednią aplikację. Wybierz z menu : Project -> Options -> Application LoadIcon
2.Wybierz dowolną ikonę z folderu : C: \ Progam Files \ Common Files \ Borland Shared \Images \ Icons
3.Uruchom aplikację - zostanie utworzony plik .exe
4.Zapisz aplikację pod wskazaną nazwą i zamknij okno aplikacji
5.Przejdź na Pulpit i utwórz skrót do aplikacji
6.Sprawdź efekty pracy - wybrana ikona reprezentuje utworzony plik

Ćwiczenie 5

Aplikacja zawiera własne menu o opcjach Plik (podopcje Nowy, Zapisz ,Zamknij) oraz Edycja (podopcje Wypisz, Kasuj) a także procedury obsługujące opcje menu:
* działanie opcji menu Plik:
- wybór opcji Plik -> Nowy oraz Plik -> Zapisz powoduje wyświetlenie okna komunikatu z nazwą opcji
- wybór opcji Plik -> Zamknij zamyka formatkę
* działanie opcji menu Edycja:
- Edycja -> Wypisz na etykiecie pokazuje się napis Powodzenia
- Edycja -> Kasuj napis na etykiecie jest kasowany
1.Na formatce wstaw komponenty Label i MainMenu z karty Standard
2.Przez podwójne kliknięcie komponentu MainMenu przejdź do edycji menu
3.Utwórz menu dla aplikacji, uzupełniając właściwości Caption odpowiedniej pozycji menu
4.Wybierając z karty Events odpowiednią opcję przejdź do edycji procedur:
* treść procedury dla grupy Plik: ShowMessage('Wybrałeś Schowaj') // tu odpowiedni komunikat
* treść procedury dla grupy Edycja:
- dla Wypisz: Label1.Caption := 'Powodzenia'
- dla Kasuj : Label1.Caption := '' // dwa pojedyncze apostrofy

Ćwiczenie 6

1.Wprowadź poprzednią aplikację. Wyselekcjonuj menu, podwójnym kliknięciem wejdź do edycji opcji i dodaj dla opcji głównych znak &:
- przed literą l dla opcji Plik
- przed literą E dla opcji Edycja
Opcje główne można będzie wywoływać kombinacją klawiszy Alt + l, Alt + e
2.Dla opcji podrzędnych wybierz gorące klawisze poprzez ustawienie właściwości ShortCut
* klikając w polu właściwości ShortCut otwórz listę wyboru
* wybierz z listy gorące klawisze

Ćwiczenie 7

1.Umieść na formatce komponent ImageList z karty Win32. Dwukrotnym kliknięciem przejdź do okna wyboru obrazka
* wciskając przycisk Add przejdź do okna wyboru obrazka
* przejdź do folderu C: \ Program Files \ Common Files \ Borland Shared \ Images \ Buttons i dodawaj do serii obrazków takie, które zamierzasz umieścić przy opcjach menu
* wybór zatwierdzaj klawiszem Otwórz, w oknie komunikatu wybierz przycisk No - na znak ,że nie chcesz, aby obrazek został podzielony na dwa mniejsze
* w oknie wyboru obrazka zaznacz przycisk Crop - nakładanie obrazków
* zakończ klawiszem OK
2.Wyselekcjonuj menu, dla właściwości Images wybierz z listy ImageList1
3.Klikając w polu właściwości Items przejdź do edycji opcji menu:
* kolejno selekcjonuj opcje menu
* z listy wyboru w polu ImageIndex wybieraj odpowiednią ikonę dla każdej opcji

Ćwiczenie 8

Aplikacja zawiera menu podręczne z opcjami Zamknij, Powiększ, Zmniejsz przypisane do formatki
* Zamknij - zamyka formatkę
* Powiększ i Zmniejsz - odpowiednio zwiększa i zmniejsza formatkę
1.Wybierz komponent PopupMenu i dwukrotnie klikając tworzymy menu podręczne dla formularza, wpisując kolejno we właściwościach Caption : zamknij, Powiększ, Zmniejsz
2.Przejdź do właściwości formatki (wybierz z listy Form1:TForm w oknie Object Inspector lub wybierz formatkę klikając na jej obszarze). Dla właściwości PopupMenu wybierz z listy wyboru PopupMenu1 (nazwę utworzonego menu podręcznego)
3.Uzupełnij procedury-zdarzenia dla menu. Treścią procedur związanych z opcjami Powiększ i Zmniejsz będzie ustawienie właściwości dotyczących rozmiaru formularza, na przykład:
Form1.Height := 50;
Form1.Width := 50;
4.Uruchom aplikację i sprawdź reakcję na kliknięcie prawym klawiszem myszki w obszarze formularza

Ćwiczenie 9

Aplikacja zawiera przycisk i etykietę oraz menu podręczne dla formularza a opcjami Przycisk, Etykieta, Zamknij. Wybór odpowiedniej opcji powoduje wyświetlenie wskazanego komponentu i schowanie drugiego. Opcja Zamknij , zamyka aplikację
1.Umieść na formatce przycisk i etykietę
2.Utwórz dla formatki menu podręczne o opcjach wskazanych powyżej
3.Przypisz do opcji Przycisk procedurę o treści:
Button1.Visible := True;
Label1.Visible := False;
4.Do opcji Etykieta przypisz procedurę ustawiającą odwrotnie widoczność komponentów
5.Sprawdź działanie aplikacji

Ćwiczenie 10

Dodanie do powyższej aplikacji przycisku Zamknij i przycisku w chmurce Wyjście z aplikacji
1.Dodajemy przycisk zamknij i przypisujemy do jego procedury OnClick :
Close;
2.W oknie Object Inspector wypełnij dla przycisku właściwość Hint, wpisując tekst Wyjście z aplikacji
3.Ustaw właściwości ShowHint na True
4.Sprawdź działanie aplikacji.

Ćwiczenie 11

Aplikacja wczytuje przez pola Edit nazwę towaru oraz jego cenę. Po wciśnięciu przycisku polecenia wyświetla na etykietach tę nazwę oraz cenę powiększoną o 23% Vat
1.Na formatce wstaw dwa komponenty Edit z karty Standard, dwa przyciski i etykiety do wyświetlania wyników
2.Dodaj etykiety do opisu pól edycji oraz wyświetlanych wyników
3.Dla zdarzenia OnClick przycisku Cena z VAT wpisz treść procedury
procedure TForm1.Button1Click(Sender:TObject);
var
Cena,Cena_z_VAT :Currency;
begin
// wczytywanie łańcucha przez pole Edit
Label1.Caption:= Edit1.Text;
// wczytywanie liczby
Cena := StrToCurr(Edit2.Text);
// operacja na liczbie
Cena_z_VAT:= Cena + Cena * 0.23
// wyświetlenie liczby
Lable2.Caption := CurrToStr(Cena_z_VAT);
end;
4.Uruchom aplikację i sprawdź jej działanie

Ćwiczenie 12

1.Umieść na formatce przycisk, dwie etykiety i pole Edit
2.Przypisz do przycisku procedurę:
procedure TForm1.Buton1Click(Sender:TObject);
var
x:Real;
begin
x := StrToFloat(Edit1.Text);
Label1.Caption := 'ffFixed: ' + FloatToStrF(x,ffFixed,18,2);
Label2.Caption := 'ffVCurrency: ' + FloatToStrF(x,ffCurrency,18,2);
end;
4.Uruchom aplikację, wpisując w polu Edit liczby, sprawdź sposoby ich wyświetlania

Ćwiczenie 13

1.Na formatce wstaw etykietę i komponent ListBox
2.We właściwościach ListBox kliknij dwukrotnie w polu właściwości Items. Otworzy się edytor elementów listy - String List Editor
* wypełnij kolejne wiersze nazwami kolorów : Czerwony, Żółty, Zielony. Będą to elementy listy wyboru
* zatwierdź wpisane wartości przyciskiem OK
3.Dla zdarzenia OnClick komponentu ListBox wpisz procedurę:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
Case ListBox1.ItemIndex of // indeks elementu wybranego z listy
0:Label1.Color:= clRed;
1:Label1.Color:= clYellow;
2:Label1.Color:= clGreen;
end;
Label1.Caption:= ListBox1.Items.Strings[ListBox1.ItemIndex]
end;
4.Uruchom aplikację i sprawdź efekty działania

Ćwiczenie 14

1.Na formatce wstaw komponenty Label i ComboBox
2.Uzupełnij w edytorze właściwości Items elementy wyboru :Ania, Basia, Ela
3.Dla zdarzeniaOnChange komponentu ComboBox wpisz treść procedury:
procedure TForm1.ComboBox1.Change(Sender: TObject);
begin
Label1.Caption := ComboBox1.Text
end;
4.Przekopiuj treść procedury OnChange do procedury OnKeyDown
5.Sprawdź działanie listy
6.Wypróbuj możliwości edycji w pustym oknie

Ćwiczenie 15

1.Na formatce umieść ColorBox z karty Standard
2.Dwukrotnym kliknięciem przejdź do edycji procedury i wpisz treść:
procedure TForm1.ColorBox1Change(Sender:TObject);
begin
Form1.Color := ColorBox1.Selected
end;
3.Uruchom aplikację. Zapisz na kartce w jakiej kolejności występują kolory w liście
4.Ponownie przejdź do projektu. Dla zdarzenia OnCreate formularza przypisz procedurę nadającą polskie nazwy elementom listy:
procedure TForm1.FormCreate(Sender : TObject);
begin
ColorBox1.Items.Strings[0] := 'Czarny'
ColorBox1.Items.Strings[1] := 'Mahoń'
// wpisz w analogiczny sposób nazwy wszystkich kolorów zmieniając nazwę koloru i indeks tablicy
end;
5.Wypróbuj działanie aplikacji

Ćwiczenie 16

1.Umieść na formatce dwa komponenty GroupBox z karty Standard i nadaj im taki rozmiar by mogły pomieścić inne komponenty
2.Wewnątrz kontenerów GroupBox umieść po trzy przyciski opcji CheckBox. Pamiętaj o tym , aby pierwszym położeniem przycisków opcji był kontener i aby były w nim od początku całkowicie zanurzone
3.Spróbuj przemieścić przyciski opcji poza obszar kontenera, czy jest to możliwe?
4.Przemieść cały kontener w inne miejsce - zauważ ,że jego zawartość jest taka sama
5.Uruchom aplikację i spróbuj zaznaczyć dwa przyciski w obrębie jednej grupy. Czy jest to możliwe? Sprawdź ,że w obrębie różnych grup przyciski działają niezależnie

Ćwiczenie 17

1.Na formatce umieść komponenty Panel i GropuBox z karty Standard
2.Dodaj trzy przycsiki typu RadioButton, umieszczając je wewnątrz komponentu GroupBox
3.Ustaw właściwość Caption przycisków RadioButton odpowiednio na :Czerwony, Zielony, Niebieski
4.Dla zdarzenia OnClick przycisku z napisem Zielony przypisz procedurę :
procedure TForm1.RadioButton2Click(Sender : TObject);
begin
if RadioButton2.Checked then Panel.Color:= clGreen; //sprawdzenie czy przycisk jest wciśnięty
end;
5.Podobnie postępuj w przypadku pozostałych przycisków, zmieniając stałe kolorów
6.Dla przycisku z napisem Czerwony, ustaw właściwości Checked na True
7.Aby od początku działania aplikacji zsynchronizować ustawienie przycisków z kolorem panelu, wpisz dla zdarzenia OnActivate dla formularza treść procedury:
procedure TForm1.FormActivate(Sender :TObject);
begin
Panel1.Color := clRed;
end.
8.Sprawdź działanie aplikacji

Ćwiczenie 18

Aplikacja zawiera pole RichEdit i grupę opcji opisanych nazwami kolorów. Przyciskami opcji wybieramy kolor czcionki w oknie RichEdit. Nazwy wybranych kolorów odbierane są na etykiecie
1.Na formatce umieść etykietę oraz komponenty : RadioGroup z karty Standard i RichEdit z karty Win32
2.Wyselekcjonuj komponent RadioGroup i ustaw jego właściwości:
* Caption - Kolor czcionki // tytuł grupy opcji
* Columns - 2 // liczba kolumn z przyciskami w oknie RadioGroup
* ItemIndex - 0 // numer zaznaczonego przycisku przy wejściu do formatki
* Items // przez podójne kliknięcie w polu właściwości Items wejdź do edytora StringList Editor i w kolejnych wierszach wpisz napisy pokazujące się przy przyciskach: Czerwony,Zielony,Niebieski, Żółty
3.Dla zdarzenia OnClick komponentu RadioGroup wpisz procedurę:
procedure TForm1.RadioGroup1.Click(Sender: TObject);
begin
Case RadioGroup1.ItemIndex of
0:RichEdit1.Font.Color : = clRed; // ustawianie koloru czcionki w polu RichEdit
0:RichEdit1.Font.Color : = clGreen;
0:RichEdit1.Font.Color : = clBlue;
0:RichEdit1.Font.Color : = clYellow;
end;
Label1.Caption := RadioGroup1.Items[RadioGroup1.ItemIndex];
end;
4.Aby od początku działania aplikacji zsynchronizować ustawienia przycisków z kolorem wyświetlanej czcionki, uzupełnij procedurę FormActive. Do edycji procedury wchodzimy przez kartę Events klikając w polu właściwości OnActivate. Treść procedury :
procedure TForm1.FormActivate(Sender: TObject); begin RichEdit1.Font.Color : clRed; // ustawienie koloru czcionki w polu RichEdit
Label1.Caption := RadioGroup1.Items[RadioGroup1.ItemIndex];
end;
5.Uruchom aplikację. Wpisując tekst w oknie RichEdit sprawdź kolory czcionki dla wybranej opcji

Ćwiczenie 19

1.Na formatce umieść dwa komponenty RadioGroup z karty Standard oraz przycisk polecenia
2.Wybierz pierwszy komponent RadioGroup i ustaw jego właściwości:
* Caption - Rozmiar zeszytu // tytuł grupy opcji
* ItemIndex - 0 //numer zaznaczonego przycisku przy wejściu do formularza
* Items // prez dwukrotne kliknięcie w polu właściwości Items wejdź do edytora i wpisz w kolejnych wierszach : A3, A4.
3.Dla drugiego komponentu RadioGroup ustaw właściwości:
* Caption - Rodzaj okładki
* ItemsIndex - 0 * Items - wpisz : twarda, miękka
4.Dla zdarzenia OnClick przycisku polecenia wpisz procedurę:
procedure TForm1.Button1Click(Sender :TObject); var
cena: Currency;
begin
//wybór rozmiaru zeszytu
Case RadioGroup1.ItmeIndex of
0: // wybór rodzaju okładki dla rozmiaru A3
Case RadioGroup2.ItemIndex of
0:cena :=3.20
1:cena := 2.0
end; 1: // wybór rodzaju okładki dla rozmiaru A4
Case RadioGroup2.ItemIndex of
0:cena := 2.30;
1:cena := 1.8
end;
end;
ShowMessage('Cena zeszytu: ' + CurrToStr(Cena));
end;
5.Sprawdź działanie aplikacji dla różnych ustawień przycisków opcji

Ćwiczenie 20

Zestaw komputerowy składa się z wersji podstawowej w cenie 2000 PLN oraz wyposażenia dodatkowego karta muzyczna (180 PLN), nagrywarka DVD (220 PLN), modem (50 PLN). Aplikacja zawiera przyciski wyboru do wyboru wyposażenia dodatkowego oraz przycisk polecenia Wyświetl cenę. Po jego naciśnięciu na etykiecie wyświetlana jest cena ostateczna
1.Na formatce umieść etykietę i GroupBox z trzema przyciskami CheckBox. Uzupełnij we właściwości Caption napisy przy przyciskach :Karta muzyczna, Nagrywarka, Modem.
2.Dodaj przycisk polecenie z napisem Wyświetl cenę i przypisz procedurę ustalającą cenę zestawu:
procedure TForm1.Button1Click(Sender:TObject)
var
Cena:Currency;
begin
if CheckBox1.Checked then cena := cena + 180;
if CheckBox2.Checked then cena := cena + 220;
if CheckBox3.Checked then cena := cena + 50;
Label1.Caption := CurrToStr(Cena);
end;
Zwróć uwagę na budowę procedury. Przyciski obsługiwane są oddzielnymi instrukcjami warunkowymi, gdyż pola opcji mogą działać niezależnie. Każda następna instrukcja w przypadku zaznaczenia przycisku zwiększa cenę zestawu dodając do tego, co naliczono cenę nowego składnika
3.Uruchom aplikację i sprawdź działanie wybierając różne zestawienia wyposażenia dodatkowego

Ćwiczenie 21

1.Na formatce wstaw komponenty Panel, GroupBox oraz trzy przyciski CheckBox umieszczając je wewnątrz GroupBox
2.Zmień właściwość Caption dla przycisków CheckBox na :Czerwony, Zielony, Niebieski
3.Ustaw właściwość Caption dla GroupBox na Składowe RGB, dla komponentu Panel na Kolor wynikowy
4.Dla zdarzenia OnClick komponentu Panel wpisz procedurę:
procedure TForm1.Panel1Click(Sender:TObject)
var
r,g,b : Byte;
begin
if CheckBox1.Checked then r := 255;
if CheckBox2.Checked then g := 255;
if CheckBox3.Checked then b := 255;
Panel1.Color := RGB(r,g,b);
end;
5.Sprawdź działanie aplikacji

Ćwiczenie 22

1.Na formatce umieść komponent RichEdit i GroupBox z czterema przyciskami CheckBox
2.We właściwości Caption dla GroupBox wpisz Styl czcionki
3.Dla komponentów CheckBox ustaw właściwości Caption: Pogrubiony, Kursywa, Podkreślony, Przekreślony
4.Dla zdarzenia OnClick przycisku CheckBox1 wpisz procedurę:
procedure TForm1.CheckBox1Click(Sender:TObject);
begin
// dodawanie do zbioru stylów czcionki stylu fsBold
If CheckBox1.Checked then
RichEdit1.Font.Style := RichEdit1.Font.Style + [fsBold];
else
// usuwanie ze zbioru stylów czcionki stylu fsBold
RichEdit1.Font.Style := RichEdit1.Font.Style - [fsBold];
end;
5.Dla przycisków CheckBox2 ,CheckBox3, CheckBox4 wpisz analogiczne procedury ustawiając style:
fsItalic - kursywa
fsUnderline - podkreślenie
fsStrikeout - przekreślony
6.Sprawdź działanie aplikacji zaznaczając przyciskami wyboru odpowiednie style

Ćwiczenie 23

1.Umieść na formatce etykietę i komponent ScrollBar
2.Dla zdarzenia OnChange komponentu ScrollBar wpisz procedurę:
procedure TForm1.ScrollBar1Change(Sender :TObject);
begin
Label1.Caption := IntToStr(ScrollBar1.Position); // funkcja IntToStr zmienia typ Integer na String
end;
3.Sprawdź działanie aplikacji

Ćwiczenie 24

1.Wstaw na formatce komponent ScrollBar.Nadaj mu rozmiary do przeglądania
2.Na ScrollBar umieść komponent Image i ustaw jego właściwości:
* Align : alClient // Image zajmuje całą powierzchnię komponentu ScrollBox
* Stretch : True // rozciąganie - dopasowanie wielkości obrazka do wielkości Image
* Picture : // kliknij z prawej strony okna właściwości i w oknie wyboru pliku wybierz przyciskiem Load jeden z obrazków. Po wybraniu obrazka naciśnij Otwórz, a następnie OK
3.Uruchom aplikację i sprawdź działanie okna
4.Ustaw dla komponentu Image właściwość
* Align - alNone
Przejdź do komponentu ScrollBar i zmniejsz jego rozmiary tak ,aby pokazały się paski przewijania
5.Uruchom ponownie aplikację i sprawdź możliwości przesuwania oglądanego obrazka.

Ćwiczenie 25

1.Na formatce wstaw pasek przewijania, listę ComobBox oraz komponent Shape w dowolnym kształcie
2.Wypełnij zawartość listy wpisując w edytorze właściwościItems nazwy wyświetlanych figur: Koło, Kwadrat, Zaokrąglony
3.Przypisz do listy procedurę:
procedure
TForm1.ComboBox1Changes(Sender: TObject);
begin
Case Combobox1.ItemIndex of
0:Shape1.Shape := stCircle;
1:Shape1.Shape := stSquare;
2:Shape1.Shape := stRoundSquare;
end;
end;
4.Przypisz do paska przewijania procedurę:
procedure
TForm1.ScrollBar1Change(Sender: TObject);
begin
Shape1.Width := ScrollBar1.Position;
Shape1.Height := ScrollBar1.Position;
end;
5.Sprawdź działanie aplikacji, wybierając z paska wielkość figury i określając listą jej kształt

Ćwiczenie 26

1.Na formatce wstaw komponenty Memo , Toolbar i ImageList
2.Wybierz Toolbar i prawym klawiszem myszki przejdź do menu podręcznego. Wybierz czterokrotnie New Button, w ten sposób dodasz przyciski do paska ToolBar
3.Wybierz ImageList i prawym klawiszem myszki przejdź do menu podręcznego, wybierz ImageListEditor i utwórz listę obrazków na tworzone przyciski narzędziowe:
* wciśnij przycisk Add
* wybierz obrazki, które są symbolami operacji wycinania, wklejania, kopiowania i czyszczenia
* w oknie komunikatu wybierz właściwość No (bez podziału obrazka na dwa mniejsze) i ustaw właściwość Crop
* zatwierdź listę przyciskiem OK
4.Dla komponentu ToolBar ustaw właściwość Images, wybierając z listy ImageList1 (nazwę utworzonej listy obrazków)
5.Do każdego przycisku utwórz podpowiedź (Hint) objaśniającą działanie
6.Sprawdź działanie aplikacji

Ćwiczenie 27

1.Otwórz poprzednią aplikację
2.Dla zdarzenia OnClick przycisków ToolButton wpisz procedury:
* dla przycisku Wytnij:Memo1.CutToClipboard;
* dla przycisku Wklej:Memo1.PasetFromClipboard;
* dla przycisku Kopiuj:Memo1.CopyToClipboard;
* dla przycisku wytnij:Memo1.ClearSelection;
3.Uuruchom aplikację. Wpisz do pola Memo tekst, wybierz fragment i wypróbuj działanie przycisków
4.Utwórz pasek narzędziowy zawierający przyciski symbolizujące opcje otwierania, zapisywania i czyszczenia
5.W zmiennych globalnych dodaj:
const st:String = 'c:\moj.txt'; // stała typowana (literał) zainicjowana nazwą pliku
6.Dla zdarzenia OnClick przycisków ToolButton wpisz treść procedur :
* dla przycisku Czytaj:Memo1.Lines.LoadFromFile(st); // wpisanie do pola Memo zawartości pliku
* dla przycisku Zapisz:Memo1.SaveToFile(st); // zapis do pliku zawartości pola Memo
* dla przycisku Czyść:Memo1.Clear; // wyczyszczenie zawartości pola Memo
7.Sprawdź działanie aplikacji.

Ćwiczenie 28

1.Na formatce umieść komponent Memo oraz komponent PageControl służący do tworzenia stron z zakładkami
2.Utwórz dwie strony notatnika w następujący sposób:
* wybierz PageControl
* uaktywnij menu podręczne
* wybierz NewPage
3.W oknie Object Inspector wybierz kolejno TabSet1, TabSet2 i ustawiaj właściwość Caption zakładek na : Operacje na tekście, Zapis i odczyt.
4.Umieść na stronie pierwszej komponent ToolBar. Ustaw jego właściwość Align na alClient i utwórz przyciski narzędziowe symbolizujące kopiowanie, wycinanie i wklejanie tekstu
5.Na drugiej stronie notatnika utwórz drugi pasek narzędziowy z przyciskami do otwierania i zapisywania do pliku
6.Wpisz procedury obsługi dla przycisków z pasków narzędziowych
7.Wypróbuj działanie aplikacji

Ćwiczenie 29

1.Umieść na formatce komponent PageControl. Nadaj mu wielkość strony
2.Wybierz PageControl i ustaw jego właściwości:
* ScrollOpposit : True // przy wyborze zakładki pokrytej zakładki pokrywające przemieszczają się do dołu
* TabHeight : 20 // wysokość zakładek
* TabPosition : tpTop // położenie zakładek u góry notatnika
* TabWidth : 50 //długość zakładek
3.Utwórz strony notatnika:
* wybierz PageControl
* uaktywnij menu podręczne i wybierając New Page utwórz cztery strony notatnika
4.Zmien napisy na zakładkach na Kwadrat, Prostokąt, Elipsa, Koło. W oknie Object Inspector wybieraj kolejno YTabSet1,TabSet2,TabSet3 i ustawiaj właściwośćCaption zakładek
5.Umieść na stronie pierwszej komponent Shape, kliknij w polu właściwości Shape i wybierz stała symbolizującą kwadrat
6.Powtórz to samo dla kolejnych stron notatnika , umieszczając tam rysunek odpowiedniej figury
7.Sprawdź działanie notatnika
8.Ustaw właściwości ScrollOpposite na False i ponownie sprawdź działanie notatnika: przy wyborze stron zakładki przemieszczają się tak ,aby wszystkie były widoczne

Ćwiczenie 30

1.W nowej aplikacji umieść na formatce komponent StringGrig oraz przycisk z poleceniem Zapis do pliku
2.Ustaw właściwości komponentu StrinGrid
* ColCount - 3 // liczba kolumn
* RowCount - 20 // liczba wierszy
* Options:
- goEditing : True // możliwość edycji w komórkach
- goTabs : True // przemieszczanie się po komórkach klawiszem Tab
3.Wybierz formatkę, dwukrotnym kliknięciem przejdź do procedury FormCreate i wpisz poniższy kod. Zadaniem procedury jest wypisanie nagłówków w wierszu nagłówkowym tabeli
procedure TForm1.FormCreate(Sender:TObject); var
i:Integer;
begin
StringGrid1.Cells[0,0] := 'Lp';
StringGrid1.Cells[1,0] := 'Nazwa towaru';
StringGrid1.Cells[2,0] := 'Cena';
end;
4.Wybierz StringGrid, odszukaj na karcie Events zdarzenie OnSelectedCell i wpisz procedurę. Wyświetla ona numer towaru (równy numerowi edytowanego wiersza) i w razie potrzeby powiększa rozmiary StringGrid
procedure TForm1.StringGrid1SelectedCell(Sender:TObject;ACol,ARow):Integer;var CanSelect :Boolean);
begin
StringGrid1.Cells[0,Arow] := IntToStr(ARow);
If ARow+1 = StringGrid1.ROwCount then StringGrid1.RowCount := StringGrid1.RowCount+1;
end;
5.Dla zdarzenia OnClose formatki (FormClose w polu Events) wpisz procedurę , której zadaniem będzie zapis danych do plików:
procedure TForm1.FormClose(Sender:TObject; var Action :TCloseAcrion);
begin
StringGrid1.Cols[1].SaveToFile('Nazwy.txt');
StringGrid1.Cols[2].SaveToFile('Ceny.txt');
end;
6.Uruchom aplikację, wpisz kilka towarów i ich ceny, następnie zamknij aplikację i sprawdź ,że w bieżącym folderze utworzone zostały dwa pliki : Nazwy.txt i Ceny.txt
7.Ponownie przejdź do projektu i uzupełnij procedurę OnCreate formaki dopisując na jej końcu instrukcje pobierania do kolumn tabeli zawartości plików tekstowych. Nowa postać procedury:
procedure TForm2.FormCreate(Sender :TObject);
var
i;Integer;
begin
StringGrid1.Cells[0,0] :='Lp';
StringGrid1.Cols[1].SaveToFile('Nazwy.txt');
StringGrid1.Cols[2].SaveToFile('Ceny.txt');
i:=1;
while StringGrid1.Cells[1,i] >'A' do
begin
StringGrid.Cells[0,i] := IntToStr(i);
i := i +1;
end;
end;
8.Sprawdź działanie

Ćwiczenie 31

1.W nowej aplikacji umieść na formatce komponent StringGrid. Ustaw jego właściwości :
* FixedCols - 0 // liczba zamrożonych kolumn
* FixedRows - 0 // liczba zamrożonych wierszy
* ColCount - 1 // liczba kolumn StringGrida
* RowCount - 10 // liczb wierszy, tyle liczb będziemy sumować
2.Wstaw przycisk polecenia z napisem Losuj i wpisz procedurę losowania liczb i ich zapisu do komórek StringGrid.
procedure TForm1.Button1Click(Sender :TObject);
var
i:Integer;
begin
Randomize;
for i := 0 to 9 do StringGrid1.Cells[0,i] := FloatToStr(Random(10));
end;
3.Wstaw drugi przycisk, ustaw jego napis: Suma i wpisz procedurę sumowania:
procedure TForm1.Button2Click(Sender :TObject);
var
i:Integer;
S:real;
begin
s:=0;
for i := 0 to 9 do
S := S + StrToFloat(StringGrid1.Cells[0,i]);
ShowMessage(FloatToStr(s));
end;
4.Aby zabezpieczyć przed błędem (sumowanie pustych komórek, w przypadku gdy użytkownik wciśnie Suma przed Losuj), uzupełnij zdarzenie OnCreate formatki: wybierz w Inspector Object z karty Events zdarzenie OnCreate i z listy obok procedurę Button1Click. Pierwsze losowanie wystąpi wtedy przy tworzeniu formularza
5.Sprawdź działanie aplikacji.

Ćwiczenie 32

1.Zadeklaruj zmienną globalną Suma typu Real (nad słowem implementation)
2.Usta wartość początkową zmiennej wpisując dla zdarzenia OnCreate (przy tworzeniu) formatki procedurę:
procedure TForm1.FormCreate(Sender :TObject);
begin
Suma := 0;
end;
3.Na formatce wstaw pole edycji oraz przyciski z napisami Czytaj, Wyświetl i Koniec.
4.Do przycisku Czytaj przypisz procedurę wczytującą liczbę i dodającą ją do sumy:
procedure TForm1.Button1Click(Sender :TObject);
var
Liczba:Real;
begin
Liczba := StrToFloat(Edit1.Text);
Suma:=Suma + Liczba;
Edit1Text := ''; // czyszczenie
Edit1.SetFocus; // ustawienie aktywności pola , przed wczytaniem następnej liczby kursor jest w polu edycji
end;
5.Dla zdarzenia OnClick Wynik wpisz treść procedury :
procedure TForm1.Button2Click(Sender : TObject);
begin
ShowMessage('Suma: ' + FloatToStr(Suma, ffFixed,18,2));
end;
6.Sprawdź działanie aplikacji

Ćwiczenie 33

1.Na formatce wstaw przycisk z napisem Następny oraz komponent Shape w dowolnym kształcie
2.W części deklaracji zmiennych globalnych (po słowie var, przed słowem implementation) zadeklaruj zmienną:
styl:Integer
3.Przypisz do przycisku procedurę :
procedure TForm1.Button1Click(Sender :TObject);
begin
if style < 8 then
begin
// ustawienie stylu wypełniacza , dodatkowo wystąpi tu rzutowanie typu Integer na typ TBrush
Shape1.Brush.Style :TBrushStyle(styl);
styl := styl + 1;
end else
styl := 0;
end;
4.Sprawdź działanie aplikacji, naciskając przycisk Następny zaobserwuj wygląd dostępnych wypełniaczy


CZĘŚĆ II : Komunikacja z użytkownikiem

Ćwiczenie 1

1.Na formatce wstaw komponenty Button i Label.Zmień napis na przycisku na Czytaj
2.Przypisz do przycisku procedurę - zdarzenie:
procedure TForm1.Button1Click(Sender:TObject);
begin
Label1.Caption :=InputBox('Dane personalne','Podaj imię i nazwisko','Imię i Nazwisko');
end;
3.Sprawdź działanie, zwróć uwagę na tytuł okna, podany tekst, wartość domyślną

Ćwiczenie 2

1.Na formatce wstaw przycisk z napisem Czytaj i etykietę
2.Do przycisku przypisz procedurę-zdarzenie:
procedure TForm1.Button1Click(Sender:TObject);
var
dane :String;
begin
if InputQuery('Wprowadzanie danych','Wprowadź i zatwierdź dane', dane) then
Label1.Caption := dane
else
Label1.Caption := 'Brak danych'
end;

Ćwiczenie 3

1.W dolnej części formularza umieść pola MaskEdit do wczytywania nazwiska, imienia, numeru telefonu i adresu
2.Do pól zawierających tekst, wypełnij właściwość EditMask wartością >L 3.Wypełnij maski pozostałych pól tak ,aby zabezpieczyć przed błędnym wprowadzaniem danych
4.Poprzedź pola MaskEdit etykietami z zachętą do wprowadzania danych
5.U góry formatki umieść w formie wizytówki etykiety, na których rozmieszczone będą wczytywane dane
6.Wstaw przycisk z napisem Wczytaj. Wpisz procedurę, której zadaniem będzie przepisywanie zawartości pól MaskEdit na odpowiednie etykiety np:
Label1.Caption := MaskEdit1.Text
7.Sprawdź działanie aplikacji. Sprawdź możliwość wpisywanie danych spoza zakresu maski

Ćwiczenie 4

1.Na formatce umieść etykietę i przycisk polecenia z napisem Wczytaj dane
2.Wybierając z menu File -> New Form dodaj do projektu nową formatkę. Umieść na niej komponenty Label i MaskEdit oraz dwa komponenty typu BitBtn. Zmień Caption formatki na Wczytywanie danych
3.Na etykiecie umieść napis Podaj nazwisko
4.Do pól MaskEdit wypełnij pole EditMask tak , by zabezpieczyć wprowadzenie nazwiska: >L 5.Wybierz jeden z przycisków BitBtn i ustaw jego właściwość :
Kind - bkOK // przycisk z symbolem operacji potwierdzenia, opatrzony reakcją na klawisz Enter (wykona się procedura OnClick). Dla klawisza Escape procedura się nie wykona
Caption - Wczytaj
6.Ustaw właściwości drugiego przycisku:
Kind - bkCancel
Caption - Anuluj
7.Dla procedury Anuluj wpisz procedurę:
procedure TForm2.BitBtn2Click(Sender:TObject);
begin
MaskEdit1.SetFocus ; // uaktywnienie pola MaskEdit
MaskEdit1.Text := ''; // czyszczenie pól edycji
MaskEdit1.SelStart := 0; //ustawienie kursora w polu edycji na pierwszym znaku
end;
8.Dla przycisku Wczytaj przypisz procedurę:
procedure TForm2.BitBtn2Click(Sender:TObject);
begin
// przekazanie danych z pola edycji na formatce Form2 do etykiety na formatce Form1
Form1.Labe1.Caption := Form2.MaskEdit1.Text;
Close;
end;
9.Dla zdarzenia OnActivate dla formatki wybierz procedurę przypisaną do przycisku Anuluj : TForm2.BitBtn1Click - aby wyczyścić okno edycyjne przy wejściu do formatki .To samo dla zdarzenia OnShow formatki.
10.Przejdź do formatki Form1 i dla przycisku Wczytaj dane wpisz procedure:
procedure TForm1.Button1Click(Sender:TObject);
begin
Form2.Show; // uwidocznienie formatki Form2
end;
11.Skompiluj aplikację. Wciskając przycisk Yes w pokazującym się oknie komunikatu, dodaj do projektu brakujące elementy
12.Uruchom aplikację i sprawdź jej działanie

Ćwiczenie 5

1.Na formatce wstaw przycisk z napisem Czytaj liczbę i etykietę
2.Do przycisku przypisz procedurę - zdarzenie:
procedure TForm1.Button1Click (Sender : TObject);
var
x,y: Real;
kod: Integer;
str1,str2: string;
begin
kod:=0;
repeat
str1 := InputBox('Wprowadzanie danych','Podaj pierwszą liczbę','');
Val(str,x,kod);
if kod <> 0 then ShowMessage('Błędna liczba');
until kod = 0; // opuszczenie pętli następuje, gdy liczba jest wprowadzana poprawnie
kod := 0;
repeat
str2 := InputBox('Wprowadzanie danych','Podaj drugą liczbę', '');
Val(str2,y,kod);
if kod <> 0 then ShowMessage('Błędna liczba');
until kod = 0; //opuszczenie pętli następuje, gdy liczba jest wprowadzana poprawnie
Label1.Caption := str1 + '+' + str2 + '=' +FloatToStr(x+y);
end;

Ćwiczenie 6

1.Na formatce wstaw etykietę z napisem Podaj długość panelu, okno edycyjne i panel
2.Dla zdarzenia OnChange okna edycyjnego wpisz procedurę:
procedure TForm1.Edit1.Change(Sender:TOject);
var
l:integer; // wartość liczby
begin
try
if Edit1.Text < > '' //tu wpisujemy dwa pojedyncze apostrofy
then l : StrToInt(Edit1.Text);
else l := 0; Panel1.Caption := Edit1.Text;
// warunki aby Panel zmieścił się na formatce
if (l > 0) and (l+Panel1.Left Panel1.Width := 1
else
ShowMessage ('Niewłaściwy rozmiar');
except
ShowMessage('To nie jest liczba');
end
end;
3.Zapisz pliki i skompiluj aplikację
4.Utwórz skrót do aplikacji
5.Uruchom aplikację poza środowiskiem Delphi i sprawdź jej działanie, wpisując znaki nie będące cyframi, liczby dopuszczalne jako długość panelu oraz liczby które nie mogą stanowić jego długości

Ćwiczenie 7

1.Umieść na formatce dwa okna edycyjne do wprowadzania dzielnej i dzielnika i poprzedź je etykietami Podaj dzielną, Podaj dzielnik
2.Umieść przycisk z napisem Dzielenie
3.Dla zdarzenia OnClick przycisku Dzielenie wpisz procedurę:
procedure TForm1.Button1Click(Sender :TObject);
var
wynik:Real;
begin
try
wynik := StrTOInt(Edit1.Text)/StrToInt(Edit2.Text);
ShowMessage('Wynik dzielenia ' + FloatToStr(wynik));
except
on EZeroDivide do
ShowMessage('Próba dzielenia przez zero');
else
ShowMessage('Inny błąd');
end;
end;
4.Zapisz pliki i skompiluj aplikację
5.Utwórz skrót aplikacji i uruchom ją poza środowiskiem Delphi. Przetestuj działanie podając dzielnik równy zeru, znaki nie będące cyframi oraz liczby, dla których dzielenie zostanie wykonane poprawnie.

Ćwiczenie 8

1.Na formatce wstaw przycisk z napisem Wywołanie i etykieta
2.Dla zdarzenia OnClick przycisku wpisz procedurę:
procedure TForm1.Button1Click(Sender :TObject);
var
wynik:Integer;
begin
wynik := Application.MessageBox('Naciśnij klawisz', 'Testowanie MessageBox',mb_AbortRetryIgnore+ Mb_defButton2+Mb_IconQuestion);
Case wynik of
3:Label1.Caption := 'Przerwij'
4:Label1.Caption := 'Ponów próbę'
5:Label1.Caption := 'Zignoruj'
end;
end;
3.Sprawdź działanie aplikacji i wypróbuj inne połączenie flag

Ćwiczenie 9

1.Na formatce umieść etykietę i komponent DateTimePicker
2.Ustaw właściwości komponentu DateTimePIcker
* DateFormat - dfShort
3.Podwójnym kliknięciem komponentu przejdź do procedury OnChange wpisz treść procedury
Label1.Caption := DateToStr(DateTimePicker1.Date)
4.Uruchom aplikację i sprawdź jej działanie

Ćwiczenie 10

1.Na formatce umieść etykietę i komponent DateTimePicker
2.Dla zdarzenia OnClick komponentu DateTimePicker wpisz treść procedury
procedure TForm1.DateTimePicker1Change(Sender :TObject);
var
ile:Real;
begin
ile := DateTimePicker1.Date - Date;
Label1.Caption := 'Liczba dni: ' + IntToStr(Trunc(ile));
end;
3.Uruchom aplikację, wybierz na przykład datę urodzenia i odczytaj na etykiecie obliczoną liczbę dni

Ćwiczenie 11

1.Umieść na formatce etykietę i komponent DateTimePicker.Ustaw jego właściwości:
* DateFormat - dfLong
* MinDate : 1000-01-01
* MaxDate: 3000-01-01
2.Dodaj komponent UpDown. Ustaw jego właściwości:
* Assotiate : DateTimePicker1 // kojarzenie ze wskazanym komponentem
* Increment : 10 // krok zmiany
* Min : -1000 // minimalna wartość wybierana strzałkami
* Max : 1000 // maksymalna wartość wybierana strzałkami
* Position : 0 // startowa pozycja wskaźnika
3.Dla zdarzenia OnClick komponentu UpDown wpisz procedurę:
procedure TForm1.UpDown1Click(Sender :TObject; Button ; TUDBtnType);
begin
//ustawienie daty na 1 stycznia wybranego roku
If UpDown1.Position > 0 then
DateTimePicker1 := StrToDate(IntToStr(UpDown1.Position) + '-01-01') // zabezpieczenie przed sytuacją , gdy wybrana przez UpDown liczba jest jednocyfrowa
else if UpDown1.Position = 0 then
DateTimePicker1.Date := StrToDate(IntToStr(UpDown1.Position) +'0-01-01') // działanie , gdy wybrana przez UpDown liczba jest ujemna
else DateTimePicker1.Date := StrToDate(IntToStr(2000+UpDown1.Position)+'-01-01')
end;
4.Podwójnym kliknięciem przejdź do procedury OnChange i wpisz treść procedury:
procedure TForm1.DateTimePicker1Change(Sender :TObject);
var
s:String; // pod tą zmienną uzyskamy datę w postaci języka
begin // zamiana daty na łańcuch s
DateTimeToString(s,'dddd,d mmmm, yyyy r.', DateTimePicker1.Date);
Label.Caption := s;
end;

Ćwiczenie 12

1.Umieść na formatce dwa przyciski : Zapis do pliku i Odczytz pliku
2.Wybierz z menu : File -> New,następnie kartę Dialogs i element Standard Dialog. Do aplikacji zostanie dołączona formatka o nazwie OKBottomDlg pełniący rolę okna dialogowego. W tym projekcie z formatką związany jest moduł Unit2.pas .Sprawdź klawiszami Shift + F12 obecność formatki w projekcie
3.Dodaj do formatki OKBottomDlg przycisk z napisem Koniec, dwa okna edycyjne do wprowadzania pól rekordu i dwie etykiety do opisu okien. Umieść na etykietach napisy: Nazwisko i Pensja. Zmień właściwość Caption formatki na Zapis do pliku
4.W module Unit2 wpisz w miejscu deklaracji typów :
Prac = record
Nazwisko : string[20];
Pensja:currency;
end;
5.W deklaracji zmiennych globalnych modułu (po słowie var przed słowem implementation) wpisz deklarację zmiennej plikowej:
Plik:file of Prac
6.Ustaw właściwości Caption przycisku OK na Zapisz. Dla zdarzenia OnClick wpisz procedurę, która zapisuje do pliku rekord o polach pobranych z pól edycji:
procedure TOKBottomDlg.OKBtnClick(Sender : TObject);
var
P1:prac;
begin
If Edit1.Text <>'' then //zapis do pliku następuje w sytuacji gdy okno edycyjne nie jest puste
begin
P1.Nazwisko := Edit1.Text;
P1.Pensja := StrToCur(Edit2.Text);
Write(Plik,P1);
Edit1.Text := ''; // wyczyszczenie okna
Edit2.Text := '0'
end;
end;
7.Ustaw właściwość Caption przycisku Cancel na Anuluj >Dla zdarzenia OnClick wpisz procedurę:
procedure TOKBottomDlg.CancelBtnClick(Sender : TObject);
begin
Edit1.Text := '' ; // wyczyszczenie okna
Edit2.Text := '0';
end;
end;
8.Dla zdarzenia OnActivate formatki OkBottomDlg wpisz procedurę ,która otwiera plik do dopisywania:
procedure TOKBottomDlg.FormActivate(Sender : TObject);
begin
AssignFile(Plik, 'C: \ Plik.exe');
try
Reset(Plik);
except
Rewrite(Plik);
end;
Seek(Plik,FileSize(Plik)); // przygotowanie pliku do dopisywania
Edit1.Text := ''; // wyczyszczenie pól edycji
Edit2.Text := '0';
end;
9.Do przycisku z napisem Koniec wpisz procedure - zdarzenie:
procedure TOKBottomDlg.Button1Click(Sender : TObject);
begin
CloseFile(Plik);
OkBottomDlg.Close; //zamknięcie formularza z dialogiem
end;
10.Dodaj do formatki podstawowej drugie okno dialogowe. Przyjmie ono nazwę OKBottomDlg1, a odpowiadający mu moduł Unit3.pas
11.Ustaw właściwość Caption formatki OKBottomDlg1 na Odczyt z pliku
12.Wpisz w module Unit3.pas po słowie uses deklarację korzystania z modułu Unit2
13.Dodaj do formatki dwa okna edycyjne do wyświetlania rekordów z pliku oraz dwie etykiety do opisu tych okien. Ustaw dla okien właściwość :
* Enabled - False // brak możliwości edycji przy przeglądaniu rekordów
14.Ustaw właściwość Caption przycisku OK na Następny. Dla zdarzenia OnClick wpisz procedurę :
procedure TOKBottomDlg1.OKBtnClick(Sender : TObject);
var
P1: Prac;
begin
if FilePos(Plik) < FileSize(Plik) then //czytanie z pliku przebiega tylko wtedy, gdy jeszcze są rekordy
begin
Read(Plik,P1);
Edit1.Text :=P1.nazwisko;
Edit2.text :=CurrToStr(P1.pensja); / zamiana waluty na łańcuch
end;
end;
15.Ustaw właściwość Caption przycisku Cancel na Koniec i wpisz procedurę-zdarzenie:
procedure TOKBottomDlg1.CancelBtnClick(Sender : TObject);
begin
CloseFile(Plik);
OkBottomDlg1.close; //zamknięcie formularza z dialogiem
16.Dla zdarzenia OnActive dla formularza OKBottomDlag1 wpisz procedurę wyświetlającą pierwszy rekord:
procedure TOKBottomDlg1,ForActivate(Sender : TObject);
var
P1:Prac;
begin
AsignFile(Plik,'C:\plik.exe');
try
Reste(Plik)
except
ShowMessage('Brak pliku');
end;
If FilePos(Plik) < FileSize(Plik) then
begin
Read(Plik,P1);
Edit1.Text := P1.Nazwisko;
Edit2.Text := CurrToStr(P1.Pensja);
end;
end;
17.Przejdź do modułu Unit3.pas i w sekcji deklaracji modułów po słowie uses wpisz nazwę Dialogs. Jest to wymagane do korzystania z okna ShowMessage
18.Dodaj przycisk z napisem Pierwszy. Na karcie Events, dla zdarzenia OnClick przycisku wybierz z listy procedurę FormActivate
19.Przejdź do formatki Form1.Wpisz treść procedur:
dla przycisku z napisem Zapis do pliku : OkBottomDlg.Show; //uwidocznienie formatki
dla przycisku Odczyt z pliku : OkBottomDlg1.Show;
Dodaj po słowie uses deklarację korzystania z modułów Unit2 i Unit3
20.Uruchom aplikację i sprawdź działanie przycisków

Ćwiczenie 13

1.Przygotuj w Notatniku dwa pliki tekstowe o nazwach Angielskich.txt i Polski.txt zawierające odpowiadających sobie wierszach słowa angielskie i ich odpowiedniki polskie
2.Umieść na formatce przycisk polecenia z napisem Szukaj oraz dwa pola tekstowe: jedno do wyświetlania słowa angielskiego, drugie do wyświetlenia jego polskiego odpowiednika
3.Zadeklaruj zmienne globalne (po słowie var nad implementation) do operacji na plikach:
var
PlikA, PlikP : TStringList;
4.Dla zdarzenia OnCreate formatki wpisz procedurę, której zadaniem będzie utworzenie zmiennej i umieszczanie w niej zawartości plików
PlikA := TStringList.Create;
PlikP := TStringList.Create;
PlikA.LoadFromFile('Angielski.txt');
PlikP.LoadFromFile('Polski.txt');
5.Do przycisku Szukaj przypisz procedurę:
var
S:String;
Indeks:Integer;
begin
S:=Edit1.Text
Indeks := PlikA.IndexOf(S);
if Indeks >= 0 then
Edit2.Text := PlikP.Strings[Indeks]
else
Edit2.Text := '';
end;
6>W procedurze OnClose formatki wpisz instrukcje likwidacji zmiennych:
procedure TForm2.FormClose(Sender :TObject; var Action :TCloseAction); begin
PlikA.Free;
PlikP.Free;
end;
7.Zapamiętaj moduł związany z aplikacją pod nazwą Szukaj
8.Sprawdź działanie aplikacji

Ćwiczenie 14

1.Dodaj do powyższej aplikacji nową formatkę (File -> New Form) i uczyń go formatką nadrzędną aplikacji. W tym celu wybierz z menu: Project -> Options, przejdź na kartę Forms i w oknie Main form wybierz z listy wyboru Form2. Zapisz moduł związany z formatką pod nazwą Sterowanie
2.Umieść na formatce dwa przyciski z napisami : Dodawanie słów i Wyszukiwanie. Aby obsługa pliku była związana a jedną zmienną, przenieś z modułu wyszukiwania do modułu Sterowanie deklaracje zmiennych globalnych PlikA, PlikP oraz treść procedury OnCreate - utworzenie zmiennych i odczyt zawartości pliku. Podobnie zawartość procedury OnClose. W module Szukaj, te zmienne i procedury należy wykasować.
3.Dodaj jeszcze jedną formatkę, której zadaniem będzie pobieranie i zapis słów. Ponieważ budowa tej formatki jest taka sama jak przy ich wyszukiwaniu, posłużmy się kopiowaniem komponentów. Wybierz wszystkie elementy formatki wyszukiwania wybierając z opcji menu Edit -> Select All. Przez wybór Edit -> Copy przekopiuj je do schowka, przejdź do formatki Dodawanie i wklej zawartość schowka. Zapamiętaj moduł związany z formatką pod nazwą Dodaj
4.Na formatce dodawania słów zmień napis na przycisku na Dodaj i przypisz do niego procedurę:
procedure TForm3.Button1Click(Sender :TObject);
var
s:String;
begin
s:=Edit1.Text;
if s <> '' then
PlikA.Add(s);
s := Edit2.Text;
PlikA.SaveToFile('Angielski.txt');
if s <>'' then;
PlikP.Add(s);
PlikP.SaveToFile('Polski.txt');
Edit1.Text := '';
Edit2.Text := '';
end;
5.W modułach związanych z formatkami podrzędnymi dodaj po słowie uses nazwę modułu nadrzędnego - Sterowanie, aby zapewnić kontakt i widoczność zmiennych
6.Przypisz do przycisków formularza Sterowanie procedury uwidaczniania formatek podrzędnych o treści: Form1.Show i odpowiednio Form3.Show
6.Sprawdź działanie aplikacji

Ćwiczenie 15

1.Umieść na formatce pole Memo
2.Dodaj komponent OpenDialog z karty Dialogs. Jest to komponent niewidoczny otwierający dialog wyboru z pliku dysku
3.Klikając w polu właściwości Filter, przejdź do edytora filtrów i wpisz w tabelce pod wskazanym nagłówkiem:
Filter name : tekstowe; programy w Pascalu , wszystkie pliki
Filter : *.txt, *.pas, *.*
4.Ustaw właściwości:
* FilterIndex - 1 // wybiera pierwszą maskę plików jako domyślną
* InitialDir - C : \ Moje dokumenty //ustawia kataliog domyślny
5.Umieść na formatce SpeedButton (przycisk szybkiego reagowania) - będzie to przycisk otwierający dialog. Umieść na przycisku rysunek kojarzący się z otwieraniem pliku:
* kliknij w polu właściwości Glyph i przejdź do Picture Editor
* kliknij przycisk Load, przejdź do katalogu Delphi \ Images \ Buttons
* wybierz właściwy rysunek i zatwierdź wybór
6.Dla zdarzenia OnClick komponentu SpeedButton wpisz procedurę:
procedure TForm1.SpeedButton1Click(Sender :TObject);
begin
if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
7.Sprawdź działania aplikacji

Ćwiczenie 16

1.Otwórz poprzednią aplikację
2.Dodaj do formularza komponent SaveDialog oraz SpeedButton z rysunkiem zamknięcia
3.Podobnie jak w poprzednim ćwiczeniu, ustaw filtry oraz właściwości FilterIndex i InitialDir. Ustaw właściwość
DefaultExt - txt // nadawanie domyślnego rozszerzenia zapisywanym plikom
4.Dla zdarzenia OnClick komponentu SpeedButton wpisz:
procedure TForm1.SpeedButton2Click(Sender : TObject);
begin
if SaveDialog1.Execute then
Memo1.LinesSaveToFile(SaveDialog1.FileName);
end;
Ćwiczenie 17

1.Umieść na formatce komponent Image. Ustaw właściwość:
Stretch - True //dostosowanie obrazka do rozmiarów komponentu Image
2.Dodaj komponenty OpenPictureDialog i SavePictureDialog.
3.Wstaw na formatkę dwa przyciski, ustaw napisy na przyciskach: Otwórz i Zapisz. Przypisz procedury:
* do przycisku Otwórz:
procedure TForm1.Button1Click(Sender :TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadfromFile(OpenPictureDialog1.FileName)
end;
* do przycisku Zapisz:
procedure TForm1.Button2Click(Sender :TObject);
begin
if SavePictureDialog1.Execute then
Image1.Picture.SaveToFile(SavePictureDialog1.FileName)
end;

Ćwiczenie 18

1.Wstaw na formatkę przycisk z napisem Nowy kolor oraz komponenty : Shape , ColorDialog
2.Dla zdarzenia OnClick przycisku Nowy kolor wpisz procedurę:
procedure TForm1.Button1Click(Sender : TObject);
begin
if ColorDialog1.Execute then
Shape1.Brush.Color := ColorDialog1.Color;
end;
3.Sprawdź działanie aplikacji

Ćwiczenie 19

1.Na formatkę wstaw przycisk z napisem Zmiana czcionki oraz komponenty Memo i FontDialog
2.Dla zdarzenia OnClick przycisku Zmiana czcionki wpisz procedurę:
procedure TForm1.Button1Click(Sender : TObjext);
begin
if FontDialog.Execute then
Memo1.Font := FontDialog1.Font;
end; 3.Sprawdź działanie aplikacji

Ćwiczenie 20

1.Na formatkę wstaw przycisk z napisem Druk oraz komponenty RichEdit i PrintDialog
2.Dla zdarzenia OnClick przycisku Druk wpisz procedurę:
procedure TForm1.Button1Click(Sender : TObjext);
begin
if PrintDialog1.Execute then
RichEdit.Print('nazwa') // parametr nazwa określa nazwę dokumentu w kolejce wydruku
end;
3.Wypróbuj działanie wpisując tekst do pola RichEdit i drukując zawartość pola na drukarce

Ćwiczenie 21

1.Umieść na formatce da przyciski z napisami : Pokaż obraz i Drukuj obraz oraz komponent PrintDialog
2.Wybierając z menu File -> New Form, dodaj do projektu nową formatkę. Umieść na niej komponent Image i ustaw jego właściwość:
Align - alClient
3.Wybierz formatkę Form1, wpisz procedury dla przycisków:
* dla przycisku Pokaż obraz:
procedure TForm1.Button1Click(Sender : TObject);
begin
Form2.Show; // uwidocznienie formatki Form2
end;
* dla przycisku Drukuj obraz:
procedure TForm2.Button1Click(Sender : TObject);
begin
if PrintDialog1.Execute then
Form2.Print; // wydruk formularz Form2
end;
4.Skompiluj aplikację. Wciskając przycisk Yes w oknie komunikatów dodaj do projektu brakujące elementy
5.Sprawdź działanie aplikacji


CZĘŚĆ III : Rozbudowywanie aplikacji

Ćwiczenie 1

Aplikacja zawiera pole RichEdit i menu z opcjami :Druk, Edycja (podopcje :Kopiuj, Kasuj, Wklej) oraz pasek narzędziowy ToolBar z przyciskami odpowiadającymi opcjom menu. Oprogramowanie zdarzeń związanych z działaniem aplikacji jest określone za pomocą komponentu ActionList
1.Wstaw na formatce:
* pole RichEdit
* koponent ImageList i przypisz ikony obrazujące polecenia w kolejności przedstawionej w menu
* komponent MainMenu; w polu właściwości Images wybierz z listy ImageList1 i ustaw opcje menu
* pasek stanu StatusBar; ustaw właściwość
AutoHint - True // automatyczne wyświetlenie podpowiedzi w linii stanu
* pasek narzędziowy ToolBar; ustaw właściwość Images wybierając z listy ImageList1 i wstaw tyle przycisków, ile masz opcji menu
* komponent ActionList
2.Wybierz ActionList, ustaw właściwość ImageList na ImageList1.Podwójnym kliknięciem komponentu ActionList przejdź do okna edytowania akcji:
* z listy na pasku tytułowym okna wybierz polecenie New Action (gorący klawisz : Ins)
* w oknie właściwości (Object Inspector) ustaw:
Category - Druk
Caption - Druk
* podwójnym kliknięciem w oknie Actions przejdź do edycji procedury obsługującej zdarzenie i wpisz
procedure TForm1.DrukExecute(Sender :TObject);
begin
ShowMessage('Tu nastąpi wydruk zawartości okna RichEdit, w następnej części dowiesz się ,jak to zrobić'); end;
uzupełnij właściwości Hint (podpowiedź) oraz ShortCut (gorący klawisz)
* z listy na pasku tytułowym okna edycji akcji wybierz polecenie New Standard Action (Ctrl + Ins) i wybieraj z okna kolejno : TEditCopy,TEditPaste, TEditCut. Tak wprowadzone akcje mają już swoje procedury obsługi zdarzeń. W oknie Object Inspector zmień etykiety (Caption) zdarzeń na polskie. Uzupełnij właściwości Hint i ShortCut
3.Przejdź do formatki Form1. Wybierz przyciski narzędziowe i uzupełnij właściwość Action dla przycisku wybierając z listy w polu odpowiednią akcję.
4.Wybierz komponent Memo i dla opcji menu wybierz z listy odpowiednią akcję w polu właściwości Action
5>Sprawdź działanie aplikacji. zaobserwuj linię stanu, działanie przycisków i dostępność opcji menu

Ćwiczenie 2

1.Na formatce umieść etykietę i trzy przyciski z napisami : Otwórz formularz, Otwórz dialog i O programie. Aby przyciski miały jednakowe rozmiary, możesz posłużyć się kopiowaniem.
2.Korzystając z menu File -> New Form, dodaj do aplikacji nowy formularz
3.Przyciskami Shift+F12 przejdź do wyboru formatki Form1.Dla zdarzenia OnClick przycisku Otwórz formularz wpisz procedurę:
procedure TForm1.Button1Click(Sender : TObject);
begin
Form2.Show
end;
4.Wybierz z opcji menu: File -> New i dodaj do projektu formularz typu About box z karty Forms. Zmień napisy na etykietach na teksty polskie. Do przycisku OK przypisz procedurę
procedure TAboutBox.OKButtonClick(Sender : TObject);
begin
AboutBox.Close; //zamknięcie formularza AboutBox
end;
5.Przejdź do formatki Form1. Dodaj do przycisku z napisem O programie procedurę - zdarzenie
procedure TForm1.Button1Click(Sender : TObject);
begin
AboutBox.Show; // uwidocznienie formatki AboutBox
end;
6.Wybierz z menu : File -> New i dodaj z karty Dialogs formularz typu Standard Dialog:
* zmień napis na przycisku Abort na Anuluj
* dodaj pole edycji
* wpisz dla przycisku OK treść procedury
procedure TOKBottomDlg.OKBtnClick(Sender : TObject);
begin
Form1.Label1.Caption := Edit1.Text;
OKBottomDlg.Close;
end;
* dla przycisku Anuluj wpisz treść procedury
procedure TOKBottomDlg.CancelBtnClick(Sender : TObject);
begin
OKBottomDlg.Close;
end;
7.Przejdź do formatki Form1. Do przycisku Otwórz dialog przypisz procedurę:
OKBottomDlg.Close;
8.Skompiluj moduł. Przez wciśnięcie przycisku Yes w pokazującym się podczas kompilacji oknie komunikatu potwierdź dołączanie brakujących elementów do projektu.
9.Sprawdź działanie aplikacji

Ćwiczenie 3

1.Do nowego projektu dodaj dwie formatki
2.Przejdź do pliku projektu (View -> Project Source)m wykasuj polecenie tworzenia formatki Form2. Treść projektu po zmianie:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForme(TForm1,Form1);
Application.Run;
end.
3.Umieść na formatce Form1 przycisk polecenia. Dla zdarzenia OnClick wpisz do procedury tworzenia formatki:
procedure TForm1.Button1Click(Sender ; TObject);
begin
if Form2 = nil then // sprawdzenie czy formatka istnieje
Form2 := TForm2.Create(Application); //gdy nie istnieje, utworzenie formatki przez wywołanie konstruktora Create
Form2.Show //uwidocznienie utworzonej formatki
end;
3.Przejdź do formatki Form2 i w procedurze dla zdarzeniaOnClose ustaw sposób zamykania formatki na likwidowanie w pamięci:
procedure TForm2.FormClose(Sender :TObject;var Action:TCloseAction);
begin
Action:= caFree; // wywołanie procedury zwalniającej pamięć
end;
5.Dla zdarzeniaOnDstroy (likwidacja obiektu) przypisz zmiennej Form2 wartość zera wskaźnikowego:
procedure TForm2.FormDestroy(Sender : TObject);
begin
Form2 := nil;
end;
6.Skompiluj aplikację wciskając Yes w pokazującym się oknie komunikatu, dodaj do projektu brakujące elementy
7.Sprawdź działanie aplikacji

Ćwiczenie 4

1.Wybierz z menu File -> New -> Other, następnie kartę Projects, element MDI Application. W oknie zapisu plików wybierz folder do zapamiętywania plików aplikacji i zatwierdź zapis plików.W wyniku tych działań zostaną wygenerowane podstawowe formatki aplikacji: formatka z elementami sterowania, formatka z oknem O programie i formatkę podrzędną
2.Uruchom aplikację i sprawdź działanie podstawowych opcji zawartych w menu. Sprawdź możliwość otwierania nowego okna, otwieranie pliku tekstowego, ustawianie okien (opcje Windows). Wpisz w nowym oknie tekst, wybierz go myszą i sprawdź możliwość kopiowania
3.Przejdź do projektu, wciskając klawisze Shift+F12, przejdź do okna wyboru formatki; wybierz About i sprawdź jakie komponenty zawiera .Zmień napisy na etykietach, właściwość Caption formatki i wybierz logo dla aplikacji
4.Wybierz formatkę MainForm, odszukaj MainMenu i przejdź do edycji menu. Zmień nazwy angielskie na polskie. Ustaw dla każdej opcji we właściwości Hint krótkie wyjaśnienie funkcji opcji. Będzie ona treścią linii stanu
5.Przejdź do kodu modułu i odszukaj procedurę
procedure TMainForm.FileNew1Execute(Sender : TObject);
begin
CreateMDIChild('NONAME'+ IntToStr(MDICHildCount + 1));
end;
Znajdź napis NONAME i zmień na Nowy
6.Wprowadź na formatkę MainFormkomponent SaveDialog.ODszukajna formatceActionList i dwukrotnym kliknięciem otwórz okno akcji. Klikając opcję Save As przejdź do edycji procedury i wpisz kod:
procedure TMainForm.FileSaveAs1Execute(Sender : TObject);
var
Form: TMDIChild;
sOverwrite : Integer;
begin
if MainForm.ActiveMDIChild <> nil then //sprawdzenie ,czy formularz podrzędny istnieje
begin
if SaveDialog1.Execute then begin
if FileExists(SaveDialog1.FileName) then
if Application.MessageBox('Czy zmienić istniejący plik?','Zapis pliku',MB_IconQuestion+MB_YesNoCancel) <> IdYes
then exit; // wyjście, gdy przycisk wciśnięty w oknie dialogowym jest różny od Yes
Form:= TMDIChild(MainForm.ActiveMDIChild); //przechwycenie aktywnego okna formatki
Form.Memo1.Lines.SaveToFile(SaveDialog1.FileName); // zapisanie pliku
Form.Memo1.Modified := false;
Form.Caption := SaveDialog1.FileName;
end;
end;
end;
7.Dla opcjiSavewybranej w oknie ActionList wpisz kod procedury:
procedure TMainForm.FileSaveAs1Execute(Sender : TObject);
var
Form:TDMIChild;
begin
if MainForm.ActiveMDIChild <>nil then // sprawdzenie czy formatka podrzędna istnieje
begin
Form := TMDIChild(MainForm.ActiveMDIChild); //rzutujemy typ formatki na typ TMDIChild
if copy(Form.Caption,1,4) = 'Nowy' then // jeśli napis w pasku tytułowym okna zaczyna się 'Nowy'
FileSaveAs1Execute(Sender) //wywołujemy procedurę opcji Zachowaj jako
else
Form.Memo1.LinesSaveToFile(Form.Caption); //jeśli nie, zachowujemy plik pod nazwą z paska
end;
end;
8.Sprawdź działanie oprogramowanych opcji.

Ćwiczenie 5

1.Zamknij okno z projektem tak, aby w środowisku nie było żadnego formularza
2.Wybierz z menu File -> New Form w celu zbudowania formularza bez projektu
3.Przygotuj na formatce okno dialogowe do wczytania nazwiska według wskazówek z ćwiczenia II.8
4.Zapisz formularz w wybrany folderze
5.Z menu podręcznego na obszarze formularza przejdź do opcji Add to Repository
6.W oknie dialogowym Add to Repository wypełnij pola:
Title // podpis pod ikoną formularza
Author // autor formularza
Page //wybór strony ,na której umieszczona zostanie ikona formatki lub wpisanie nowej
Zatwierdź dane przyciskiem OK
7.Wybierając z menu opcję File -> New Other sprawdź ,że ikona formatki znajduje się na wskazanej stronie
8.Zastosuj utworzone okno w swojej aplikacji

Ćwiczenie 6

Dziennik elektroniczny: aplikacja przedstawiająca przedmiot umieszcza tabelkę z listą osób w grupy oraz miejscem na ocenę i datę. Istnieje możliwość wpisywania ocen a wpisywane oceny są zapamiętywane w plikach tekstowych
1.Korzystając z Notatnika stwórz plik tekstowy zawierający w kolejnych wierszach nazwiska i imiona uczniów, pierwszy wyraz pozostaw pusty. Zapisz plik w katalogu przeznaczonym na aplikację, nadając mu nazwę Nazwiska.txt
2.Stosując komponent PageControl zbuduj notes o liczbie stron równej liczbie przedmiotów, które chcesz ująć w dzienniku. Na zakładkach stron umieść nazwy przedmiotów.
3.Na pierwszej stronie notatnika wstaw komponent StrinGrid. Ustaw w oknie Object Inspector właściwości StringGrid
Align - alClient // tabela będzie wypełniać całą stronę notatnika
ColCount - 6 //miejsce na numer, nazwisko i imię oraz oceny
FixedCols - 1 // liczba zamrożonych kolumn (stale widoczne bez możliwości edycji)
RowCount - 10 // liczba wierszy w tabeli = liczba uczniów w grupie
4.Rozwiń listę właściwości Options i ustaw właściwości:
* goEditing - True //umożliwi to wpisanie wartości do tabeli
* goColSizing - True //zmiana rozmiarów szerokości kolumny
* goColMoving True //możliwość przenoszenia kolumn
* goRowMoving - True //możliwość przenoszenia wierszy
* goTabs - True // przemieszczanie się po komórkach klawiszem Tab
5.Tak przygotowaną tabelę przekopiuj na inne strony notatnika , wykorzystując z menu Edit -> Copy , Edit -> Paste .Po przekopiowaniu nazwij tabele nazwami przedmiotów wykorzystując właściwość Name dla każdej z nich:polski, matematyka, fizyka, chemia itp. Pamiętaj ,że nazwa nie może zawierać spacji i w obrębie aplikacji musi być unikalna
6.Przejdź do edycji modułu i po słowie implementation wpisz procedurę (ustawia ona wartości początkowe pojedynczej tabeli):
procedure PiszTab(var Tabela: TStringGrid);
var
i:integer;
s:string;
begin // wpisujemy dane do tabeli przekazanej parametrem
s:= Tabela.Name;
with Tabela do
begin //do kolumny pierwszej pobieramy nazwiska osób w grupie
Cols[1].LoadFromFile('Nazwiska.txt');
// tworzenie nagłówka tabeli
Cells[0,0] := 'NR';
Cells[1,0] :='Nazwisko i imię';
Cells[2,0] := 'Ocena';
//tworzenie numerów w tabeli
for i := 1 to 20 do
Cells[0,i ] := IntToStr(i);
end;
end;
7.Wybierz formatkę i dla zdarzenia OnActivate wpisz procedurę inicjującą tabelki dla każdej strony notesu:
procedure TForm1.FormActivate(Sender:TObject);
begin
PiszTab(Polski);
PiszTab(Matematyka);
PiszTab(Plastyka);
PiszTab(Muzyka);
PiszTab(Fizyka);
PiszTab(Chemia);
end;
8.Wypisz procedurę lokalną modułu Zachowaj Oceny, której zadaniem jest zapis do pliku drugiej, i trzeciej kolumny komponentu StringGrid przekazywanego parametrem
procedure ZachowajOceny(var Tabela:TStringGrid);
var
s:string;
begin
//pobieramy nazwę StringGrida, posłuży na jako nazwa pliku tekstowego pamiętającego oceny
s:=Tabela.Name;
with Tabela do
begin
// zawartość kolumny drugiej zapisujemy w pliku tekstowym o nazwie takiej, jak nazwa pobranego parametrem komponentu StringGrid z dodanym słowem Oceny. Podobnie trzecia kolumna pamiętana jest w pliku tekstowym o nazwie komponentu z dodany słowem Data
Cols[2].SaveToFiles(s+'Oceny.txt');
Cols[3].SaveToFile(s+'Data.txt');
end;
end;
9.Dla zdarzenia OnClose formatki wpisz procedurę wywołującą dla każdego komponentu StringGrid procedurę lokalną ZachowajOceny
procedure TForm1.FormClose(Sender:TObject; var Action : TCloseAction);
begin
ZachowajOceny(polski);
ZachowajOceny(matematyka);
ZachowajOceny(fizyka);
ZachowajOceny(chemia);
ZachowajOceny(plastyka);
ZachowajOceny(muzyka);
end;
10.Uruchom aplikację, wpisz oceny i daty i zamknij ją. Powstaną pliki tekstowe pamiętające daty i oceny
11.Przejdź do projektu i uzupełnij procedurę PiszTab dodając wewnątrz instrukcji with instrukcje wprowadzające do kolumn StringGrid zawartość plików z ocenami i datą
Cols[2].LoadFromFile(s+'Oceny.txt');
Cols[3].LoadFromFile(s+'Data.txt');
12.Ponownie uruchom aplikację i sprawdź jej działanie:
* sprawdź możliwość wprowadzania danych
* powiększ szerokość kolumny przeznaczonej na nazwisko, rozsuwając nagłówek kolumny myszką
* sprawdź działanie klawisza Tab, klawiszy strzałek po zatwierdzeniu edycji klawiszem Enter
* sprawdź ,że wykorzystując klawisz F12 można poprawić wpisany tekst
* sprawdź możliwość przenoszenia myszką wierszy i kolumn tabeli.

Ćwiczenie 7

1.Wstaw na formatce trzy przyciski z napisami :Czytaj, Wpisz do tabeli, Zamknij oraz komponent StrigGrid. Dla tego komponentu ustaw właściwość:
ColCount - 3
2.Zadekalruj w sekcji deklaracji typów:
Pracownik = record
nazwisko :String[40];
// aby zapisać łańcuch dlo pliku , konieczne jest ograniczenie liczby znaków
pensja:Currency
//jest to typ walutowy w Delphi
end;
TPlik = file of Pracownik; //zadeklarowanie typu plikowego
3.W sekcji dekalracji zmiennych globalnych, (po var , przed słowem implementation) dodaj deklarację pliku:
plik:TPlik
4.W oknie Object Inspector wybierz formatkę i dla zdarzenia OnActivate wpisz treść:
AssignFile(plik,'C : \Prac.ele'); // przypisanie pliku do zmiennej plikowej
5.Do przycisku Zamknij przypisz procedurę zamykająca formatkę
6.Do przycisku z napisem Zapis do pliku przypisz procedurę:
procedure TForm1.Button2Click(Sender : TObject);
var
p:Pracownik;
s:string;
begin
try
Reset(plik); // otwarcie pliku do zapisu
Seek(plik, FileSize(plik)); // przejście na koniec pliku aby dopisywać tam rekordy
except
begin
ShowMessage('Brak pliku , otwieram nowy');
Rewrite(plik);
end;
end;
s:=InputBox('Dane','Podaj nazwisko','');
p.nazwisko:=ShortString(s); //zamiana łańcucha długiego na krótki
tyr
s:=Input('Dane','Podaj pensję','');
p.pensja:= StrToCurr(s); //zmiana łańcucha na typ walutowy
write(plik,p); //zapis do pliku
except
ShowMessage('Złe dane');
end;
CloseFile(plik); //zamknięcie pliku
end;
7.Do przycisku z napisem Czytaj przypisz procedurę:
procedure TForm1.Button1Click(Sender : TObject);
var
k:Integer; // k - nr kolejny rekordu
p:Pracownik; //deklaracja zmiennej rekordowej do operowania na pliku
begin
Reset(plik); //otwarcie pliku do odczytu
StringGrid1.ColCount:= 3; // ustalenie ilości kolumn tabeli
StringGrid1.RowCount := FileSize(plik)+1; //ustalenie liczby wierszy tabeli = liczba rekordów pliku + 1
with StringGrid1 do //instrukcja with dla obiektu StringGrid
begin
Cells[0,0] := 'NR'; //odwołanie do koórki komponentu jak do elementów tablicy dwuwymiarowej
Cells[1,0] := 'Nazwisko'; // wpisanie nagłówków w tabeli
Cells[2,0] := 'Pensja';
end;
k:=1;
while not eof(plik) do // pętla jest powtarzana do końca pliku
begin
Read(plik,p); // czytanie elementu pliku
with StringGrid1 do
begin
Cells[0,k] := IntToStr(k);
Cells[1,k] := p.nazwisko;
Cells[2,k] := CurrToStr(p.pensja); // zmiana waluty na łańcuch
end;
k := k + 1;
end;
CloseFile(plik); // zamknięcie pliku
end;
8.Uruchom aplikację i sprawdź jej działanie, próbując możliwości wpisywania danych do tabeli
9.Dla komponentu StringGrid ustaw właściwość Options\goEditing najpierw na True, a później ponownie na False. Wypróbuj możliwość wpisywania danych dla obu ustawień

Ćwiczenie 8

1.Na formatce umieść komponenty ImageList i DrawGrid
2.Wybierz ImageList i przejdź przez menu podręczne do ImageList Editor.Utwórz listę obrazków, które chcesz umieścić w słowniku (kliknij przycisk Add a następnie po wybraniu obrazka przycisk Otwórz).
3.Dodaj do deklaracji typów (przed słowem var w części interface):
str20 = String[20];
4.Dodaj do deklaracji zmiennych globalnych (po słowie var przed słowem implementation)zmienne:
wartosć : str20; //zmienna globalna do przenoszenia wpisanego słowa między procedurami
nr:Integer; // do przeniesienia numeru komórki wpisywanego słowa
oraz tablicę stałych: zawierając angielskie nazwy przygotowanych rysunków
5.Do komponentu DarawGrid ustaw właściwości:
Align - alClient //tabela zajmuje całą powierzchnię formularza
FixedColls - 0 //cała tabela jest dostepna do edycji, brak kolumn zamrożonych
FixedRows - 0
ColCount - 20 //liczba kolumn w tabeli
RowCount - 20 //liczba wierszy w tabeli
ScrollBars - ssNone //aby można było jednoznacznie określić położenie kursora myszy, paski przewijania są niewidoczne
6.Rozwiń właściwości Options i ustaw:
goEditing - True
7.Dla zdarzenia OnDrawCell (pokrywanie komórek obrazkami) komponentu DrawGrid wpisz procedurę:
procedure TForm1.DrawGrid1DrawCell(Sender : TObject; Col, Row : Longint; Rect : TRect; State : TGridDrawState);
var
index : Integer;
begin
index := Row * DrawGrid1.ColCount + Col;
with Sender as TDrawGrid do //rzutowanie parametru na typ komponentu
begin
// umieszczanie obrazka o odpowiednim indeksie na obszarze DrawGrid
ImageList1.Draw(Canvas,Rect.Left, Rect.Top, index);
// jeśli kursor jest w polu
if gdFocused in State then
Canvas.DrawFocusRect(Rect);
end;
end;
8.Dla zdarzeniaOnSetEditText komponentu DrawGrid wpisz pocedurę:
procedure TForm1.DrawGrid1SetEditText(Sender : TObject; ACol, ARow: integer; const Value:String);
begin
wartosc := Value; //zaktualizowanie wpisanej ostatnio wartości
end;
9.Dla zdarzenia OnDblClick komponentu DrawGrid wpisz procedurę:
procedure TForm1.DrawGrid1DblClick(Sender:TObject);
begin
//LowerCase to funkcja , która zamienia wielkie litery w łańcuchu na małe. Ten sposób sprawdzania zapewnia możliwość identyfikacji napisu bez względu na wielkość liter
if LowerCase(wartosc) = nazwy[nr] then ShowMessage('Dobrze')
else ShowMessage('Źle');
end;
10.Dla zdarzenia OnClick komponentu DrawGrid wpisz procedurę:
procedure TForm1.DrawGrid1MouseDown(Sender:TObject; Button: TMouseButton;Shift : TShiftState; X, Y : Integer);
var
ilex, iley : integer;
begin
with DrawGrid1 do
begin
ilex:= x div DefaultColWidth;
iley := y div DeaultRowHeight;
nr := iley*RowCount + ilex
end;
if Button = mbRight then ShowMessage(nazwy[nr]);
end;
11.Uruchom aplikację i sprawdź jej działanie

Ćwiczenie 9

1.Na formatce umieść komponenty :
* Calendar
*dwa komponenty ProgressBar, pierwszy do pokazywania przebiegu czasu dla miesiąca i drugi dla roku
* dwie etykiety umieszczając je obok słupków ProgressBar; ustaw napisy na etykietach : Dzień miesiąca, Dzień roku
2.Wyskaluj ProgressBar z etykietą Dzień roku w następujący sposób:
Min 1
Max 365
3.Dla komponentu ProgressBar z etykietą Dzień miesiąc ustaw właściwość
Min 1
4.Wpisz procedurę OnActivate dla formularza
procedure TForm1.FormActivate(Sender :TObject);
// tablica stałych określających liczbę dni w miesiącu
const Miesiac:array[1..12] of integer = (31,28,31,30,31,30,31,3,30,31,30,31);
var
m,i , ile_dni :integer;
begin
m:=Calendar1.Month;
ProgressBar1.Max := Miesiac[m]; //maksymalna liczba dni w danym miesiącu
ile_dni := 0;
// w pętli obliczamy , ile dni upłynęło od początku roku do pierwszego dnia danego miesiąca
for i:= 1 to m-1 do
ile_dni := ile_dni+Miesiac[i];
ile_dni := ile_dni+Calendar1.Day-1;
Label2.Caption := Label2.Caption + IntToStr(ile_dni);
ProgressBar2.Position := ile_dni
; Label1.Caption := Label1.Caption + IntToStr(Calendar1.Day);
end;
5.Uruchom aplikację i sprawdź jej działanie

Ćwiczenie 10

1.Na formatce wstaw komponenty:
* Splitter do oddzielenia części formularza przeznaczonej do dialogu z użytkownikiem od prezentacji Shape
* Panel , umieść go na obszarze komponentu Splitter
* Shape, ustaw jego właściwość:
Align - alClient
* SpinButton, SpinEdit, ColorGrid , umieszczając je na panelu
* etykiety opisujące komponenty
2.Oprogramuj komponent SpinButton:
* Utwórz obrazki na przyciski:
- wybierz z menu Tools -> Image -> Editor, następnie z menu File -> New -> Bitmap File
- w oknie Bitmap Properties ustal wielkość obrazków
Width - 16
Height - 16
- przygotuj dwie bitmapy przedstawiające kółko i prostokąt - będą to obrazki na przyciski SpinButton
- zapamiętaj bitmapy w folderze, w którym budujesz aplikację, jako kolo.bmp i kwadrat.bmp
* Przypisz obrazki do przycisków:
- kliknij w polu właściwości DownGlyph i przejdź do Picture Editor
- kliknij przycisk Load i przejdź do folderu aplikacji
- wybierz bitmapę kolo.bmp
- kliknij przycisk Otwórz
- w kolejnym oknie kliknij OK
* Wykorzystując właściwości UpGlyph, przypisz w analogiczny sposób drugą bitmapę do drugiego przycisku
* Przypisz procedury obsługi:
- dla zdarzenia OnDownClick wpisz:
Shape1.Shape := stRectangle;
- dla zdarzenia OnUpClick wpisz:
Shape1.Shape:= stEllipse
3.Oprogramuj komponent SpinEdit:
* uzupełnij właściwości:
MaxLength - 1 //maksymalna liczba wprowadzonych znaków ograniczona do 1
MinValue - 0 MaxValue - 8 //mamy 9 rodzajów wypełniaczy
* dla zdarzenia OnChange wpisz procedurę:
procedure TForm1.SpinEdit1Change(Sender : TObject);
begin
// rzutowanie typu integer na typ TBrushStyle end;
* dla zdarzenia OnClic wpisz procedurę:
procedure TForm1.SpinEdit1Click(Sender : TObject);
begin
try
// zamiana wartości pobranej z okna na Integer a następnie rzutowanie na typ TBrushStyle
Shape1.Brush.Style := TBrushStyle(StrToInt(SpinEdit1.Text));
except
ShowMessage('Złe dane');
end;
end;
4.Oprogramuj komponent ColorGrid
* dla zdarzenia OnChange wpisz procedurę
procedure TForm1.ColorGrid1Change(Sender : TObject);
begin
//odbieranie z komponentu koloru tła i koloru wypełniacza
Form1.Color := ColorGrid1.BackgroundColor;
Shape1.Brush.Color := ColorGrid1.ForegroundColor;
Shape1.Pen.Color := ColorGrid1.ForegroundColor;
end;
* dla zdarzenia OnMouseDown wpisz procedurę:
procedure TForm1.ColorGrid1MouseDown(Sender :TObject; Button :TMouseButton; Shift : TShiftState; X,Y : integer);
begin
// lewy przycisk myszki umożliwia ustawienie koloru wypełniacza
with ColorGrid1 do
if Buttonn = mnbLeft then
begin
BackgroundEnabled := true;
ForegroundEnabled := False;
end else if Button = mbRight then
// prawy przycisk myszki umożliwia ustawienie koloru wypełniacza
begin
BackgroundEnabled := False;
ForegroundEnabled := true;
end;
end;
5.Aby zadziałała obsługa błędu, uruchom aplikację poza środowiskiem Delphi:
* sprawdź działanie przycisków
* sprawdź ,czy można wpisywać wartości w oknie SpinEdit
* sprawdź możliwość wyboru koloru tła prawym klawiszem myszki i koloru wypełniacza lewym przyciskiem
* sprawdź ,czy po wybraniu wypełniacza o numerze 1(bsClear) następuje kasowanie ustawień wypełnienia


CZĘŚĆ IV : Grafika w Delphi

Ćwiczenie 1

1.W nowej aplikacji odszukaj na karcie Events zdarzenie OnPaint formatki. Dwukrotnym kliknięcie przejdź do procedury-zdarzenia i wpisz kod:
procedure TForm1.FormPaint(Sender : TObject);
begin
Form1.Canvas.Font.Color := clRed;
Form1.Canvas.Font.Style :=[fsBold,fsUnderline];
Form1.Canvas.Font.Size := 20;
Form1.Canvas.TextOut(10,10.'Witaj');
end;
2.Sprawdź działanie aplikacji

Ćwiczenie 2

1.Na formatce umieść komponent Image oraz dwa przyciski z napisami :Rysuj linię i Zamknij
2.Przypisz do przycisku Rysuj linię procedurę:
procedure TForm1.Button1Click(Sender : TObject);
begin
// ustawienie koloru i stylu linii
Image1.Canvas.Pen.Color := clBlack;
Image1.Canvas.Pen.Style := psSolid;
// przesunięcie wskaźnika do punktu (10,10)
Image1.Canvas.Moveto(10,10);
// rysowanie linii do punktu bieżącego położenia wskaźnika do punktu (140,10)
Image1.Canvas.Lineto(140,10)
Image1.Canvas.TextOut(150,0, 'psSolid');
end;
3.Sprawdź działanie aplikacji

Ćwiczenie 3

1.W nowej aplikacji przejdź do edycji procedury OnPaint i wpisz kod:
procedure TFrom1.FormPaint (Sender :TObject);
var
Obraz: TBitmap;
R:TRect;
begin
Obraz := TBitmap.Create;
// pobranie bieżącego obszaru graficznego (rozmiary formatki) pod zmienną R
R := GetClientRect;
//przypisanie do zmiennej TBitmap obrazka z podanej ścieżki
Obraz.LoadFromFile('C : \ Windows \ słomiana mata.bmp ');
// podstawienie pod właściwość Brush.Bitmap zmiennej Bitmap
Form1.Canvas.Brush.Bitmap := Obraz;
//metoda rysuje wypełniony prostokąt o wielkości podanej parametrem R
Form1.Canvas.FillRect(R);
finally
// wyzerowanie właściwości Brush.Bitmap i zwolnienie zmiennej Bitmap
Form1.Canvas.Brush.Bitmap := Nil;
end;
end;
2.Odszukaj na karcie Events zdarzenia OnClick i wpisz procedurę czyszczącą formatkę. Wykorzystuje ona podstawowe ustawienie pędzla i przemalowanie formatki
procedure TForm1.FormClick(Sender : TObject);
var
R:TRect;
begin
R:=GetClientRect;
Form1.Canvas.Brush.Color := clBtmFace;
Form1.Canvas.Brush.Style := bsSolid;
Form1.Canvas.FillRect(R);
end;
3.Uruchom aplikację , obejrzyj zamalowaną formatkę, następnie kliknij aby przywrócić ustawienia standardowe

Ćwiczenie 4

1.W nowej aplikacji przejdź do edycji procedury OnPaint i wpisz kod:
procedure TFrom1.FormPaint (Sender :TObject);
var
i:Word
begin
Randomize;
for i := 1 to 500 do
Canvas.Pixels[Random(300) + 10, Random(300) + 10] := clRed;
end;
2.Uruchom aplikację

Ćwiczenie 5

1.Umieść na formatce przyciski do uruchomienia procedur: Arc i Polyline
2.Do przycisku Arc przypisz procedurę. Pobiera ona rozmiary bieżącego okna (formatka) i rysuje łuk w górnej jego części
procedure TFrom1.Button1Click (Sender :TObject);
var
R:TRect
; // zmienna do pobrania rozmiarów bieżącego okna
begin
R := GetClientRect; //zwraca współrzędne bieżącego okna
Canvas.Arc(R.Left,R.Top,R.Right,R.Bottom, R.Right, R.Top,R.Left, R.Top);
end;
3.Przypisz procedurę do przycisku Polyline:
procedure TFrom1.Button2Click (Sender :TObject);
begin
// do podawania wierzchołków łamanej wykorzystano funkcję Paint
Canvas.Polyline([Point(10,110),Point(130,110),Point(130,230),Point(10,230),Point(100,260),Point(10,110)]);
end;
4.uruchiom aplikcję , obejrzyj postać narysowanych figur
5.Przejdź do kodu, dodaj jeszcze jeden przycisk do rysowania łamanej metodą PolyLine i wpisz procedurę. Jej zadaniem jest rysowanie tej samej figury innym sposobem - przez deklarację stałej tablicowej
procedure TFrom1.Button2Click (Sender :TObject);
const
A:Array[1...4] of TPoint=((X:10;Y:10),(X:130; Y:10),(X:130 ; Y:130), (Y:10 ; Y:10));
begin
Canvas.Polyline(A);
end;
6.Sprawdź działanie aplikacji

Ćwiczenie 6

1.Umieść na formatce przyciski do uruchomienia procedur : Ellipse, Polygon. Pie i przycisk z napisem RoundRect
2.Pod przycisk Ellipse przypisz procedurę rysującą elipsę wypełnioną czerwoną kratką:
procedure TFrom1.Button1Click (Sender :TObject);
begin
// aby nie wypisywać przy każdej właściwości Form1.Canvas.... zastosowano instrukcję with
with Form1.Canvas do
begin
Pen.Color := clRed;
Brush.Color := clRed;
Brush.Style := bsCross;
Ellipse(10,180,100,200);
// przywrócenie ustawień pędzla
Brush.Style := bsSolid
Brush.Color := clBtnFace
end;
end;
3.Przypisz procedurę do przycisku Pie:
procedure TFrom1.Button10Click (Sender :TObject);
begin
Canvas.Brush.Style := bsHorizontal;
Canvas.Pie(200,10,260,80,200,10,260,40);
end;
4.Pod przycisk Polygon przypisz procedurę rysująca wielokąt:
procedure TFrom1.Button2Click (Sender :TObject);
begin
Form1.Canvas.Brush.Color := clTeal;
Canvas.Brush.Style := bsDiagCross;
Canvas.Polygon([Point(6,6), Point(90,20), Point(80,90),Point(140,100)]);
Form1.Canvas.Brush.Color := clBtnFace;
end;
5.Do przycisku RoudRect przypisz procedurę:
procedure TFrom1.Button6Click (Sender :TObject);
begin
Canvas.Brush.Color := clYellow;
Canvas.Brush.Style := bsHorizontal;
Canvas.RoundRect := (140,,150,290,80,50,10);
Canvas.Brush.Color:= clBtnFace;
Canvas.TextOut(140,190,'RoundRect(140,150,290,180,50,10)');
end;
6.Uruchom aplikację, zaobserwuj kształt, kolor i styl wypełnienia figur. Zmień w kodzie procedur usatwienia tak ,żeby wyświetlać inne figury

Ćwiczenie 7

1.Na formatce umieść dwa przyciski z napisami :fsBorder, fsSurface
2.Do przycisku fsBorder przypisz procedurę:
procedure TFrom1.Button1Click (Sender :TObject);
begin
Form1.Canvas.Brush.Color :=clYellow;
Form1.Canvas.Pen.Color := clGreen
Canvas.Polyline([Point(10,10),Point(130,10),Point(130,130),Point(10,130),Point(10,10)]);
Form1.Canvas.FloodFill(70,70, clGreen,fsBorder);
end;
3.Do przycisku z napisem fsSurface przypisz procedurę:
procedure TFrom1.Button1Click (Sender :TObject);
begin
Form1.Canvas.Brush.Color :=clYellow;
Form1.Canvas.Pen.Color := clGreen
Canvas.Polyline([Point(10,10),Point(130,10),Point(130,130),Point(10,130),Point(10,10)]);
Form1.Canvas.FloodFill(70,70, clYellow,fsSurface);
end;
4.Sprawdź działanie aplikacji

Ćwiczenie 8

1.Umieść u dołu formatki komponent ColorGrid z zakładki Samples. Ustaw właściwości komponentu:
GridOrdering - go16x // układ 16 kolorów w poziomym pasku
2.Nad komponentem ColorGrid umieść Image. rozwiń go na pozostałej części formatki
3.Dla zdarzeniaOnPaint formatki wpisz procedurę rysująca kratkę kanwy
procedure TForm1.FormPaint(Sender :TObject);
var
x,y:integer; begin
y:= Form1.Height -colorgrid1height-10;
x:= 0;
//rysowanie linii pionowych
while x < Image1.Width do
begin
Image1.Canvas.MoveTo(x,0);
Image1.Canvas.LineTo(x,y);
x:=x+10;
end;
y:=0;
// rysowanie linii poziomych
while y < Image1.Height do
begin
Image1.Canvas.MoveTo(0,y);
Image1.Canvas.LineTo(x,y);
y:=y+10;
end;
end;
4.Dla zdarzenia OnMouseDown komponentu Image wpisz procedurę malującą wskazanym kolorem wybrany myszką kwadracik
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift : TShiftState; X,Y :Integer);
begin
//ustawienie koloru wypełnienia zgodnie z kolorem wybranym przy pomocy ColorGrid
Image1.Canvas.Brush.Color := ColorGrid1.ForegroundColor;
// wypełnienie kwadratu wskazanego myszą
Image1.Canvas.FloodFil(x,y,clBlack, fsBorder);
end;
5.Uruchom aplikację. Kliknij odpowiedni kolor na komponencie ColorGrid a następnie wskaż myszką kwadracik do zamalowania

Ćwiczenie 9

1.Na formatce umieść dwa przyciski Dalej i Koniec
2.Do przycisku Koniec przypisz procedurę zamykająca aplikację
3.Pobierz komponent Image, nadaj mu odpowiednią wielkość
4.Przygotuj w oddzielnym katalogu bitmapy. Zmień nazwy tak, aby różniły się tylko cyframi, np. M1.bmp, M2.bmp
5.Do przycisku Dalej przypisz procedurę:
procedure TFrom1.Button1Click (Sender :TObject);
// deklaracja literału, przechowuje on wartość po wyjściu z procedury, zamiast tego można użyć zmiennej i zadeklarowanej globalnie
const i:Integer; = 1;
var
// zmienna przeznaczona do zmiany nazwy obrazka
st:string[2];
begin
if i = 5 then i:= 0; //5 -ilość obrazków
i := i+1;
Str(i,st);
// właściwość ustawia rozciąganie obrazka do rozmiarów komponentu Image
Image1.Stretch := True;
// jako parametr LoadFromFile musi wystąpić plik ze ścieżką, poniżej budujemy nazwę
Image1.Picture.LoadFromFile('B' + st + '.bmp');
end;
6.Uruchom aplikację i sprawdź działanie

Ćwiczenie 10

1.Na formatkę wstaw przycisk z napisem Obraz
2.Dla zdarzenia OnClick przycisku wpisz procedurę:
procedure TFrom1.Button1Click (Sender :TObject);
var
Obraz :TBitmap
begin
Obraz := TBitmap.Create;
try
with Obraz do
begin
TransparentMode := tmAuto;
// wprowadzenie obrazka z bieżącego folderu
LoadfromFile('factory.bmp');
Transparent := False;
Form1.Canvas.Draw(0,0,Obraz);
Transparent := True;
Form1.Canvas.Draw(0,190, Obraz);
end;
finally
Obraz.free;
end;
end;
3.Sprawdź działanie aplikacji

Ćwiczenie 11

1.Na formatce wstaw przycisk z napisem Obraz
2.Dla zdarzenia OnClick przycisku wpisz procedurę:
procedure TFrom1.Button1Click (Sender :TObject);
var
Obraz:TBitmap
R:TRect;
begin
Obraz:= TBitmap.Create;
try
//załadowanie danej bitmapy pod zmienną typy TBitmap
Obraz.LoadFromFile('Key.bmp');
// pobranie rozmiarów prostokąta pod zmienną R
R.TopLeft := Point(10,10);
R.BottomRight := Point(200,100);
// ustawienie bitmapy jako stylu pędzla
Canvas.Brush.Bitmap := Obraz;
// odtworzenie bitmapy z rozciągnięciem na prostokąt R
Form1.Canvas.StretchDraw(R, Obraz);
finally
//wyzerowanie właściwości Brush.Bitmap i zwolnienie zmiennej Obraz
Form.Canvas.Brush.Bitmap := Nil;
Obraz.Free;
end;
end;
3.Sprawdź działania aplikacji

Ćwiczenie 12

1.Umieść na formatce dwa przyciski z napisami :Tekst i Kółko
2.Do przycisku Tekst przypisz procedurę:
procedure TFrom1.Button1Click (Sender :TObject);
begin
Printer.BeginDoc;
Printer.Canvas.TextOut(10,10,'Delphi');
Printer.EndDoc;
end;
3.Do przycisku Kółko przypisz procedurę:
procedure TFrom1.Button3Click (Sender :TObject);
begin
Printer.BeginDoc;
Printer.Canvas.Ellipse(100,100,600,600);
Printer.EndDoc;
end;
4.Dopisz w deklaracji modułów (po słowie uses)korzystanie z modułu Printers
5.Uruchom aplikację przy włączone drukarce, wyprowadź najpierw tekst a później kółko.
6.Po sprawdzeniu działania drukarki zajmiemy się ustawieniem parametrów tekstu. Uzupełnij procedurę wydruku o ustawieniu parametrów tekstu. Uzupełnij procedurę wydruku o ustawienia rozmiaru i stylu czcionki. Dodaj druga linię tekstu. aby tekst nie zachodził na siebie, do ustalenia początku drugiej linii posłużymy się właściwością TextHeight
procedure TFrom1.Button3Click (Sender :TObject);
var
y:integer;
begin
Printer.BeginDoc;
Printer.Canvas.Font.Size := 30;
Printer.Canvas.Font.Style := [fsbold , fsitalic];
Printer.Canvas.TextOut(10,10,'Delphi');
//ustalenie początku drugiej linii
y:= 20+ Printer.Canvas.TextHeight('D');
Printer.Canvas.TextOut(10,y,'Wersja 2010');
Printer.EndDoc;
end;
7.W procedurze wydruku figur określ grubość pisaka wstawiając przed instrukcją drukowania elipsy instrukcję:
Printer.Canvas.Pen.Width := 15;
8.Uruchom ponownie aplikację i sprawdź działanie

Ćwiczenie 13

1.Wstaw na formatkę komponent Image dwa przyciski z napisami ; Z pliku na drukarkę i Z formatki na drukarkę
2.Przekopiuj do folderu aplikacji bitmapę do próbnego wydruku np. Athena.bmp z zasobów Delphi. Przypisz do komponentu Image bitmapę
3.Przypisz do przycisku Z formularza na drukarkę procedurę:
procedure TFrom1.Button4Click (Sender :TObject);
var
R:TRect;
begin
R := Image1.ClientRect;
with Printer do
begin
BeginDoc;
Canvas.CopyMode := cmSrcCopy;
Canvas.CopyRect(Rect(1,1,500,500),Form1.Canvas,R);
EndDoc;
end;
end;
4.Do przycisku Z pliku na drukarkę przypisz procedurę wyprowadzającą bitmapę na drukarkę:
procedure TFrom1.Button2Click (Sender :TObject);
var
Obraz :TBitmap;
Y:Integer;
begin
Obraz := TBitmap.Create;
// przypisanie bitmapy do zmiennej
Obraz.LoadFromFile('athena.bmp');
with Printer do
begin
BeginDoc
// ta instrukcja wyprowadza obraz w jego naturalnej wielkości
Canvas.Draw(1,1,Obraz)
// ustalenie początku drukowania drugiego obrazka
Y := Obraz.Height;
// ta instrukcja rozciąga obraz do rozmiarów prostokąta podanego funkcją Rect
Canvas.StretchDraw(Rect(1,100+Y,500,600+Y), Obraz);
EndDoc;
end;
Obraz.Free;
end;
5.Dopisz w module po sekcji uses słowo Printers
6.Skompiluj aplikację i obejrzyj postać wydruku

Ćwiczenie 14

1.Wstaw na formularz komponent Image rozciągając go do lewego górnego rogu formatki. Ustaw właściwość Stretch na wartość True.
2,Umieść poniżej dwa przyciski : Nowy obraz i Drukuj
3.Umieść komponent OpenPictureDialog do wyszukiwania z dysków obrazków
4.Przypisz do komponentu Nowy obraz procedurę:
procedure TFrom1.Button2Click (Sender :TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
5.Przypisz do przycisku Drukuj procedurę:
procedure TFrom1.Button1Click (Sender :TObject);
var
R:TRect
begin
R := Image1.ClientRect;
Printer.BeginDoc;
Printer.Canvas.CopyMode := cmSrcCopy;
Printer.Canvas.CopyRect(Rect(1,1,500,500), Form1.Canvas,R);
Printer.EndDoc;
end;
6.Skompiluj aplikację i wypróbuj działanie

Ćwiczenie 15

1.Na formatce umieść komponent Image
Rysowanie linii
2.Wpisz procedurę dla zdarzenia MouseDown komponentu Image
procedure TFrom1.Image1MouseDown (Sender :TObject; Button : TMouseButton; Shift :TShiftState; X,Y : integer;);
begin
Image1.Canvas.LineTo(X,Y);
end;
3.Dla zdarzenia FormShow formatki wpisz procedurę
procedure TFrom1.FormShow (Sender :TObject);
begin
Image1.Canvas.Refresh;
end;
4.Sprawdź działanie aplikacji klikając myszką punkty formatki.
Rysowanie elipsy
5.Zadeklaruj dwie zmienne globalne X1,Y1 typu integer. Wartości zmiennych będą przechowywały pierwszy punkt rysowanej elipsy. Zadeklaruj zmienną Kolo typu boolean, przechowującą informację ,czy rysowaną figurą jest koło.
6.W edytorze graficznym (Tools\ImageEditor) utwórz bitmapę rozmiarów 16 x 16 symbolizującą koło i nazwij ją kolo.bmp
7.Dodaj przycisk BitBtn. Ustaw właściwość
Glyph - // klikając w polu właściwości przejdź do przypisywania bitmapy i wybierz Kolo.bmp
Caption - Koło
8.Przypisz do przycisku procedurę ustawiającą zmienną informującą o rysowaniu elipsy. Zmienna ma działać jak przełącznik, ponowne kliknięcie przycisku przywraca jej wartość pierwotną
procedure TFrom1.BitBtn1Click (Sender :TObject);
begin
Kolo := not Kolo;
// sygnalizacja ,że rysowana jest elipsa
if kolo then
BitBtn1.Caption := 'Aktywny';
else
1 BitBtn1.Caption := 'kolo';
end;
9.Zmień procedurę OnMouseDown komponentu Image dopisując instrukcje przekazywania wybranych myszą wartości do zmiennych globalnych X1, Y1 oraz blokowania rysowania linii, gdy rysowane jest koło:
procedure TFrom1.Image1MouseDown (Sender :TObject; Button : TMouseButton; Shift :TShiftState; X,Y : integer;);
begin
if not Kolo then Image1.Canvas.LineTo(X,Y)
else
begin
x1 := x;
y1:= y;
end;
end;
10.Dla zdarzenia MouseUp komponentu Image przypisz procedurę rysującą elipsę od zapamiętanego punktu do punktu pobranego w procedurze
procedure TFrom1.Image1MouseDown (Sender :TObject; Button : TMouseButton; Shift :TShiftState; X,Y : integer;);
begin
if Kolo then
Canvas.Ellipse(X1,Y1,X,Y);
end;
11.Sprawdź działanie edytora

Ćwiczenie 16

1.Wstaw na formatkę Panel, ustaw właściwość Panelu
Align - alBottom
2.Na panelu wstaw dwa przyciski : Układ i Wyczyść, dwie etykiety i komponent TrackBar
3.Do zmiennych globalnych dodaj dwie zmienne ox, oy typu integer, pamiętające położenie środka układu współrzędnych, zmienną dx pamiętającą rozmiar jednostki w pikselach oraz zmienną układ typu boolean, pamiętającą czy był już rysowany na formularzu układ współrzędnych
ox,oy ,dx ; Integer;
układ : Boolean;
4.Po słowie implementation wpisz procedury wewnętrzne modułu:
procedure czysc; // procedura czyści formatkę
begin
uklad := False;
Form1.Brush.Color := clWhite;
Form1.Refresh;
end;

procedure rysuj_uklad;
// procedura rysuje układ współrzędnych na formatce
begin
if dx > 0 then
begin
with Form1.Canvas do
begin
// oś ox
MoveTo(0,oy);
LineTo(Form1.Width,oy);
// strzałki
LineTo(Form1.Width-15, oy-5);
MoveTo(Form1.Width,oy);
LineTo(Form1.Width-15, oy+5);
//oś oy
MoveTo(ox,0);
LineTo(ox,Form1.Height);
//strzałki
MoveTo(ox,0);
LineTo(ox-5, 10);
MoveTo(ox,0);
LineTo(ox+5,10);
end;
end;
end;

procedure jednostki;
// procedura rysuje jednostki układu współrzędnych
var
i:Integer;
x,y:integer;
begin
if dx > 0 then
begin
// oś ox
x := ox;
y := oy+10;
Form1.Canvas.TextOut(x,y,'0');
for i := 1 to Round(ox/dx) do
begin
x := x+ dx;
Form1.Canvas.TextOut(x,y,IntToStr(i));
Form1.Canvas.MoveTo(x,y-13)
Form1.Canvas.LineTo(x,y-3)
end;
x:=ox;
for i := -1 downto -Round(ox/dx) do
begin
x:=x-dx
Form1.Canvas.TextOut(x-3,y,IntToStr(i));
Form1.Canvas.MoveTo(x,y-13);
Form1.Canvas.LineTo(x,y-3);
end;
//oś y
y:=oy;
x := ox;
for i := 1 to Round(oy/dx) do
begin
y := y - dx;
Form1.Canvas.TextOut(x+8,y-10,IntToStr(i));
Form1.Canvas.MoveTo(x-3,y)
Form1.Canvas.LineTo(x+3,y)
end;
y:=oy;
for i := -1 downto -Round(oyx/dx) do
begin
y:=y+dx
Form1.Canvas.TextOut(x+8,y-10,IntToStr(i));
Form1.Canvas.MoveTo(x-3,y);
Form1.Canvas.LineTo(x+3,y);
end;
end;
end;
5.Ustaw dla formatki właściwości:
BorderStyle - bsToolWindow //brak możliwości zmiany rozmiaru okna
Przez rozwinięcie znaku + poprzedzającego właściwość VertScrollBar rozwiń dla formatki podopcje tej właściwości i ustaw dla tej właściwości:
Visible - False; //pionowy pasek przewijania formatki jest niewidoczny
6.Dla zdarzenia OnActivate formatki wpisz treść procedury:
procedure TForm1.FormActivate(Sender ;TObject);
begin
uklad := False;
Form1.Color := clWhite;
ox := Formw1.Width div 2 //współrzędna x punktu (0,0)
oy :== (Form1.Height - Panel1.Height) div 2 ; //współrzędna y punktu(0,0)
end;
7.Ustaw właściwości dla komponentu TrackBar
TickMarks - tmTopLeft //strzałka suwaka skierowana w górę , początkowe położenie z lewej strony
TickStyle - tsNone // bez rysowania skali suwaka
8.Dla zdarzenia OnChange komponentu TrackBar wpisz procedurę:
procedure TForm1.TrackBar1Change(Sender ;TObject);
begin
czysc
if TrackBar1.Position > 0 then
begin
TrackBar1.Max := TrackBar1.Width-10; //ustawienie skali na długość komponentu
dx:= TrackBar1.Position; //jednostka ma długość pozycji suwaka TrackBar
Label2.Caption := 'Ilość jednostek na dodatniej półosi x = ' + IntToStr(Round(ox/dx));
end;
end;
9.Ustaw właściwość Caption Label1 wpisując napis : Wybierz jednostkę
10.Dla przycisku Wyczyść wpisz treść procedury - wywołanie procedury czysc.
11.Dla przycisku Układ wpisz:
procedure TForm1.Button3Click(Sender ;TObject);
begin
if not uklad then
begin
rysuj_uklad;
jednostki;
end;
end;
12.Dodaj do aplikacji przycisk Zamknij zamykający aplikację
13.Sprawdź działanie aplikacji

Ćwiczenie 17

Do poprzedniej aplikacji dodamy możliwość wyboru jednostki przez ustalenie liczby jednostek na dodatniej półosi ox.
1.Na panelu umieść komponent SpinEdit i ustaw jego właściwość
EditorEnabled - False //zablokowanie edycji w okienku
2.Dla zdarzenia OnChnage komponentu SpinEdit wpisz procedurę
procedure TForm1.SpinEdit1.Change(Sender : TObject);
begin
if SpinEdit1.Value > 0 then
begin
czysc;
dx:=Round(ox/SpinEdit1.Value);
Label2.Caption := 'Rozmiar jednostki w pixelach ' + IntToStr(dx);
end;
end;
3.Umieść na panelu komponent RadioGroup:
* klikając w polu właściwości Items wpisz w oknie StringList Editor napisy które mają być przy przyciskach:
Liczba jednostek:
Rozmiar jednostki
* ustaw właściwość
Caption - Skalowanie osi
Index - 0
* dla zdarzenia OnClick komponentu wpisz procedurę:
procedure TForm1.RadioGroup1Click(Sender:TObject);
begin
if RadioGroup21.ItemIndex=0 then
begin
Label1.Caption := 'Wybierz ilość jednostek na osi x';
SpinEdit1.Visible := True;
TrackBar1.Visible := False;
end else
begin
Label1.Caption := 'Wybierz ilość jednostek na osi x';
SpinEdit1.Visible := false;
TrackBar1.Visible := true;
end;
end;
4.Ustaw wstępnie dla komponentu TrackBar właściwość :
Visible - False
5.Przetestuj aplikację

Ćwiczenie 18

Do powyższej aplikacji dodajemy wyświetlanie wybranej funkcji trygonometrycznej.
1.Utwórz PopupMenu o opcjach : sin(x) ,cos(x) , tg(x) i ctg(x). Przypisz Popup Menu do formatki
2.W deklaracji typów nad słowem var, dodaj deklarację typu funkcyjnego:
Funkcja == function(x:real):real;
3.Dodaj po słowie implementation procedury wewnętrzne modułu:
* definicje funkcji dla każdej funkcji trygonometrycznej. Funkcje tangens i cotangens otrzymasz z ilorazu tg(x) = sin(x)/cos(x) , ctg(x) = cos(x)/sin(x). Zabezpiecz argumenty funckji tangens i cotangens badając czy mianownik wyrażenia jest różny od zera
* procedurę rysowania wykresu wskazanej funkcji:
procedure wykres(f:Funkcja);
var
x,y: real; //współrzędne matematyczne
xf,yf,h : integer; //współrzędne ekranowe
begin
if dx > 0 then
begin
h:= 1;
xf := ox
x := 0;
y := f(x);
yf := oy - ROund(y/dx);
Form1.Canvas.Pixels[xf,yf]:=0;
//rysowanie wykresu na dodatniej półosi ox
while xf< 2*ox do
begin
xf := xf + h;
x := (xf - ox)/dx
y := f(x);
yf := Round(oy - y*dx);
Form1.Canvas.Pixels[xf,yf] := 0;
end;
xf := ox;
x := 0;
y := f(x);
yf := oy - Round(y/dx);
Form1.Canvas.Pixels[xf,yf] := 0;
// rysowanie wykresu na ujemnej półosi ox
while xf > 0 do
begin
xf := xf - h
x := (xf - ox)/ dx;
y := f(x);
yf := Round(oy - y*dx);
Form1.Canvas.Pixels[xf,yf] := 0;
end;
end else
ShowMessage('Wybierz jednostki');
end;
4.Wpisz procedury obsługi menu podręcznego:
procedure TForm1.sinxClick(Sender : TObject);
begin
wykres(sinx);
end;
zmieniając odpowiednio nazwy prezentowanych funkcji
5.Przetestuj działanie aplikacji

Ćwiczenie 19

1.Na formatce wstaw komponentTimer
2.Zadeklaruj zmienne globalne : r,g,b ;Byte
3.W części implementation modułu wpisz procedurę
procedure fazy;
var
x ;integer;
begin
Randomize;
with Form1.Canvas do
r := Random(255);
g := Random(255);
b := Random(255);
x := Random(255);
Brush.Color := RGB(r,g,b);
Ellipse(100,100,250+x,280);
end;
end;
4.Dla zdarzenia OnTimer zdefiniuj procedurę:
procedure TForm1.Timer1Timer(Sender : TObject);
begin
Form1.Color := clBtnFace //czyszczenie formatki przez nadanie koloru
Form1.Refresh; // i odświeżenie
fazy;
end;
5.Sprawdź działanie aplikacji

Ćwiczenie 20

1.Wstaw na formatkę komponent Timer.Ustaw jego właściwość :
Interval - 50
2.Zadeklaruj stałą globalna nr ; Integer i ustaw jej wartość początkową na 0
3.Wpisz procedury wewnętrzne modułu; przedstawiające kolejne fazy ruchu:
procedure faza1;
begin
Form1.Canvas.Rectangle(50,50,250,250);
end;
procedure faza2;
begin
Form1.Canvas.Rectangle(50,100,250,150);
end;
procedure faza3;
begin
Form1.Canvas.Rectangle(50,124,250,126);
end;
4.Dla zdarzenia OnTimer komponentu Timer wpisz procedurę:
procedure TForm1.Timer1Timer(Sender :TObject);
var
r:TRect;
begin
// ścieranie ekranu
r:=GetClientRect;
Form1.Canvas.Brush.Color := clBtnFace;
Form1.Canvas.FillRect(r);
// rysowanie kolejnej fazy
Form1.Canvas.Brush.Color :=clRed;
Form1.Canvas.Pen.Color := clRed;
case nr of
0:faza1;
1:faza2
2:faza3
end;
nr := (nr+1) mod 3
end;
5.Sprawdź działanie aplikacji


CZĘŚĆ V : Multimedia

Ćwiczenie 1

1.Wstaw nna formatkę przycisk z napisem Start i przypisz do niego procedurę:
procedure TForm1.Button1Click(Sender ; TObject);
begin
PlaySound('C : \ Windows \ Media \ Chimes.wav',0, SND_SYNC);
// pierwszy parametr to ścieżka do pliku typu *.wav, trzeci to sposób odtwarzania dźwięku
end;
2.Dodaj do modułu po słowie uses deklarację korzystania z modułu mmsystem
3.Sprawdź działaie aplikacji, naciskając przycisk Start

Ćwiczenie 2

1.Na formatkę wstaw komponent MediaPlayer
2.Ustaw właściwości komponentu MediaPlayer
FileName - // ścieżka do pliku *.mid
AutoOpen - True
AutoRewind - True
Enabled - True
3.Sprawdź działanie przycisków komponentu Media Player
4.Dodaj do formularza dwa przyciski Start i Koniec
5.Do przycisku Start przypisz procedurę:
procedure TForm1.Button1Click(Sender ; TObject);
begin
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
6.Do przycisku Koniec przypisz procedurę:
procedure TForm2.Button1Click(Sender ; TObject);
begin
MediaPlayer1.Stop;
MediaPlayer1.Close;
end;
7.Wypróbuj działanie

Ćwiczenie 3

1.Na formatkę wstaw komponenty Panel oraz dwa przyciski :Start i Koniec, a także MediaPlayer
2.Ustaw właściwości koponentu MediaPlayer:
FileName - ścieżka do pliku *.avi
DeviceTYpe- dtAutoSelect
AutoOpen - True
AutoRewind - true
Display - Panel1
Enabled - True
3.Do przycisku Start przypisz procedurę:
procedure TForm1.Button1Click(Sender : TObject);
begin
with MediaPlayer1 do
begin
Open;
// ustawianie obszaru odtwarzania
DisplayRect := Rect(0,0,Panel1.Width,Panel1.Height);
Play;
Notify := True;
end;
end;
4.Do przycisku Koniec przypisz procedurę:
procedure TForm1.Button2Click(Sender : TObject);
begin
MediaPlayer1.Stop;
MediaPlayer1.CLose;
end;
5.Sprawdź działanie aplikacji


CZĘŚĆ VI : Bazy danych w Delphi

Stworzymy aplikację obsługującą bazę danych .Baza będzie się składać z dwóch tabel: Pracownik.dbf i Dzialy.dbf. Tabele są połączone wspólnym polem KOD przedstawiającym kod działu. Będą one tworzone przy użyciu Datbase Sektop

Ćwiczenie 1

1.Uruchom program Database Desktop
2.Wybierz z menu : File -> New -> Table, w oknie wybierz typ tabeli : dBase for Windows - i zatwierdź przyciskiem OK
3.Wprowadź kolejno nazwy pól oraz typy pól :
Field Name : NAZWISKO, IMIE, DATA_UR, KOBIETA, PENSJA, UWAGII, FOTKA, DATA_ZA, NR,DZIAŁ
Type: Character,Character,Date,Logical,FLoat,Memo,Binary,Date,Number,Character
Size: 20, 20 ,-, - ,8,-, -, -, 2, 4
Dec : -, -, -, -, 2, -, -, -, -, -,
4.Wciskając przycisk Define przejdź do definiowania indeksów. Jeśli nie otworzy się okno indeksowania, sprawdź czy pola i ich rozmiary są zdefiniowane poprawnie.
5.Zdefiniuj jako główny indeks NR , zaznacz dla niego pole Unique. Oznacza to ,że wartości w polu nie mogą się powtarzać. W oknie Save Index As potwierdź nazwę przyjętą jako Index Tag Name, wciskając przycisk OK. Utwórz indeksy dodatkowe według pól numerycznych, pól daty i pól znakowych. Przy definiowaniu tych indeksów nie wybieraj Unique
6.Wciskając przycisk Save As, zapisz tabelę w folderze C : \ Baza pod nazwą Praownik.dbf
7.Nie wprowadzaj rekordów! Rekordów wprowadzonych w Database Desktop nie można już w Delphi poprawić

Ćwiczenie 2

1.Zapisz nową aplikację (pusty formularz) w nowym folderze. Nadaj mu nazwę Wczytywanie.dpr
2.Wprowadź na formatkę komponenty i ustaw ich właściwości:
* Table z karty Data Access:
- DatabaseName : pozostaw puste
- TableName : C : \ Baza \ Pracownik.dbf // ścieżka do tabeli
Po ustawieniu tych właściwości ustaw:
- Active : True
Jeśli podczas budowania formularza samoczynnie pole to ustawi się na False (brak dostępu do bazy), należy ponownie ustawić je na True
* DataSource :
- DataSet - Table1
* DBNavigator :
- DataSource - DataSource1
3.Wybierz komponent Table, prawym klawiszem myszki przejdź do menu podręcznego, wybierz Fields Editor (Edytor Pól). W oknie Edytora Pól otwórz menu podręczne i wybierz Add all fields. W oknie edytora pokażą się pola tabeli. Trzymając klawisz SHIFT wyselekcjonuj wszystkie, zwolnij SHIFT i przenieś myszką wyselekcjonowane pola na formularz
4.Przenieść pola na formularz tak aby były widoczne
5.Obejrzyj w Inspektorze Obiektów typy wprowadzonych pól. Sprawdź , że każde z tych pól ma ustawione właściwości:
DataSource - DataSource1
DataField - // prezentowane pole tabeli
6.Usuń komponent DBEdit wyświetlający pole DZIAL a na jego miejsce wprowadź z karty DataControls komponent DBComboBox. Ustaw jego właściwości:
* DataSource - DataSource1
* DataField - // wybrane z listy pole DZIAL
* Items - //wchodzimy do edytora i wpisujemy w kolejnych liniach: kadr, gosp, prod
7.Wprowadź na formularz komponenty : OpenPictureDialog z karty Dialogs i przycisk polecenia. Ustaw napis na przycisku 'Dodaj fotkę'. Dla zdarzenia OnClick wpisz procedurę:
procedure TForm1.Button1Click(Sender : TObject);
begin
// przejście do edycji pól bazy. Jeśli nie ma tej instrukcji, pokazywane obrazki nie są zapamiętywane w polu
Table1.Edit;
// załadowanie obrazka do pola
if OpenPictureDialog1.Execute then
DBImage1.PictureLoadFromFile(OpenPictureDialog1.FileName);
end;
8.Uruchom aplikację, sprawdź działanie przycisków nawigacyjnych, wpisz dwa rekordy według załączonej tabeli. Pole FOTKA uzupełnij, korzystając z przycisku Dodaj Fotkę
9.Sprawdź , czy wprowadzone zmiany zostaną utrwalone w tabeli przy następnym uruchomieniu programu

Ćwiczenie 3

1.Otwórz poprzednią aplikacje i dodaj komponent DateTimePicker, ustaw jego właściwość Visible na False. Dodaj etykietkę z napisem Wprowadzenie daty
2.Dodaj pole DBText do wyświetlania pola DATA_ZAT oraz etykietę do opisu pola.
3.Dla zdarzenia OnClick komponentu DBNavigator wpisz procedurę:
procedure TForm1.DBNavigator1Click(Sender : TObject; Button : TNavigateBtn);
begin
if Table1.FieldByName('DATA_ZAT').DisplayText = '' then
begin
Label1.Visible := True;
DateTimePicker1.Visible := True;
end
else
begin
Label1.Visible := False;
DateTimePicker1.Visible := False;
end;
end;
4.Dla zdarzenia OnChange komponentu DateTimePicker wpisz procedurę:
procedure TForm1.DateTimePicker1Change(Sender :TOjbect);
begin
// przejście do edycji tabeli
Table1.Edit;
// wypełnienie pola DATA_ZAT datą wybraną z komponentu DateTimePicker
Table1.FieldValues['DATA_ZAT'] := DateTimePicker1.Date;
end;
5.W oknie Object Inspector wybierz z listy powyższą procedurę dla zdarzenia OnClick komponentu DateTimePicker
6.Uruchom aplikację i sprawdź możliwości wprowadzenia nowego rekordu.

Ćwiczenie 4

1.Wykorzystując Database Desktop, utwórz tabelę Działy.dbf o następujących polach:
Nazwa : NAZWA_D, KOD, NR_KIER,OPIS
Typ: C , C , N, M
Rozmiar : 20, 4, 2, -
Zbuduj indeks podstawowy według pola KOD i indeksy dodatkowe według innych pól,z wyjątkiem pola Memo
2.Na formularzu wstaw komponenty : Table, DataSource, ustawiając ich właściwości jak w poprzednim ćwiczeniu
3.Do przeglądania danych wykorzystaj komponent DBGrid z karty DataControls. Nadaj mu wielkość tabeli do przeglądania i ustaw jego właściwości:
DataSource - DataSource1
4.Przejdź do projektu formularza i klikając prawym klawiszem myszki komponent DBGrid wybierz z menu podręcznego Columns Editor
* wciśnij przycisk Add all fields
* w oknie komunikatu Delete Existing Columns wybierz Yes
* zaznacz pole OPIS i klawiszem DEL wykasuj to pole.
Sprawdź ,że w tabeli DBGrid nie ma już pola OPIS
5.Z boku przeglądarki dodaj pole DBMemo do edycji pola OPIS. Ustaw właściwości dla pola:
* DataSource - DataSource1
* DataFiled - OPIS
6.Uruchom aplikację, sprawdź możliwość edycji w tabeli. Aby zatwierdzić wpisywany wiersz , przejdź klawiszem TAB do następnego wiersza. Sprawdź, czy wpisane rekordy będą w tabeli po ponownym uruchomieniu programu.
7.Wpisz do tabeli poniższe rekordy, pole OPIS pozostaw puste:
NAZWA_D : Dział gospodarczy, Dział produkcyjny, Dział kadr
KOD : gosp, prod, kadr
NR_KIER : 1 ,2, 5
8.Sprawdź możliwości komponentu DBGrid: przemieszczenie kolumn, zmianę rozmiaru i ukrwanie kolumn
9.Przemieszczając się między rekordami tabeli wpisz w polu Memo charakterystykę każdego działu

Ćwiczenie 5

1.Na formularzu wprowadź komponenty TAble, DataSource , DBGrid
* Powiąż DataSource i Table ustawiając dla DataSource
DataSet - Table1
* Dla komponentu Table wyselekcjonuj:
DatabaseName - // pozostaw puste
TableName - // wpisz ścieżkę do folderu z bazą danych Pracownik.dbf
Active - True
* dla komponentu DBGrid ustaw właściwość:
DataSource - DataSource1
2.Klikając prawym klawiszem myszki komponent Table uaktywnij menu podręczne wybierz opcję Fields Editor
* rozwiń menu podręczne na obszarze edytora pól i wybierz Add Fields
* dodaj pola : NAZWISKO , IMIE
3.Uruchom aplikację i sprawdź, że teraz tylko wybrane pola pokazują się w przeglądarce
4.Przejdź do projektu, kliknij prawym klawiszem komponent DBGrid i wejdź przez menu podręczne do Columns Editor. Wciśnij przycisk Add all fields i operując przyciskami Columns Editor sprawdź możliwości przemieszczania pól w przeglądarce, usuwania i dodawania nowych (dodawać możesz tylko z zakresu uwzględnionego w komponencie Table)
5.Dodaj komponent DBEdit ,spróbuj go powiązać z polem DZIAL. Nie jest to możliwe ponieważ pole DZIAL nie jest udostępnione. Wykasuj komponent.
6.Wybierz Table i korzystając z Fields Editor dodaj pole FOTKA przeciągając pole FOTKA z edytora pól na formularz. Przejdź przez menu podręczne komponentu DBGrid do Columns Editor, dodaj wszystkie pola i wykasuj z przeglądarki pole FOTKA
7.Sprawdź działanie przeglądarki

Ćwiczenie 6

1.Otwórz aplikację Pracownik.dbf
2.Kliknij prawym klawiszem myszki komponentTable i wybierz z menu podręcznego Fields Editor:
* kliknij obszar edytora pól i wybierz Add all fields - dodaj wszystkie pola
* kliknij ponownie i wybierz New field:
- w polu tekstowym wpisz nazwę pola : PREMIA, typ pola Currency
- zaznacz Calculated
- potwierdź wciskając OK
* przeciągnij myszką pole PREMIA na formularz
3.Wybierz komponent Table i dla zdarzenia OnCalsFields wpisz procedurę:
procedure TForm1.Table1CalcFields(DataSet :TDataSet);
begin
DataSet['Premia'] := DataSet['Pensja'] * 0.20;
end;
Analogicznie postępujemy , gdy przeglądarką bazy jest DBGrid

Ćwiczenie 7

1.Otwórz aplikację Wczytywanie.dpr(realizująca wprowadzanie danych do tabeli Pracownik.dbf)
2.Wybierz komponent Table1 prawym klawiszem myszki przejdź do edytora pól (Fields Editor)i dodaj wszystkie pola
3.Dodaj do formularza komponenty DatSource2, Table2 do obsługi tabeli Działy.dbf i powiąż je z tabelą
4.Klikając prawym klawiszem myszki komponent Table1, przejdź do okna Fields Editor , dodaj nowe pole (New Field) i wypełnij okno edytora pól w następujący sposób:
Name - WYDZIAL
Type - String
FieldType - Lookup // ten typ pola oznacza pole przeglądowe
KeyFields - DZIAL // to pole będzie uzupełniane, zawarte jest w aktualizowanej tabeli
DataSet - Table2
LookUpKeys - KOD // zawartość tegop pola będzie przekazywana do pola DZIAL, jest to pole tabeli dzialy.dbf 5.Wciśnij OK. Przeciągnij myszką pole WYDZIAL z okna Fields Editor na formularz
6.Uruchom aplikację i sprawdź ,czy zmiany w polu WYDZIAL pociągają za sobą zmiany w polu DZIAL
7.Powróć do projektu, wykasuj pole DZIAL i przeciągnij na jego miejsce pole WYDZIAL
Pola kluczowe muszą być poindeksowane!

Ćwiczenie 8

1.Na nowym formularzu wstaw Splitter do podziału formularza. Komponent ten stosujemy wyłącznie ze względów estetycznych:
* w lewej części Splittera utwórz przeglądarkę tabeli Pracownil.dbf
- wprowadź komponenty :Table, DBNavigator, DataSource
- ustaw właściwości dla tych komponentów
- metodą przeciągania pól utwórz na formularzu przeglądarkę tabeli
- sprawdź działanie przeglądarki
* w prawej części Splittera utwórz przeglądarkę z tabeli Dzialy:
- wprowadź komponenty : Table, DBNavigator, DataSource - metodą przeciągania pól utwórz na formularzu przeglądarkę tabeli
- sprawdź działanie przeglądarki
Tak utworzony formularz nie zapewnia powiązań między tabelami, co oznacza ,że zmiany w jednej tabeli nie pociągają za sobą zmian w drugiej tabeli.
2.Wiązanie tabel:
* dla komponentu Table1 ustaw właściwość:
MasterSource - DataSource2
* przyciskiem w polu MastrerFields przejdź do okna Field Link Designer i utwórz relacje :
- z listy rozwijalnej na górze okna Available Index wybierz pole do połączenia (tu DZIAL); pole to pokaże się w oknie Detail Fields
- w oknie z prawej Master Fields wybierz pole z bazy nadrzędnej (tu KOD)
- wybierz oba pola klikając myszką
- wciśnij ADD i OK
3.Sprawdź działanie aplikacji, odpowiedniość pól w tabeli nadrzędnej i podrzędnej. Sprawdź, czy dla danego działu przyciskami tabeli Pracownik.dbf można wybrać pracowników tego działu

Ćwiczenie 9

1.Utwórz przelądarkę tabeli Pracownik.dbf za pomocą komponentów : Table,DataSource, DBGrid. Wejdź poprzez menu podręczne do Columns Editor i uporządkuj ustawienia kolumn:
* wciśnij przycisk Add All Fileds
* zaznacz z lewej strony okna numer przemieszczanej kolumny i posługując się przyciskami MoveUp, MoveDown ustaw kolejność pól
* wciskając przycisk Delete dla odpowiedniego numeru wykasuj z przeglądarki pola FOTKA i UWAGI
2.Dodaj na formularzu komponenty DBImage i DBMemo, powiąż je z polami FOTKA i UWAGI
3.Dodaj u góry tabeli DBGrid przycisk z napisem Pokaż gdzie pensja > 1000
4.Przypisz do przycisku procedurę:
procedure TForm1.Button1Click(Sender : TObject);
begin
Table1.Filtered := not Table1.Filtered; // przełączanie stanu filtrowania
if Tbale1.Filtered
then
Button1.Caption := 'Pokaż całą bazę'
else
Button1.Caption := 'Pokaż gdzie pensja > 1000';
end;
5.Dla zdarzenia OnFilteredRecord komponentu Table wpisz procedurę
procedure TForm1.Table1FilterRecord(DataSet : TDataSet ; var Accept : Boolean);
begin
Accept := DataSet['PENSJA'] > 1000;
end;
6.Sprawdź działanie aplikacji

Ćwiczenie 10

1.Dla poprzedniej aplikacji dodaj przycisku Szukaj
2.Dla zdarzenia OnClick przycisku wpisz procedurę:
procdure TForm1.Button2Click(Sender : TObject);
var
nazwisko:string[20]
begin
nazwisko := InputBox('Wczytywanie nazwiska', 'Podaj nazwisko', '');
if Table1.Locate('Nazwisko',nazwisko,[loCaseInsensitive]) then
ShowMessage('Znalezione nazwisko ' + Table1['Nazwisko']) else
ShowMessage('Brak nazwiska ' + nazwisko);
end;

Ćwiczenie 11

1.Otwórz przeglądarkę tabeli Pracownik.dbf opartą na DBGrid. Utwórz PopupMenu dla formularza z opcjami kolejnych porządków sortowania. Przypisz PopupMenu do formularza
2.Do opcji menu przypisz procedury
procedure TForm1.Uporzadkujwgnazwiska1Click(Sender : TObject);
begin
Table1.IndexName := 'Nazwisko';
end;
zmieniając odpowiednio nazwy indeksów
3.Sprawdź działanie aplikacji

Ćwiczenie 12

1.Do poprzedniej aplikacji dodaj komponent HeaderControl. Rozciągnij HeaderControl na obszarze nagłówka tabeli
2.Ustaw właściwości HotTrack na True
3.Przejdź do właściwości Sections, przyciskiem w polu przejdź do edytora i dodaj sekcje nagłówka:
* wciśnij przycisk Add
* kliknij utworzoną sekcję nagłówka
* w oknie Object Inspector dla sekcji wypełnij właściwość Text nazwą nagłówka kolumny - jest to napis wyświetlany w sekcji nagłówka
* ustal rozmiar sekcji zgodny z szerokością odpowiedniej kolumny wpisując długość sekcji we właściwości Width
4.Wyselekcjonuj nagłówek, przejdź do zdarzenia OnSectionClick i wpisz procedurę:
procedure TForm1.HeaderControl1SelectionClick(HeadeControl : THeaderControl; Section : THeaderSection);
var
i:integer;
begin
for i := 0 to 4 do
if HeaderControl1.Sections[i] = Section then
//sprawdzenie , która sekcja nagłówka jest wybrana
begin
Case i of
0:Table1.IndexName := 'NAZWISKO';
1:Table1.IndexName := 'IMIE';
2:Table1.IndexName := 'DATA_UR';
3:Table1.IndexName := 'NR';
4:Table1.IndexName := 'PENSJA';
end;
end;
end;
5.Uruchom aplikację i sprawdź jej działania

Ćwiczenie 13

1.Wprowadź do projektu dwa formularz:
* formularz Form2 będzie zawierać komponenty wspomagające raport oraz sam raport
* formularz Form1 to formularz sterujący: włącz i wyłącz utworzony raport
2.Na formularzu Form2 wstaw komponenty DataSource i Table. Ustaw ich właściwości tal ,aby prezentowały bazę Pracownik.dbf
3.Z karty QReport wprowadź na formularz Form2 komponent QuickRep i rociągnij go na całą stronę
4.Dla komponentu QuicRep uzupełnij właściwości:
DataSet - Table1
Kliknij właściwość Bands. Nastąpi przejście do właściwości szczegółowych obiektu Bands.Ustaw właściwości:
HasDetail - True
5.Pobierz QRDBText, umieść w sekcji Detail i uzupełnij właściwości:
DataSet - Table1
DataField - NAZWISKO
6.Pobierz QRDBText dla uzupełnienia imion. Ustaw właściwości :
DataSet - Table1
DataField - IMIE
7.Pobierz do sekcji Detail komponent QRDImage i ustaw jego właściwości:
Dataset - Tabela1
DataField - FOTKA
8.W celu wstępnego obejrzenia raportu wyselekcjonuj QuickRep i wybierz z menu podręcznego (prawy przycisk myszki) Preview (podgląd wydruku)
9.Dodaj do formularza Form1 przycisk do podglądu wydruku. Ustaw napis na przycisku na Podgląd wydruku i wpisz procedurę OnClick:
procedure TForm1.Button2Click(Sender :TObject);
begin
Form2.QuicRep1.Preview
end;
10.Dodaj do formularza Form1 przycisk z napisem Drukuj, otwierający drukowanie i wpisz procedurę dla zdarzenia OnClick
procedure TForm1.Button3Click(Sender :TObject);
begin
Form2.QuicRep1.Print
end;
11.Skompiluj aplikację, wciskając przycisk Yes w oknie komunikatu dodaj do formularza brakujące elementy
12.Uruchom program i sprawdź działanie

Ćwiczenie 14

1.Utwórz nową aplikację i zapisz ją w folderze Kreator1
2.Wybierz z menu : Database\Form Wizard
3.W oknie kreatora aplikacji baz danych wybierz opcje:
Create a Simple Form
Create a form using TTablce Objects
//tworzenie pojedynczego formularza z użyciem komponentu Table
4.W oknie wyboru tabeli wybierz tabelę Pracownik.dbf
5.Przeprowadź wszystkie pola tabeli z okna Available do okna Order selected Fields
6.Przegrupuj je takl ,aby pole NR było na pierwszej pozycji
7.W oknie dotyczącym położenia pól na formularzu wybierz Vertically
8.Zaznaczając opcję Left określ położenie etykiet przy polach
9.W oknie Form Generation wybierz Form Only - generowanie formularza
10.Efektem tego działania będzie utworzenie formularza zaopatrzonego w pełny zestaw komponentów do utworzenia przeglądarki. Wybierz komponent Table i ustaw właściwość :
Active : True
11.Zapisz wygenerowany moduł i pliki formularza w folderze z aplikacją
12.Umieść przycisk na formularzu głównym (Form1) przeprowadzający do wygenerowanego formularza Form2
13.uruchom aplikację i sprawdź działanie

Ćwiczenie 15

1.Wybierz z menu : Database\Form Wizard
2.W oknie kreatora aplikacji baz danych wybierz opcje:
Create a master/detail Form
Create a form using TTablce Objects //tworzenie formularza dla powiązanych tabel
3.Wybierz tabelę nadrzędną relacji : Dzialy.dbf
4.Przeprowadź wszystkie pola tabeli z okna Available do okna Order selected Fields
5.W oknie dotyczącym położenia pól na formularzu wybierz Vertically
6.Zaznaczając opcję Left określ położenie etykiet przy polach
7.W kolejnym oknie wybierz tabelę podrzędną relacji : Pracownik.dbf
8.Przeprowadź wszystkie pola tabeli z okna Available do okna Order selected Fields
9.W oknie dotyczącym położenia pól wybierz : In a grid
10.W oknie tworzenia relacji między tabelami ustaw opcje:
Available index : DZIAL
Detail Fields - zaznacz w oknie pole DZIAL
Master Fields - zaznacza oknie pole KOD
wiciśnij przycisk Add
11.W oknie Form Generation wybierz:
Generate a main form - generowanie formularza głównego
Form Only - generowanie formularza bez modułu danych
12.Efektem tego działania będzie utworzenie formularza głównego zaopatrzonego w pełny zestaw komponentów do utworzenia przeglądarki dwóch powiązanych tabel. Wybierz kolejno komponenty Table i ustaw właściwość:
Active : True
13.Wybierz komponent Table2 (reprezentujący tabelę Pracownik.dbf) , przejdź do Fields Editor i dodaj wszystkie pola. Aby umożliwić oglądanie zdjęć i notatek przenieś pola FOTKA i UWAGI na forularz
14.W tabeli DBGrid przejdź przez menu podręczne do Fields Editor, dodaj wszystkie pola i usuń te, które nie muszą być pokazywane : NR. FOTKA,UWAGI, KOD
15.Zapisz wygenerowany moduł i pliki formularza
16.Uruchom aplikację i sprawdź działanie

Ćwiczenie 16

1.Przekopiuj plik baza danych do folderu Apl_baza
2.Utwórz nową aplikację, zmień nazwę formularza głównego (name) na Sterowanie i zapisz aplikację w folderze Apl_baza nadając nazwę dla projektu i formularza odpowiednio : SterowanieP i SterowanieU
3.Utwórz menu głównego o opcji Przeglądanie zawierającej opcje podrzędne : Pracownik, Wydziały, Skład osobowy wydziałów
4.Wybierz opcję DataBase\Form Wizard i utwórz przeglądarkę tabeli Pracownik określając w oknie dotyczącym typu formularza Form Onlybez zaznaczania opcji Generate a min form. Nadaj nazwę formularzowi - Pracownik i zapisz formularz i moduł nadając modułowi nazwę PracownikU. Ustaw dla komponentu Table właściwość:
Active : True
5.Ponownie wybierz opcję DataBase\Form Wizard i utwórz przeglądarkę tabeli Działy tworząc formularz podrzędny bez zaznaczania opcji Generate a main form. Zmień nazwę formularza i zapamiętaj formularz i moduł.
6.Wygeneruj przeglądarkę tabel połączonych (przegląd pracowników wydziałów) i zapisz jej pliki w folderze z aplikacją
7.Przejdź do opcji Project\Options, wybierz kartę Forms i przenieś formularz z okna Auto-create Forms do okna Available Forms pozostawiając w oknie Auto-creative Forms formularz Sterowanie
8.Przejdź do pliku projektu, wykasuj polecenie tworzenia formularzy podrzędnych pozostawiając jedynie tworzenie formularza Sterowanie. Treść projektu po zmianie:
begin
Application.Initialize;
Application.CreateForm(TSterowanie, Sterowanie);
Application.Run
;
end.
9.Dla opcji menu głównego wpisz kod procedur tworzenia formularzy podrzędnych. Poniżej przedstawiony jest kod tworzenia formularza Pracownik
procedure TSterowanie.Pracownik1Click(Sender : TObject);
begin
. if Pracownik = Nil then // sprawdzenie , czy formularz istnieje
Pracownik : TPracownik.Create(Application); // gdy nie istnieje, utworzenie formularza przez wywołanie konstruktora Create
Pracownik.Show; //wyświetlenie utworzonego formularza
end;
10.Dla formularzy podrzędnych w procedurze dla zdarzenia OnClose usatw sposób zamykania formularza na likwidowanie z pamięci .Dla formularza Pracownik procedura przyjmuje postać:
procedure TPracownik.FormClose(Sender : TObject; var Action : TCloseAction);
begin
Action := caFree; // wywołanie procedury zwalniania pamięci
end;
11.Dla zdarzenia OnDestroy (likwidacja obiektu) formularzy podrzędnych przypisz odpowiedniej zmiennej wartość zera wskaźnikowe.Postać procedury dla formularza Pracownik:
procedure TPracownik.Form.Destroy(Sender :TObject);
begin
Pracownik := Nil;
end;
12.Skompiluj aplikację, wciskając przycisk Yes w pokazującym się oknie komunikatu dodaj do projektu brakujące elementy.
13.Uruchom aplikację i sprawdź działanie