You are on page 1of 24

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE

Aplikacje w Delphi.
Przykady. Wydanie II
Autor: Teresa Pamua
ISBN: 83-246-0576-2
Format: B5, stron: 360

ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Delphi to jedno z najpopularniejszych rodowisk programistycznych. Koncepcja


poczenia znanego i atwego do opanowania jzyka Pascal z moliwociami
projektowania obiektowego oraz technik tworzenia aplikacji z komponentw, dziki
ktrej mona byskawicznie zbudowa szkielet programu, zyskaa ogromne uznanie
wrd programistw. Delphi ma ogromn liczb uytkownikw, a moliwoci
najnowszych wersji sprawiaj, e narzdzie to wykorzystywane jest coraz
powszechniej. Ostatnia edycja Delphi umoliwia take tworzenie aplikacji dla platformy
.NET oraz aplikacji internetowych.
Aplikacje w Delphi. Przykady. Wydanie II to ksika przedstawiajca wycznie
praktyczne aspekty wykorzystania tego rodowiska programistycznego.
Dziki zaprezentowanym w niej przykadom nauczysz si stosowa komponenty,
za pomoc ktrych mona utworzy elementy interfejsu uytkownika (menu rozwijane,
paski narzdzi i listy wyboru), a take dowiesz si, jak pobiera dane z plikw
zewntrznych i bazy danych oraz tworzy nowe komponenty.
Elementy projektu w Delphi 2006
Tworzenie menu rozwijanego
Paski narzdzi
Formatowanie i wywietlanie danych na ekranie
Okna dialogowe i okna komunikatw
Edytor tekstu zbudowany na podstawie komponentw
Wywietlanie tabel i wykresw
Komunikacja z bazami danych
Praca z systemem plikw
Sprawd, jak inni rozwizali problemy, ktre napotkae, programujc w Delphi

Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl

Wprowadzenie .................................................................................. 7
Rozdzia 1. Projektowanie aplikacji w Delphi 2006 .............................................. 9
rodowisko zintegrowane Delphi IDE .........................................................................10
Elementy projektu aplikacji .............................................................................................12
Standardowe waciwoci komponentw .........................................................................14
Standardowe zdarzenia .....................................................................................................14

Rozdzia 2. Podstawowe skadniki aplikacji ....................................................... 19


Okno aplikacji ..................................................................................................................19
Ikona aplikacji ..................................................................................................................24
Wywietlanie napisw ......................................................................................................24
Rodzaje przyciskw, podobiestwa i rnice ..................................................................29
Etykiety i przyciski ...........................................................................................................33

Rozdzia 3. Menu gwne i podrczne, pasek narzdzi ........................................ 37


Wielopoziomowe menu gwne .......................................................................................37
Przyporzdkowanie polece opcjom menu ......................................................................39
Menu podrczne ...............................................................................................................44
Polskie litery w nazwach polece menu .......................................................................45
Pasek narzdzi TToolBar .................................................................................................46

Rozdzia 4. Wprowadzanie danych, formatowanie i wywietlanie na ekranie ....... 49


Liczby funkcje konwersji i formatowanie. Przecinek czy kropka? ............................50
Daty funkcje konwersji i formatowanie daty i czasu ..................................................52
Systemowe separatory liczb i daty ...................................................................................54
Wprowadzanie danych za pomoc okienek edycyjnych TEdit ........................................55
Wprowadzanie danych za pomoc okienek InputBox i InputQuery ................................62
Sposoby zabezpieczania programu przed bdami przy wprowadzaniu danych .............63
Maskowanie danych wejciowych .............................................................................63
Blokowanie moliwoci wprowadzania niektrych znakw, np. liter lub cyfr .........65
Korzystanie z funkcji konwersji StrToIntDef (z wartoci domyln) .....................66
Zmiana zawartoci okienka TEdit za pomoc suwaka TScrollBar ..........................66
Zmiana zawartoci okienka TEdit za pomoc komponentu TUpDown ....................67
Stosowanie instrukcji obsugi wyjtkw ...................................................................68
Obliczenia. Wybrane funkcje moduu Math ....................................................................70

Aplikacje w Delphi. Przykady

Rozdzia 5. Okienka komunikatw .................................................................... 73


Wywietlanie komunikatw z napisami staymi w jzyku systemowym
MessageBox ..............................................................................................................74
Wywietlanie komunikatw za pomoc funkcji ShowMessage, MessageDlg,
MessageDlgPos ..............................................................................................................75

Rozdzia 6. Okienka dialogowe z karty Dialogs .................................................. 81


Rozdzia 7. Listy wyboru TListBox i TComboBox ............................................ 87
Dodawanie elementw do listy ........................................................................................89
Wybieranie elementw z listy ..........................................................................................90
Sposoby wywietlania elementw listy ............................................................................93
Lista z nazwami czcionek ................................................................................................95
Blokowanie edycji dla listy TComboBox ........................................................................95
Czytanie i zapisywanie zawartoci listy do pliku dyskowego .........................................96

Rozdzia 8. Prosty edytor komponent TMemo .............................................. 99


Kopiowanie, wycinanie i wklejanie tekstu .............................................................................101
Czytanie i zapisywanie tekstu do pliku ..........................................................................102
Wywietlanie informacji o pooeniu kursora ...............................................................102
Automatyczne kasowanie linii niezawierajcych liczb lub wybranych znakw .......103
Wywietlanie wsprzdnych kursora w polu TMemo i zegara na pasku TStatusBar ..104

Rozdzia 9. Grupowanie komponentw .............................................................. 109


Pola opcji i pola wyboru .................................................................................................109
Komponenty grupujce ..................................................................................................110
Ramka TBevel ................................................................................................................115

Rozdzia 10. Komponenty do wyboru daty i czasu TDateTimePicker


i TMonthCalendar ....................................................................... 117
Rozdzia 11. Zakadki TTabControl i TPageControl ............................................ 121
Rozdzia 12. Odmierzanie czasu komponent TTimer ...................................... 127
Rozdzia 13. Grafika w Delphi korzystanie z metod obiektu TCanvas ............. 131
Wywietlanie prostych figur geometrycznych i tekstu ..................................................132
Rysowanie trwae zdarzenie OnPaint ...................................................................139
Rysowanie po formularzu i bitmapie .............................................................................141
Przykady animacji w Delphi .........................................................................................144

Rozdzia 14. Wywietlanie obrazw komponent TImage ............................... 151


Rysowanie po obrazie ....................................................................................................153
Binaryzacja obrazu .........................................................................................................154
Skalowanie obrazw ......................................................................................................157
Przegldanie wczytanych obrazw ................................................................................160
Wywietlanie zawartoci listy obrazkw TImageList ...................................................161

Rozdzia 15. Tabelaryzacja danych komponent TStringGrid, TDrawGrid


i TValueListEditor ......................................................................... 163
Ustalanie podstawowych parametrw tabeli ..................................................................166
Wypenianie tabeli danymi .............................................................................................168
Wybieranie komrek tabeli ............................................................................................170
Filtrowanie wprowadzanych danych ..............................................................................173
Niestandardowe przejcie do kolejnej komrki klawisz Enter .................................175
Zmiana koloru i wyrwnania tekstu w wybranych komrkach .....................................176
Wywietlanie tekstu w komrce w dwch wierszach ...................................................180

Spis treci

5
Totolotek ........................................................................................................................182
Tabela i lista ...................................................................................................................184
Tabela TDrawgrid ..........................................................................................................185
Tabela TValueListEditor ................................................................................................192

Rozdzia 16. Graficzna prezentacja danych komponent TChart ....................... 197


Rysowanie wykresw z wykorzystaniem komponentu TChart ........................................197
Opis wybranych waciwoci, metod i zdarze komponentw TChart
i TChartSeries ..............................................................................................................199
Wykresy koowe .............................................................................................................202
Wykresy kolumnowe ......................................................................................................205
Wykresy funkcji matematycznych .................................................................................208
Formatowanie i skalowanie wykresw ..........................................................................212
Posugiwanie si wieloma wykresami ............................................................................218

Rozdzia 17. Wsppraca programu z plikami dyskowymi ................................... 223


Wybr foldera plikw ....................................................................................................223
Wyszukiwanie plikw ....................................................................................................225
Zapisywanie danych z okienek TEdit i tabeli do pliku tekstowego ...............................228
Czytanie danych z pliku tekstowego ..............................................................................230
Zapisywanie i odczytywanie danych z tabeli do pliku *.csv .........................................231
Zmiana nazw grupy plikw ............................................................................................233
Korzystanie ze strumieni ................................................................................................234

Rozdzia 18. Drukowanie w Delphi .................................................................... 241


Drukowanie napisw i tekstu z okienek edycyjnych .....................................................242
Drukowanie tabeli i wykresu ..........................................................................................243
Drukowanie obrazu ........................................................................................................246
Drukowanie tekstu sformatowanego za pomoc komponentu TRichEdit .....................247
Drukowanie za pomoc Rave Reports ...........................................................................253

Rozdzia 19. Programy z wieloma oknami ......................................................... 265


Wymiana danych i metod midzy moduami .................................................................265
Program z hasem ...........................................................................................................268
Wywietlanie tytuu programu .......................................................................................271
Aplikacje typu MDI .......................................................................................................273

Rozdzia 20. Posugiwanie si wieloma komponentami tego samego typu.


Operatory Is i As ........................................................................... 277
Wprowadzanie i kasowanie danych dla kilku okienek edycyjnych ...............................278
Przypisywanie grupie komponentw tej samej procedury obsugi zdarzenia ................279
Wywietlanie informacji o numerach kontrolek, ich nazwach i klasach .......................283

Rozdzia 21. Tablice dynamiczne ....................................................................... 285


Rozdzia 22. Dynamiczne tworzenie komponentw ............................................. 289
Wywietlanie kontrolek i przypisywanie zdarzeniom procedur obsugi .......................290
Przykady dynamicznego tworzenia wykresw .............................................................295
Tworzenie menu w czasie dziaania programu ..............................................................298

Rozdzia 23. Definiowanie nowych klas komponentw ....................................... 301


Klasa tabel z wyrwnaniem zawartoci komrek do prawej strony ..............................301
Klasa okienek z waciwoci Alignment ......................................................................303
Instalowanie nowych komponentw na palecie komponentw .....................................305
Instalacja nowego komponentu w Borland Delphi 2006 ...............................................309
Nowy komponent do ankiety .........................................................................................311
Nowy komponent zoony z komponentw standardowych ..........................................313

Aplikacje w Delphi. Przykady

Rozdzia 24. Podstawowe operacje na bazach danych ....................................... 317


Przegldanie istniejcych baz danych w formacie .dbf ..................................................319
Tworzenie wasnej bazy danych ....................................................................................321
Modyfikowanie bazy ......................................................................................................323
Filtrowanie rekordw bazy danych ................................................................................324
Wyszukiwanie rekordw ................................................................................................326
Sortowanie ......................................................................................................................327
Rysowanie wykresw na podstawie danych z bazy .......................................................327
Obliczanie redniej ze wszystkich wartoci danego pola ...............................................329
Biblioteka przykad relacyjnej bazy danych .............................................................329
Logiczne poczenie tabel ........................................................................................332
Drukowanie danych za pomoc programu Rave Reports ........................................333

Skorowidz ................................................................................... 341

Rozdzia 13.

Niektre komponenty posiadaj waciwo typu obiektowego TCanvas (tzw. ptno).


S to m.in.: TForm, TImage, TPaintBox, TBitmap, TComboBox, TStringGrid, TListBox,
TPrinter.
Waciwo Canvas zawiera metody, ktre pozwalaj na rysowanie na tych komponentach za pomoc linii rnych figur, kolorowanie powierzchni oraz wywietlanie
tekstu. Moliwa jest rwnie zmiana koloru i gruboci linii, koloru i wzoru wypenienia,
atrybutw czcionki itd.
Rysowanie za pomoc metod obiektu Canvas rnych obiektw moe by przydatne
do zmiany cech niektrych komponentw, np. TStringGrid czy TCTart, a take przy
drukowaniu formularza i tekstu.
Wybrane waciwoci obiektu TCanvas:
Brush okrela wzr lub kolor wypenienia figur (tzw. pdzel);
Font krj czcionki dla wywietlanych napisw;
Pen okrela cechy krelonych linii: grubo, styl, kolor (tzw. piro);
PenPos okrela wsprzdne kursora graficznego.

Podstawowymi parametrami wikszoci procedur i funkcji graficznych s wsprzdne


punktu na komponencie, po ktrym rysujemy. Lewy grny rg ma wsprzdne (0, 0),
a prawy dolny najczciej (WidtT, HeigTt). Na rysunku 13.1 przedstawiono wsprzdne
okna formularza, ktre wykorzystano w zadaniach tego rozdziau.

132

Aplikacje w Delphi. Przykady

Rysunek 13.1.
Formularz
z zaznaczonymi
wartociami
wsprzdnych
wierzchokw (x, y)

Wywietlanie prostych
figur geometrycznych i tekstu
Proste figury i tekst moemy wywietli na formularzu, korzystajc z procedur i funkcji
obiektu typu TCanvas tabela 13.1. Waciwoci takiego obiektu umoliwiaj m.in.
zmian gruboci i stylu rysowanych linii, zmian koloru i wzoru wypenienia figur oraz
wybr kroju i stylu czcionki dla tekstu.
Tabela 13.1. Wybrane metody obiektu TCanvas
Metoda

Znaczenie

Kolor:=Canvas.Pixels[x,y]

Za pomoc funkcji Pixels mona odczyta kolor piksela


w miejscu o wsprzdnych (x, y) zmienna Kolor jest typu
TColor.

Canvas.Pixels[10,20]:=clRed

Ta sama funkcja wywoana w ten sposb powoduje


wywietlenie na formularzu czerwonego punktu w miejscu
o wsprzdnych [10, 20] wsprzdn poziom (x)
liczymy od lewej do prawej, a wsprzdn pionow od gry
w d. Wsprzdne lewego grnego wierzchoka to (0, 0).

MoveTo(x,y: integer)

Przenosi kursor graficzny do punktu o wsprzdnych x, y.

LineTo(x,y:integer)

Rysuje lini od biecej pozycji kursora graficznego


do punktu o wsprzdnych x, y.

Rectangle(x1, y1, x2, y2: Integer)

Procedura rysuje prostokt wypeniony standardowym


kolorem pdzla (Canvas.Brush.Color).

Ellipse(x1, y1, x2, y2: Integer)

Procedura rysuje elips (lub koo) parametrami s


wsprzdne dwch przeciwlegych wierzchokw
prostokta (kwadratu), w ktry elipsa jest wpisana.

Polyline(Points: array of TPoint)

Procedura rysuje lini aman lub wielokt. Parametrami s


wsprzdne punktw, ktre zostan poczone lini. Jeli
wsprzdne punktu pierwszego i ostatniego s takie same,
to rysowany jest wielokt; w przeciwnym razie linia amana,
np. procedura:
Polyline([Point(40, 10), Point(20, 60), Point(70,
30),Point(10, 30), Point(60, 60), Point(40, 10)])

narysuje gwiazd picioramienn (patrz pomoc dla polyline).

Rozdzia 13. Grafika w Delphi korzystanie z metod obiektu TCanvas

133

Tabela 13.1. Wybrane metody obiektu TCanvas cig dalszy


Metoda

Znaczenie

Polygon(Points: array of TPoint)

Procedura umoliwia narysowanie wielokta wypenionego


biecym kolorem i stylem pdzla. Przykadowo instrukcje:
Canvas.Brush.Color = clRed;
Canvas.Polygon([Point(10, 10), Point(30, 10),
Point(130, 30), Point(240, 120)]);

spowoduj narysowanie czworokta wypenionego kolorem


czerwonym. Wsprzdne punktu pierwszego i ostatniego nie
musz si pokrywa, poniewa procedura i tak czy na kocu
punkt ostatni z punktem pierwszym.
Refresh

Odwieanie formularza procedura kasuje wszystkie obiekty


rysowane za pomoc metod obiektu Canvas i nieumieszczone
w procedurze obsugi zdarzenia OnPaint.

Draw(x, y:integer;
Graphic:TGraphic)

Rysuje obraz okrelony parametrem GraGhic w miejscu


o wsprzdnych x i y (przykad 13.14).

Arc(x1,y1, x2,y2, x3,y3,


x4,y4: integer)

Rysuje krzyw eliptyczn w prostokcie o wsprzdnych


(x1, y1; x2, y2), od punktu o wsprzdnych (x3, y3)
do punktu (x4, y4).

TextOut(x,y:integer; const
Text:string)

Wywietla tekst od punktu o wsprzdnych x, y lewy grny


rg prostokta zawierajcego tekst; Text to parametr w postaci
tekstu staego w apostrofach, np. 'Ala ma kota', lub zmienna
zawierajca acuch znakw, np. a:='Ala ma kota' (const
w nagwku procedury oznacza podobne wywoanie jak
w przypadku wartoci, lecz umoliwia bardziej efektywne
wykorzystanie pamici).

CopyRect(const Dest: TRect;


Canvas: TCanvas; const Source:
TRect)

Kopiuje cz obrazu z jednego ptna na inne ptno.

FillRect(const Rect: TRect)

Rysowanie prostokta wypenionego biecym kolorem i wzorem.

FloodFill(X, Y: Integer; Color:


TColor; FillStyle: TFillStyle)

Wypenianie tzw. powodziowe obiektw.

FrameRect(const Rect: TRect)

Rysowanie obwodu prostokta.

Pie(X1, Y1, X2, Y2, X3, Y3,


X4, Y4: Integer);

Rysowanie wycinka koa.

RoundRect(X1, Y1, X2, Y2,


X3, Y3: Integer)

Rysowanie prostokta z zaokrglonymi naronikami.

StretchDraw(const Rect:
TRect; Graphic: TGraphic)

Dopasowanie rysunku do obszaru danego prostokta.

TextHeight(const Text: string):


Integer

Funkcja zwraca wysoko tekstu w pikselach.

TextOut(X, Y: Integer;
const Text: string)

Procedura wywietla napis na komponencie posiadajcym


waciwo TCanvas.

TextRect(Rect: TRect; X, Y:
Integer; const Text: string)

Procedura wywietla napis w prostokcie, ktrego wsprzdne


s podane w postaci typu TRect (pierwszy parametr). Procedura
bya wykorzystywana przy formatowaniu komrek tabeli.

TextTidth(const Text: string):


Integer

Funkcja zwraca szeroko tekstu w pikselach.

134

Aplikacje w Delphi. Przykady

Oprcz wymienionych metod zdefiniowane s metody, ktre korzystaj z tzw. mechanizmw niskopoziomowych i waciwoci Handle komponentu, np. instrukcja:
kol:=GetNearestColor( Form1.Canvas.Handle, RGB(125,67,22));

spowoduje przypisanie zmiennej kol koloru najbardziej zblionego do podanego


w przypadku gdy biecy tryb graficzny nie posiada koloru typu RGB.

Przykad 13.1.
Wywietl na etykiecie wsprzdne prawego dolnego wierzchoka formularza lewy
grny ma wsprzdne (0, 0).

Rozwizanie
Wstaw etykiet TLabel. Wsprzdne prawego dolnego wierzchoka formularza moemy
odczyta, korzystajc z waciwoci ClientWidtT i ClientHeigTt formularza. Naley
wpisa np. w procedurze obsugi zdarzenia OnClick etykiety instrukcj:
Label1.CaGtion:=IntToStr(ClientWidth)+','+IntToStr(ClientHeight);

lub uy funkcji GetClientRectangle, ktra zwraca warto typu TRect okrelajc


wsprzdne dwch przeciwlegych wierzchokw formularza:
R:=Form1.GetClientRectangle; //R tyGu TRect mona zadeklarowa jako zmienn
lokaln
Label1.CaGtion:=Inttostr(R.Right)+','+ Inttostr(R.Bottom);

Przykad 13.2.
Na rodku formularza wywietl punkt koloru czerwonego, przy czym nie moe w tym
miejscu znajdowa si inny obiekt (np. przycisk), bo wywietlony piksel zostanie przez
ten obiekt przesonity.

Rozwizanie
Ponisz instrukcj wpisz np. w procedurze obsugi przycisku:
Canvas.Pixels[ClientWidth div 2, ClientHeight div 2]:=clRed;

Przykad 13.3.
Narysuj linie koloru czerwonego bdce przektnymi formularza rysunek 13.2.
Rysunek 13.2.
Formularz
z przektnymi
pozostajcymi
po zmianie
jego rozmiaru

Rozdzia 13. Grafika w Delphi korzystanie z metod obiektu TCanvas

135

Rozwizanie
Ponisze instrukcje wpisz np. w procedurze obsugi przycisku.
Pierwsza przektna:
Canvas.Pen.Color:=clRed; //zmiana koloru Gira na czerwony
//Grzesunicie kursora graficznego do Gunktu o wsGrzdnych (0,0)
Canvas.Moveto(0,0);
//narysowanie linii od biecego Gooenia kursora graficznego do Gunktu z Grawego
dolnego wierzchoka
Canvas.Lineto(ClientWidth, ClientHeight);

Narysuj drug przektn.


Aby przektne pozostay na formularzu podczas zmiany jego rozmiaru, naley wykorzysta dwa zdarzenia: OnPaint i OnResize. W procedurach obsugi tych zdarze powinny znale si instrukcje, jak w procedurach poniej:
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Pen.Color:=clRed;
Canvas.Moveto(0,0);
Canvas.Lineto(ClientWidth, ClientHeight);
Canvas.Moveto(ClientWidth,0);
Canvas.Lineto(0, ClientHeight);
end;

i
procedure TForm1.FormResize(Sender: TObject);
begin
Refresh; // Grzy zmianie rozmiaru okna
// kasowane s GoGrzednie Grzektne
end;

Przykad 13.4.
Wywietl na formularzu punkty rozmieszczone losowo i o losowych kolorach.

Rozwizanie
Wstaw przycisk i w procedurze obsugi zdarzenia OnClick wpisz odpowiednie instrukcje:
//Losowe Gunkty
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
for i:=1 to 10000 do
Canvas.Pixels[Random(ClientWidth), Random(ClientHeight)]:=
RGB( Random(255),Random(255), Random (255 ) );
end;

136

Aplikacje w Delphi. Przykady

Przykad 13.5.
Wywietl na formularzu trzy rne prostokty ramk, prostokt wypeniony kolorem BrusT.Color, prostokt z zaokrglonymi brzegami.

Rozwizanie
W procedurze obsugi przycisku wpisz instrukcje jak poniej:
procedure TForm1.Button3Click(Sender: TObject);
var
Grost: TRect;
begin
Grost:= Rect(200,10,300,100);
Canvas.Brush.Color := clBlack;
//ramka
Canvas.FrameRect(Grost);
Canvas.Brush.Color := clGreen;
//Grostokt wyGeniony
Canvas.Rectangle(200,120,300,210);
//Grostokt z zaokrglonymi brzegami
Canvas.RoundRect(200,230,300,320,20,20);
end;

Przykad 13.6.
Wywietl na rodku formularza napis Zadania z DelpTi w kolorze niebieskim, o rozmiarze czcionki rwnym 36 pkt, bez ta rysunek 13.3.
Rysunek 13.3.
Napis na rodku
formularza

Rozwizanie
W procedurze wykorzystano funkcje zwracajce szeroko i wysoko napisu oraz rozmiary formularza i na tej podstawie obliczono wsprzdne lewego grnego wierzchoka wywietlanego napisu:
procedure TForm1.Button2Click(Sender: TObject);
var x,y:integer;
begin
Canvas.Font.Name:='Arial';
Canvas.Font.Color:=ClBlue;

Rozdzia 13. Grafika w Delphi korzystanie z metod obiektu TCanvas

137

Canvas.Font.Size:=24;
Canvas.Brush.Style:=bsClear;
x:=ClientWidth-Canvas.TextWidth('Zadania
z DelGhi');
y:=ClientHeight-Canvas.TextHeight('Z');
Canvas.TextOut(x div 2, y div 2,'Zadania z DelGhi');
end;

Przykad 13.7.
Narysuj elips o maksymalnych wymiarach na formularzu.

Rozwizanie
W procedurze obsugi przycisku wpisz instrukcj:
//eliGsa wGisana w Grostokt o rozmiarach formularza
Canvas.ElliGse(0,0, ClientWidth, ClientHeight);

Przykad 13.8.
Narysuj na formularzu trjkt o zielonym obwodzie i tym wypenieniu.

Rozwizanie
I sposb z wykorzystaniem procedury PolyLine i FloodFill:
procedure TForm1.Button6Click(Sender: TObject);
begin
Canvas.Brush.Color:=clYellow;
Canvas.Pen.Color:=clGreen;
//rysowanie trjkta
Canvas.Polyline([Point(20,20),Point(200,20),Point(110,100),Point(20,20)]);
Canvas.Floodfill(100,25,clgreen,fsborder); //Grocedura wyGenia obiekt narysowany
//kolorem zielonym, wewntrz ktrego znajduje si Gunkt o wsGrzdnych (100,25)
end;

II sposb z wykorzystaniem procedury Polygon, rysujcej wielokt wypeniony


biecym kolorem pdzla (BrusT). Wsprzedne ostatniego punktu nie musz pokrywa si ze wsprzdnymi punktu pierwszego wielokta, poniewa pierwszy punkt
jest automatyczne czony z ostatnim:
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Brush.Color:=clYellow;
Canvas.Pen.Color:=clGreen;
Canvas.Polygon([Point(20,20),Point(200,20),Point(110,100)]);
end;

Przykad 13.9.
Wywietl na formularzu linie rysowane rnymi stylami.

138

Aplikacje w Delphi. Przykady

Rozwizanie
Wstaw przycisk TButton. W procedurze obsugi zdarzenia OnClick przycisku wpisz
instrukcje, jak w poniszej procedurze:
//style linii
procedure TForm1.Button1Click(Seender: TObject);
var x,y:integer;
begin
x := 210;
y := y+10;//y - zmienna globalna
Canvas.MoveTo(x,y);
x := Random(ClientWidth - 10);
y := Random(ClientHeight - 10);
Canvas.Pen.Color := RGB(Random(256),Random(256),Random(256));
case Random(5) of
0: Canvas.Pen.Style := GsSolid;
1: Canvas.Pen.Style := GsDash;
2: Canvas.Pen.Style := GsDot;
3: Canvas.Pen.Style := GsDashDot;
4: Canvas.Pen.Style := GsDashDotDot;
end;
Canvas.LineTo(x+200, y);
end;

Przykad 13.10.
Wywietl na formularzu prostokt malowany rnymi stylami pdzla po kadym klikniciu przycisku.

Rozwizanie
Wstaw przycisk TButton. W procedurze obsugi zdarzenia OnClick przycisku wpisz
instrukcje, jak w poniszej procedurze:
//style Gdzla
procedure TForm1.Button2Click(Sender: TObject);
begin
Refresh; //kasuje GoGrzedni Grostokt
Canvas.Brush.Color :=RGB(Random(256),Random(256),Random(256)); //kolorem Gdzla
// malowane s wzory
case Random(7) of
0: Canvas.Brush.Style := bsClear;
1: Canvas.Brush.Style := bsSolid;
2: Canvas.Brush.Style := bsBDiagonal;
3: Canvas.Brush.Style := bsFDiagonal;
4: Canvas.Brush.Style := bsCross;
5: Canvas.Brush.Style := bsDiagCross;
6: Canvas.Brush.Style := bsHorizontal;
7: Canvas.Brush.Style := bsVertical;
end;
Canvas.Rectangle(0,0, 200,100);
end;

Rozdzia 13. Grafika w Delphi korzystanie z metod obiektu TCanvas

139

Rysowanie trwae
zdarzenie OnPaint
Instrukcje zawierajce metody obiektu Canvas mona umieszcza w procedurach obsugi zdarzenia OnClick dla przyciskw, dla formularza i innych komponentw. Mona
rwnie korzysta z innych zdarze komponentw. Jednak tylko niektre z nich umoliwiaj tzw. trwae rysowanie, czyli rysowanie odnawiane po kadej zmianie, np. po
zmianie rozmiaru okna i przykryciu w ten sposb czci obiektw graficznych. Dla okna
formularza korzysta si w tym celu ze zdarzenia OnPaint. Dla innych komponentw
podobne zdarzenia maj inne nazwy. Przedstawiono je w tabeli 13.2.
Tabela 13.2. Zdarzenia umoliwiajce rysowanie trwae
Zdarzenie

Znaczenie

OnPaint

Zdarzenie dla formularza generowane kadorazowo, gdy zawarto okna formularza


wymaga odwieenia. Sytuacja taka ma miejsce przy tworzeniu okna formularza,
a take wtedy, gdy np. jedno okno zostanie przesonite innym oknem lub gdy
nastpuje zmiana jego rozmiaru.

PaintBoxPaint

Odpowiednik zdarzenia OnPaint dla komponentu PaintBox.

OnDrawCell

Zdarzenie wystpujce dla komponentu typu TDrawGrid i TStringGrid umoliwia


trwae rysowanie obiektw i wywietlanie tekstu w komrkach.

OnAfterDraw

Zdarzenie dla komponentu typu TChart, odpowiednik zdarzenia OnPaint.

Przykad 13.11.
Narysuj na formularzu prostokt koloru czerwonego, tak aby nie kasowa si po przykryciu okna formularza innym oknem. Prostokt powinien rysowa si po klikniciu
przycisku i kasowa po klikniciu drugiego przycisku rysunek 13.4.
Rysunek 13.4.
Rysowanie
i kasowanie
prostokta
na formularzu

Rozwizanie
Wstaw dwa przyciski TButton.

140

Aplikacje w Delphi. Przykady

Gdyby instrukcj rysujc prostokt umieci w procedurze obsugi zdarzenia OnPaint,


to prostokt byby na formularzu bezporednio po uruchomieniu programu. Dlatego
procedur obsugi tego zdarzenia z now instrukcj naley wywoa za pomoc przycisku.
Szkielet procedury FormPaint mona uzyska klikajc dwukrotnie w oknie Inspektora
Obiektw z prawej strony zdarzenia OnPaint. Pniej trzeba jednak wykasowa w Inspektorze Obiektw t nazw, dlatego aby instrukcje w procedurze obsugi zdarzenia
OnPaint nie wykonyway si bezporednio po uruchomieniu programu.
W przykadzie pokazano, jak wykona takie zadanie.
//obsugi zdarzenia OnPaint dla formularza rysuje Grostokt, wywoywana Grogramowo
//moe mie inna nazw
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Rectangle(100,100,ClientWidth-100,ClientHeight-100);
end;
//Grocedura rysuje Grostokt koloru czerwonego i GrzyGisuje Grocedurze obsugi
//zdarzenia OnPaint Grocedur FormPaint
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Pen.Color:=clRed;
Canvas.Rectangle(100,100,ClientWidth-100,ClientHeight-100);
OnPaint:=FormPaint;//GrzyGisanie Grocedurze obsugi zdarzenia Grocedury rysujcej
//Grostokt
end;
// odczenie Grocedury FormPaint od zdarzenia OnPaint wykasowanie Grostokta
procedure TForm1.Button2Click(Sender: TObject);
begin
OnPaint:=nil; //ta instrukcja sGowoduje, e rysunek Grostokta nie bdzie odnawiany
Refresh;
//Grocedura ta kasuje Grostokt
end;

Przykad 13.12.
Wypenij formularz bitmap, np. kawa.bmp.

Rozwizanie
W procedurze obsugi zdarzenia OnPaint dla formularza wpisz instrukcje, jak w procedurze poniej.
Zadeklaruj zmienn globaln lub pole klasy TFormT (w sekcji public):
var BitmaG: TBitmaG;
procedure TForm1.FormPaint(Sender: TObject);
var x, y: Integer;
begin
y := 0;

Rozdzia 13. Grafika w Delphi korzystanie z metod obiektu TCanvas

141

while y < Height do


begin
x := 0;
while x < Width do
begin
Canvas.Draw(x, y, BitmaG);
x := x + BitmaG.Width;
end;
y := y + BitmaG.Height;
end;
end;

W metodzie FormT.FormCreate dopisz instrukcje:


BitmaG:=TBitmaG.Create;
BitmaG.LoadFromFile('C:iWINDOWSikawa.bmG');

Rysowanie po formularzu i bitmapie


Przykad 13.13.
Napisz program umoliwiajcy rysowanie po formularzu po naciniciu lewego przycisku myszy.

Rozwizanie
Wykorzystano zdarzenie OnMouseDown wystpujce po naciniciu przycisku myszy na
komponencie i zdarzenie OnMouseMove wystpujce przy przesuwaniu kursora myszy
nad komponentem.
Wpisz instrukcje, jak w poniszych procedurach obsugi zdarze OnMouseDown i On
MouseMove.
procedure TForm1.FormMouseDown(Sender: TObject;Button: TMouseButton; Shift:
TShiftState; X, Y: Integer);
begin
Canvas.MoveTo(x,y);
end;
procedure TForm1.FormMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then //czy lewy Grzycisk myszy wcinity
Canvas.LineTo(x,y);
end;

Przykad 13.14.
Napisz program umoliwiajcy rysowanie prostoktw po komponencie typu TImage
i wywietlanie na etykietach wsprzdnych zaznaczonego prostokta rysunek 13.5.

142

Aplikacje w Delphi. Przykady

Rysunek 13.5.
Wycinanie
prostoktnego
obszaru z obrazu
typu .BMP

Rozwizanie
Na formularzu wstaw komponent TScrollBox i wewntrz niego komponent TImage
z zakadki Additional tak, aby lewe grne wierzchoki obu komponentw pokryway
si. Dla komponentu TImage ustaw waciwo Autosize na true i za pomoc waciwoci Picture zaaduj do niego obraz typu .BMP (nie .JPG). Zmie ksztat kursora na +.
Dodaj do formularza jeszcze dwie etykiety TLabel.
Wykorzystaj zdarzenie OnMouseDown wystpujce po naciniciu przycisku myszy na
komponencie TImage i zdarzenie OnMouseMove wystpujce przy przesuwaniu kursora
myszy nad komponentem TImage.
Zadeklaruj zmienne globalne:
StartX, StartY, StoGX, StoGY: Integer;
bmGGom:TBitmaG;

W procedurze obsugi zdarzenia OnCreate dla formularza zapamitaj obraz .BMP


z komponentu ImageT w zmiennej pomocniczej bmppom.
procedure TForm1.FormCreate(Sender: TObject);
begin
bmGGom:=TBitmaG.Create;
bmGGom.Assign(Image1.Picture.BitmaG);
end;

Zapis:
bmGGom.Assign(Image1.Picture.BitmaG);

oznacza kopiowanie mapy bitowej (obrazu) z komponentu ImageT do zmiennej bmppom,


natomiast zapis:
bmGGom:=Image1.Picture.BitmaG;

oznacza przypisanie wskanika do bitmapy z komponentu ImageT do zmiennej bmppom.


Jeli wic nie kopiujemy bitmapy, tylko wskanik do obszaru zajmowanego przez
ni, to nie mona wykorzysta tej zmiennej do zapamitania poprzedniego obrazu
w komponencie ImageT.

Rozdzia 13. Grafika w Delphi korzystanie z metod obiektu TCanvas

143

W procedurze obsugi zdarzenia OnMouseDown dla komponentu ImageT zapamitaj pocztkowe wsprzedne kursora myszy.
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
StartX := X;
StartY := Y;
end;

W procedurze obsugi zdarzenia OnMouseMove dla komponentu ImageT zaznaczane s


prostoktne obszary.
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
//Grzemieszczenie kursora Goza obraz Gowoduje, e Grocedura obsugi zdarzenia zwraca
//wartoci sGoza zakresu komGonentu Image1
if x<0 then x:=0;
if y<0 then y:=0;
if x>Image1.ClientWidth then x:=Image1.ClientWidth;
if y>Image1.ClientHeight then y:=Image1.ClientHeight;
with Image1 do
if ssLeft in Shift then //czy lewy myszy Grzycisk wcinity
begin
Image1.Picture.BitmaG:=bmGGom; //odtworzenie GoGrzedniej bitmaGy
Image1.Canvas.Pen.Color:=clred; //ustawienie koloru obrysu
Image1.Canvas.Brush.Style:=bsclear; //styl bez wyGenienia
//rysowanie Grostokta
Image1.Picture.BitmaG.Canvas.Rectangle(StartX, StartY, X, Y);
StoGX:=X; StoGY:=Y; //zaGamitanie wsGrzdnych Gotrzebnych do Grzykadu 13.15.
//Gozostaa cz kodu wywietla na etykiecie wsGrzdne dwch Grzeciwlegych
//wierzchokw i nie jest niezbdna do Grawidowego dziaania Grogramu
//wywietlanie wsGrzdnych dwch Grzeciwlegych wierzchokw
if X > StartX then //rysowanie w Grawo od Gunktu startowego
begin
Label1.CaGtion:= ' Left: ' + IntToStr(StartX);
Label2.CaGtion:= ' Right: ' + IntToStr(X);
end;
if X<=StartX then //else
begin //rysowanie w lewo od Gunktu startowego
Label1.CaGtion:=' Left: ' + IntToStr(X);
Label2.CaGtion:= ' Right: ' + IntToStr(StartX);
end;
if Y > StartY then //rysowanie w d od Gunktu startowego
begin
Label1.CaGtion:=Label1.CaGtion+' ToG: ' +
IntToStr(StartY);
Label2.CaGtion:=Label2.CaGtion+' Bottom: ' + IntToStr(Y);
end
else
begin //rysowanie w gr od Gunktu startowego
Label1.CaGtion :=Label1.CaGtion+ ' ToG: ' + IntToStr(Y);

144

Aplikacje w Delphi. Przykady


Label2.CaGtion :=Label2.CaGtion+ ' Bottom: ' +
IntToStr(StartY);
end;
end;
end;

Przykad 13.15.
Napisz program umoliwiajcy po klikniciu przycisku przekopiowanie zaznaczonego
obszaru w przykadzie 13.14 do drugiego komponentu typu TImage rysunek 13.5.

Rozwizanie
Na formularzu wstaw przycisk TButton. W procedurze obsugi zdarzenia OnClick wpisz
instrukcje, jak w procedurze poniej.
procedure TForm1.Button2Click(Sender: TObject);
var i,j,w,h:integer;
begin
w:=ABS(StoGX-StartX); //obliczenie szerokoci zaznaczonego obszaru
h:=ABS(StoGY-StartY); //obliczenie wysokoci zaznaczonego obszaru
//ustalenie szerokoci i wysokoci bitmaGy komGonentu Image2
Image2.Picture.BitmaG.Width:=w;
Image2.Picture.BitmaG.Height:=h;
//ustalenie wsGrzednych lewego grnego wierzchoka zaznaczonego Grostokta
if StartX>StoGX then StartX:=StoGX;
if StartY>StoGY then StartY:=StoGY;
//GrzeGisanie zaznaczonego obszaru z komGonentu Image1 do komGonentu Image2
//Giksel Go Gikselu
for i := 0 to w-1 do
for j := 0 to h-1 do
Image2.Picture.BitmaG.Canvas.Pixels[i,j]:=
Image1.Picture.BitmaG.Canvas.Pixels[StartX+i,StartY+j];
end;

Przykady animacji w Delphi


W programowaniu stosuje si rne techniki animacji. Jednym z prostszych sposobw
jest rysowanie obiektu, nastpnie kasowanie i ponowne rysowanie w innym miejscu.
Wad tego rozwizania jest trudno w uzyskaniu pynnoci ruchu obiektw.
Inna metoda polega na zastosowaniu dwch obszarw, na ktrych rysujemy. W danej
chwili widoczny jest tylko jeden z nich. Drugi jest wwczas modyfikowany i wywietlany w miejsce pierwszego dopiero po zakoczeniu operacji.
W zadaniach przykadowych zastosowano pierwszy sposb animacji. Udao si uzyska
odpowiedni pynno ruchu obiektw, dlatego nie wykorzystano sposobu z uyciem
dwch obszarw rysowania.

Rozdzia 13. Grafika w Delphi korzystanie z metod obiektu TCanvas

145

Przykad 13.16.
Wykonaj nastpujc animacj: kko o rednicy 30 pkt przesuwa si od lewego do
prawego brzegu formularza i z powrotem.

Rozwizanie
W procedurze obsugi przerwania od Timera wpisz:
{$J+}
procedure TForm1.Timer1Timer(Sender: TObject);
const x1:integer=0;
y1:integer=100;
krok:integer=5;
begin
//kasowanie obiektu
Canvas.Brush.color:=Color; //kolor formularza
Canvas.Pen.color:=Color;
//kolor Gira
Form1.Canvas.ElliGse(x1,y1,x1+30,y1+30);
//rysowanie kka kolorem czerwonym
Canvas.Brush.color:=clRed;
x1:=x1+krok;
Canvas.ElliGse(x1,y1,x1+30,y1+30);
if x1+30>= Clientwidth then krok:=-krok;
if x1<=0 then krok:=-krok;
end;

Dyrektywa {{$J+przed treci procedury wcza opcj kompilatora umoliwiajc


zmian wartoci staych typowanych (ang. Assignable typed constans). Opcja ta powinna by standardowo wczona, ale jeli nie mamy pewnoci, lepiej doda dyrektyw {{$J+.

Przykad 13.17.
Wykonaj animacj tak jak w zadaniu poprzednim, gdy formularz jest wypeniony wzorem rysunek 13.6.
Rysunek 13.6.
Animacja z tem

Rozwizanie
Na formularzu umie przycisk TButton i komponent TTimer. Waciwo Interval
ustaw na 200 ms, a waciwo Enabled na false. Tre procedur obsugi przycisku
i przerwania od Timera przedstawiono poniej.
Zadeklaruj zmienn globaln:

146

Aplikacje w Delphi. Przykady


var BitmaG,BitmaG1: TBitmaG;
//zaadowanie obrazu .BMP do zmiennej BitmaG
procedure TForm1.FormCreate(Sender: TObject);
begin
//W Grocedurze FormCreate naley Grzeczyta bitmaG z Gliku.
BitmaG:=TBitmaG.Create;
BitmaG.LoadFromFile('c:iwindowsikawa.bmG');
end;
// Grocedura Gobiera Grostoktny fragment formularza i uruchamia Timer
procedure TForm1.Button1Click(Sender: TObject);
var x,y:integer;
begin
// utworzenie obiektu BitmaG1
BitmaG1 := TBitmaG.Create;
BitmaG1.Width:=ClientWidth;
BitmaG1.Height:=30;
//Gobranie Grostoktnego wycinka formularza - obszaru, Go ktrym bdzie si Goruszao
//kko
for x:=0 to ClientWidth-1 do
for y:=0 to 29 do
BitmaG1.Canvas.Pixels[x,y]:=Form1.Canvas.Pixels[x,y+100];
Timer2.Enabled:=true; //w InsGektorze Obiektw zablokuj Timer2
end;
{$J+}// Grocedura obsugi Grzerwania od Timera - rysowanie i kasowanie obiektu co 200 ms
procedure TForm1.Timer2Timer(Sender: TObject);
const x1:integer=0;
y1:integer=100;
krok:integer=5;
var x,y:integer;
begin
//jeli zwikszymy rozmiar formularza, to trzeba w Grocedurze obsugi zdarzenia
//OnResize jeszcze raz Gobra bitmaG
Canvas.Draw(0,y1,BitmaG1); //wywietlenie wczeniej Gobranego Gaska formularza,
//kasowanie obiektu
//rysowanie kka
Canvas.ElliGse(x1,y1,x1+30,y1+30);
x1:=x1+krok;
if x1+29>=Clientwidth then krok:=-krok;
if x1<=0 then krok:=-krok;
end;
//wyGenianie formularza bitmaG
procedure TForm1.FormPaint(Sender: TObject);
var x, y: Integer;
begin
y := 0;
while y < Height do
begin
x := 0;
while x < Width do
begin
Canvas.Draw(x, y, BitmaG);
x := x + BitmaG.Width;
end;

Rozdzia 13. Grafika w Delphi korzystanie z metod obiektu TCanvas

147

y := y + BitmaG.Height;
end;
end;
// Grocedura FormDestroy zwalnia Gami
// zajmowan Grzez bitmaGy
procedure TForm1.FormDestroy(Sender: TObject);
begin
BitmaG.Free;
BitmaG1.Free;
end;

Przykad 13.18.
Wykonaj animacj polegajc na przemieszczaniu si kulki w losowych kierunkach
w prostoktnym obszarze o wymiarach (0, 0, 200, 200). Wykorzystaj komponent
TPaintBox z zakadki System rysunek 13.7.
Rysunek 13.7.
Animacja
niebieskiej kulki

Rozwizanie
Na formularzu umie komponent TPaintBox i TTimer. Komponent TPainBox jest stosowany do wywietlania (krelenia) grafiki, ktra ma by ograniczona do obszaru prostoktnego. Korzystajc z komponentu TPaintBox, programista nie musi kontrolowa,
czy obszar ten nie zosta przekroczony jeli narysowany obiekt nie mieci si wewntrz komponentu TPaintBox, to zostaje obcity. Dodatkowo zawarty w nim rysunek
moemy przesuwa po formularzu, zmieniajc waciwoci Left i Top tego komponentu. Procedura przedstawiona poniej dziaa poprawnie z komponentem TPaintBox
i bez niego wtedy kulka przesuwa si po formularzu.
W zadaniu mona rwnie doda przycisk, ktry bdzie wcza zegar (animacj) po
wpisaniu w procedurze obsugi instrukcji TimerT.Enabled:=true; (wczeniej naley zegar
zablokowa w okienku Inspektora Obiektw Enabled=true).
{$J+}
procedure TForm1.Timer1Timer(Sender: TObject);
const x:integer=6;
y:integer=6;
krokx:integer=6;
kroky:integer=6;
begin
with PaintBox1.Canvas do

148

Aplikacje w Delphi. Przykady


begin
//czyszczenie Grostokta
Brush.Color:=clWhite;
Rectangle(0,0,200,200);
//obliczenie wsGrzdnych
x:=x+krokx;
y:=y+kroky;
//rysowanie koa w kwadracie o boku
// rwnym 6 Gikseli
Brush.Color:=clBlue;
ElliGse(x-6, y-6, x+6, y+6);
if (x>Paintbox1.Width-6) then
begin
krokx:=6+Random(5);
krokx:=-krokx;
end;
if (y>Paintbox1.Height-6) then
begin
kroky:=6+Random(5);
kroky:=-kroky;
end;
if (x<=6) then krokx:=-krokx;
if (y<=6) then kroky:=-kroky;
end; //with
end;

Korzystajac z Inspektora Obiektw waciwoci Interval komponentu TimerT przypisz


warto 50.

Przykad 13.19.
Umie na formularzu komponent typu TButton i TSTape. Zadaniem przycisku jest wywietlanie po kadym klikniciu na przemian kka lub prostokta.
Po naciniciu klawiszy strzaek komponent STape przesuwa si zgodnie z kierunkiem
strzaki rysunek 13.8.
Rysunek 13.8.
Przesuwanie koa
za pomoc
klawiszy strzaek

Aby klawisze strzaek nie byy przechwytywane przez komponent ButtonT, naley
ustawi dla niego waciwo TabStop na false.

Rozwizanie
Wstaw komponenty TButton i TSTape. Dla komponentu TSTape ustaw waciwo STape
na stCircle i waciwo Brush\Color na clcellow. W procedurze obsugi kliknicia
przycisku wpisz instrukcje, jak poniej:

Rozdzia 13. Grafika w Delphi korzystanie z metod obiektu TCanvas

149

procedure TForm1.Button1Click(Sender: TObject);


begin
if ShaGe1.ShaGe=stCircle then ShaGe1.ShaGe:=stRectangle
else ShaGe1.ShaGe:=stCircle;
Form1.ActiveControl:=nil;
end;

W celu sprawdzenia klawiszy strzaek wykorzystaj zdarzenie OnKeyDown dla formularza.


Tre procedury obsugi tego zdarzenia przedstawiono poniej:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
case Key of
vk_Right: ShaGe1.Left:=ShaGe1.Left+10; //strzaka w Grawo
vk_Left: ShaGe1.Left:=ShaGe1.Left-10; //strzaka w lewo
vk_UG:
ShaGe1.ToG:=ShaGe1.ToG-10; //strzaka w gr
vk_Down:ShaGe1.ToG:=ShaGe1.ToG+10; //strzaka w d
end;
end;

You might also like