You are on page 1of 33

Платно за цртање (Canvas) од тип објект TCanvas

 
Како што рековме објектот TShape не е единствена техника за цртање
облици на екран. Често цртањето е подобро со користење на објектот
TCanvas.
 
Значи цртањето на слики во работната површина на некои
компоненти може да се изведе со користење на својството Canvas
(платно). Вакво својство имаат и формите, сликите(Image), рамки со
листи (ListBox) i ComboBox кои преминуваат надвор од нашиот курс.
Особини или својства на TCanvas
 
Покрај формите и сликите може да се спомне и PaintBox (рамка за
боење) која се користи кога цртањето треба да се ограничи на
работниот дел од формата. Се разликува од компонентата Image по
тоа што нејзината содржина не може да се одреди за време на
проектирањето, ниту слика во неа да се чита од датотека или слика
од неа да се смести во датотека.
Сликите цртани со својството Canvas се привремени. Кога прозорецот
или компонента со слика одново се појавува на екран пр. зошто е
покриен со други прозорци од иста или друга апликација, сликата
мора повторно да се исцрта. Постои специјален настан OnPaint (при
цртање) кој се генерира секогаш кога Windows ќе процени дека
содржината на некој прозор треба повторно да се исцрта.
 
Својството Canvas е на располагање само за време на извршување на
апликацијата. Неговиот тип е TCanvas кој претставува класа со
поголем број својства и методи. Подесување на параметрите на
цртање се врши со помош на својствата, a ефективното цртање со
помош на методите на таа класа.
Координатите се задаваат во точки на екранот (pixels) во однос на работната
површина на компонентата чие својство Canvas се користи. Координатниот
почеток е во горниот лев агол. Апцисата (x oска) е насочена од лево кон десно, а
ординатата (y oска) од горе кон долу.
x


За претставување на точките се користи типот TPoint кој е дефиниран со:
record X, Y: Integer end;

Правоаголниците со рабови паралелни со координатните оски некаде се


претставуваат со точки во горниот лев и долниот десен агол. Типот податоци кој
се користи за претставување правоаголник е TRect кој се смета дека е дефиниран
со:
 
record Left, Top, Right, Bottom: Integer; end; ili
record TopLeft, BottomRight: TPoint; end;
 
Својствата на класата TCanvas го одредуваат начинот на цртање линии и
исцртување текст. Овде се набројани поважните особини:
 
Особина или својство Pen (pero) од тип TPen одредуваат начин на цртање линии и рабни
линии околу затворени површини. Типот TPen е класа со следниве својства:
 
Color (боја) тип TColor означува боја со која се исцртуваат линиите.
Style (стил) типот на набројувања одредува типови линии. Можни вредности се: psSolid
(полна), psDash (прекината), psDot (точкаста), psDashDot (црта-точка), psDash-DotDot
(црта-точка-точка) i psClear (невидлива).
Width (ширина) од тип Integer одредува дебелина на линијата во точки на екранот
(pixels).
Mode (начин) од тип набројување одредува на кој начин се користи поставената боја на
перото. Можностите се од цртање со подесена боја, комплементот, само црна и само
бела, независно од затекнатата боја на точките во сликата, до разни комбинации бои на
перо со боите на тие точки.
 
Својството Brush (четка) од тип TBrush го одредува начинот на пополнување на
внатрешноста на затворени површини. Типот TBrush е класа со следниве својства:
Color (боја) од тип TColor означува боја со која се пополнуваат површините.
Style (стил) од тип набројување означува боја со која се пополнува површината. Можни
вредности се bsSolid (пополнето), bsClear (празно, прозирно), bsBDiagonal (коси
линии ///), bsFDiagonal (коси линии \\\), bsCross (хоризонтални и вертикални вкрстени
линии), bsDiagCross (коси вкрстени линии), bsHorizontal (хоризонтални линии), i bsVertical
(вертикални линии). Стилот bsClear означува цртање само на рабови без пополнување на
внатрешност.
Bitmap (мапа на битови) од тип TBitmap може да дефинира шара со големина
точно 8 по 8 точки на екран (pixels) со која се пополнува површината.
Својството Font (тип на букви) од тип TFont одредува тип и величина на букви
кои се вметнуваат во слика.
 
Буквите се сложени графички елементи со многу параметри. Сите својства на
буквите се претставуваат со особина Font од тип TFont. Font е класа која покрај
останатото поседува својства како:
 
Name (име) од тип string – име на типот букви како System, Times New Roman
CE, Arial CE итн;
Style (стил) тип збир набројувања – начин на прикажување на букви
(подвлечено, прецртано во сите можни комбинации);
Size (големина) од тип Integer – големина на букви во типографски точки
(points, 1/72 инч);
Height (висина) од тип Integer – големина на букви во точки на екранот (pixels);
Color (боја) од тип TColor – боја со која се прикажуваат буквите.
 
Својството PenPos (положба на перото) од тип TPoint претставува моментална положба
на перото. Тоа е место каде е завршено последното цртање или испишување на
текстот. За поместување на перото без цртање треба да се користи методата MoveTo
(следи објаснување подолу) место менување вредност на ова својство.
 
Својството Pixels (точки) претставува матрица точки на сликата. Елементи на матрицата
се од тип TColor и претставуваат бои на поедините точки. Првиот индекс претставува
хоризонтална координата, а вториот индекс вертикална координата. Индексот [0,0]
претставува горен лев агол на сликата. Со помош на ова својство можат да се земаат и
менуваат боите на поедини точки на сликата.
procedure TForm1.Button1Click(Sender: TObject);
var
i,j: word;
begin
for j:=10 to 210 do
begin
for i:=10 to 109 do
canvas.Pixels[i,j]:=clgreen;
for i:=110 to 209 do
canvas.Pixels[i,j]:=clwhite;
for i:=210to 310 do
canvas.Pixels[i,j]:=clred;
end;
end;
Под боја на компонента се подразбира бојата на позадината на работниот
образец или бојата со која се прикажува некоја управувачка компонента.
 
Бојата на компонентата се претставува со својството Color (боја) од тип TColor.
Се поставува за време на проектирање и може да се промени за време
извршување на програмата.
Може да се зададе како осмоцифрен хексадецимален цел број. Од лево кон
десно по две цифри претставуваат интензитет на црвена, зелена и сина боја. Пр.
$000000FF е чисто сина, $0000FF00 е чисто зелена, $00FF0000 е чисто црвена,
$00000000 е чисто црна, a $00FFFFFF е бела боја. Другите бои се добиваат со
комбинации на интензитет на црвена, зелена и сина боја.
 
 
Color Hex Code Color Hex Code Color Hex Code
Alice blue #F0F8FF Antique white #FAEBD7 Aqua #00FFFF
Aquamarine #7FFFD4 Azure #F0FFFF Beige #F5F5DC
Bisque #FFE4C4 Black #000000 Blanche dalmond #FFEBCD
Blue #0000FF Blue violet #8A2BE2 Brown #A52A2A
Burlywood #DEB887 Cadet blue #5F9EA0 Chartreuse #7FFF00
Chocolate #D2691E Coral #FF7F50 Cornflower blue #6495ED
Cornsilk #FFF8DC Crimson #DC143C Cyan RGB Color вредности
#00FFFF во Hexa Kod
Dark blue #00008B Dark cyan #008B8B Наместо знакот#B8860B
Dark goldenrod # во Delphi пишете знак $
Dark gray #A9A9A9 Dark green #006400 Dark khaki #BDB76B
Dark magenta #8B008B Dark olive green #556B2F Dark orange #FF8C00
Dark orchid #9932CC Dark red #8B0000 Dark salmon #E9967A
Dark seagreen #8DBC8F Dark slate blue #483D8B Dark slate gray #2F4F4F
Dark turquoise #00DED1 Dark violet #9400D3 Deep pink #FF1493
Deep sky blue #00BFFF Dim gray #696969 Dodger blue #1E90FF
Firebrick #B22222 Floral white #FFFAF0 Forest green #228B22

Fuchsia #FF00FF Gainsboro #DCDCDC Ghost white #F8F8FF

Gold #FFD700 Goldenrod #DAA520 Gray #808080


Green #008000 Green yellow #ADFF2F Honeydew #F0FFF0
Hot pink #FF69B4 Indian red #CD5C5C Indigo #4B0082
Ivory #FFFFF0 Khaki #F0E68C Lavender #E6E6FA
Lavender blush #FFF0F5 Lawngreen #7CFC00 Lemon chiffon #FFFACD

Light blue #ADD8E6 Light coral #F08080 Light cyan #E0FFFF

Light goldenrod yellow #FAFAD2 Light green #90EE90 Light grey #D3D3D3
Light pink #FFB6C1 Light salmon #FFA07A Light seagreen #20B2AA
Light sky blue #87CEFA Light slate gray #778899 Light steel blue #B0C4DE
Light yellow #FFFFE0 Lime #00FF00 Lime green #32CD32
Linen #FAF0E6 Magenta #FF00FF Maroon #800000

Medium aquamarine #66CDAA Medium blue #0000CD Medium orchid #BA55D3

Medium purple #9370DB Medium sea green #3CB371 Medium slate blue #7B68EE

Medium spring green #00FA9A Medium turquoise #48D1CC Medium violet red #C71585

Midnight blue #191970 Mint cream #F5FFFA Misty rose #FFE4E1


Moccasin #FFE4B5 Navajo white #FFDEAD Navy #000080
Old lace #FDF5E6 Olive drab #6B8E23 Orange #FFA500
Orange red #FF4500 Orchid #DA70D6 Pale goldenrod #EEE8AA
Pale green #98FB98 Pale turquoise #AFEEEE Pale violet red #DB7093
Papaya whip #FFEFD5 Peach puff #FFDAB9 Peru #CD853F

Pink #FFC8CB Plum #DDA0DD Powder blue #B0E0E6

Purple #800080 Red #FF0000 Rosy brown #BC8F8F


Royal blue #4169E1 Saddle brown #8B4513 Salmon #FA8072
Sandy brown #F4A460 Sea green #2E8B57 Sea shell #FFF5EE
Sienna #A0522D Silver #C0C0C0 Sky blue #87CEEB

Slate blue #6A5ACD Snow #FFFAFA Spring green #00FF7F

Steelblue #4682B4 Tan #D2B48C Teal #008080


Thistle #D8BFD8 Tomato #FF6347 Turquoise #40E0D0
Violet #EE82EE Wheat #F5DEB3 White #FFFFFF
Whitesmoke #F5F5F5 Yellow #FFFF00 Yellow green #9ACD32
Дали за прикажување на компонентите треба да се користи иста боја како и боја
на родителот се контролира со својството ParentColor (Боја на родител) од тип
Boolean. Вредноста True, означува превземање боја на родител, а False дека
треба да се користи сопствена боја. Подразбирлива вредност е True, која
автоматски се менува во False ако во проектирањето се смени вредноста на
својството Color.
 
Својството ClientRect (правоаголно отсекување) од тип TRect ги означува
координатите на горниот лев и долниот десен агол на расположивата површина
за цртање. Вредноста на ова својство не може да се менува (read only) и ја
одредува површината на компонентата чие својство Canvas се користи. Се
нацртано надвор од овој правоаголник едноставно се отсекува.
 
Својството CopyMode (начин на копирање) од тип набројување одредува на кој
начин сликата од друго платно (Canvas) се копира во набљудуваното платно. Се
подразбира, изворната слика се копира во одредишна независно од изгледот на
почетната слика. Останатите начини опфаќаат комбинирање точки на изворната и
одредишната слика на разни начини, произведувајќи разни визуелни ефекти.
 
Метода на платно односно Canvas
 Сите цртања линии и испишување на текстови се остваруваат се соодветни методи
на класа TCanvas. Во продолжение наведени се некои поважни методи.
 
За цртање линии и за рабови на затворени површини се користат параметрите во
својството Pen (перо), затворените површини се пополнуваат според параметрите во
својството Brush (четка), a текстовите се испишуваат по параметрите во својството
Font (вид букви). 
procedure LineTo (X, Y: Integer); - линија до
procedure MoveTo (X, Y: Integer); - помести се до 
Првата метода црта линија од моменталната положба на перото (вредност на
својството PenPos) до точката со координати X i Y. Втората метода само го поместува
перото, не оставајќи трага на екранот. Вредноста на својството PenPos се менува да
укажи на новата положба на перото.
Пример:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
{ првата метода FillRect служи да ја обои работната површина на формата.
Моментално служи за отстранување на претходно нацртаните линии }
Canvas.FillRect(ClientRect);
Canvas.MoveTo(0, 0);
Canvas.LineTo(X, Y);
end;
Методата FillRect служи да обои правоаголник со боја на четка (brush), нејзината
декларација е: procedure FillRect(const Rect: TRect);
Исто така кога извршувате напредни пресмети на висина и ширина на форма,
треба да се земе во предвид и граничната линија т.е. самата border како и делот
со насловната линија на формата. За сега не е потребно, но особините
ClientWidth, ClientHeight i ClientRect даваат информации кои споменатите
елементи ги имаат во предвид.
 
 
Особината ClientHeight дава integer вредност на висина (вертикала) на работната
површина на формата во пиксели.
Особината ClientWidth дава integer вредност на ширината (хоризонтала) на
работната површина во пиксели.
Особината ClientRect е од тип TRect и дава вредности на правоаголна работна
површина на самата форма без border-и и насловни линии.ClientRect е
еквивалентна со Rect(0, 0, ClientWidth, ClientHeight).
Методите како што се :
procedure PolyLine (Точки: array of TPoint); - отворена искршена линија
procedure Polygon (Точки: array of TPoint); - затворена искршена линија
 
Првата метода црта искршена линија спојувајќи соседни точки во низата Точки.. Втората
метода го работи истото, но на крај ја спојува последната со првата точка и ја бои
внатрешноста на добиената затворена површина.
пример: На знамето на бившата СФРЈ да додадеме ѕвезда петтокрака
procedure TForm1.Button1Click(Sender: TObject);
var
W,Q: Word;
begin
for W := 50 to 250 do
begin
for Q :=10 to 50 do
Canvas.Pixels[W, Q] := clBlue;
for Q :=51 to 90 do
Canvas.Pixels[W, Q] := clWhite;
for Q :=91 to 140 do
Canvas.Pixels[W, Q] := clRed;
end;
// Цртама ѕвезда во знамето
Canvas.Pen.Color := clRed;
Canvas.PolyLine([Point(150, 45), Point(130, 95), Point(180, 65),
Point(120, 65), Point(170, 95), Point(150, 45)]);
end;
Методите:
procedure Rectangle (X1, Y1, X2, Y2: Integer); - црта правоаголник
procedure RoundRect (X1, Y1, X2, Y2, X3, Y3: Integer); - заоблен правоаголник
 Двете методи цртаат и пополнуваат правоаголник со горен лев агол во точката (X1,Y1) и долен десен агол во
точката (X2,Y2). Втората метода ги црта темињата на правоаголникот заоблено, како четвртина елипса со
висина Y3 и ширина X3.
 пример: Овој пр. црта голем број правоаголници со различна големина и боја по цела површина на
формата.
 procedure TForm1.FormActivate(Sender: TObject);
begin
WindowState := wsMaximized;
Timer1.Interval := 50;
Randomize;
end;
 procedure TForm1.Timer1Timer(Sender: TObject);
var
X, Y: Integer;
begin
X := Random(Screen.Width - 10);
Y := Random(Screen.Height - 10);
Canvas.Pen.Color := Random(65535);
case Random(5) of
0: Canvas.Pen.Style := psSolid;
1: Canvas.Pen.Style := psDash;
2: Canvas.Pen.Style := psDot;
3: Canvas.Pen.Style := psDashDot;
4: Canvas.Pen.Style := psDashDotDot;
end;
Canvas.Rectangle(X, Y, X + Random(400), Y + Random(400));
end;
 
Методата:
 procedure Ellipse (X1, Y1, X2, Y2: Integer); - елипса
Оваа метода црта и пополнува елипса која е впишана во правоаголник со горен
лев агол во точката (X1,Y1) и долен десен агол во точката (X2,Y2).
 
пример: Примерот црта елипса во рамката на Image компонента
procedure TForm1.Button1Click(Sender: TObject);
begin
with Image1 do
begin
Canvas.brush.color := clRed;
Canvas.brush.style := bsDiagCross;
Canvas.Ellipse(0, 0, Image1.Width, Image1.Height);
end;
end;
 Методите:
 
procedure Arc (X1,Y1,X2,Y2,X3,Y3,X4,Y4: LongInt); - црта лак
procedure Chord (X1,Y1,X2,Y2,X3,Y3,X4,Y4: LongInt); - црта одсечок
procedure Pie (X1,Y1,X2,Y2,X3,Y3,X4,Y4: LongInt); - црта исечок
 
Првата метода црта лак како дел од елипса впишана во правоаголник со горен
лев агол во точка (X1,Y1) и долен десен агол во точка (X2,Y2). Почетната точка
на лакот е во пресек на елипсата и правата која минува низ центарот на
елипсата и низ точката (X3,Y3).
Крајната точка на лакот е во пресек на елипсата и правата која минува низ
центарот на елипсата и точката (X4,Y4). Лакот се црта во спротивна насока од
движењето на стрелките на часовникот.
Втората метода црта отсечок на елипса (затворена површина) која се добива
со поврзување на крајните точки на лакот, која првата метода би ги исцртала
со права линија.
Третата метода црта исечок на елипса (затворена површина) која се добива со
поврзување на крајните точки на лакот, која првата метода би ги исцртала со
центар во елипса.
Пр.: Цртање лак
procedure TForm1.FormPaint(Sender: TObject);
var
R: TRect;
begin
{Враќа податок за големината на правоаголникот на формата}
R := GetClientRect;
Canvas.Arc(R.Left, R.Top, R.Right, R.Bottom, R.Right, R.Top, R.Left, R.Top);
end;
 
Пр. Отсечок:
procedure TForm1.Button4Click(Sender: TObject);
var
R: TRect;
begin
{Враќа податок за големината на правоаголникот на формата}
R := GetClientRect;
Canvas.Chord(R.Left, R.Top, R.Right, R.Bottom, R.Right, R.Top, R.Left, R.Top);
end;

 Пр. Исечок:
 procedure TForm1.Button5Click(Sender: TObject);
var
R: TRect;
begin
{ Враќа податок за големината на правоаголникот на формата }
R := GetClientRect;
Canvas.Pie(R.Left, R.Top, R.Right, R.Bottom, R.Right, R.Top, R.Left, R.Top);
end;
Методи:
procedure TextOut (X,Y: Integer; const: Tekst: string); - цртање текст
procedure TextRect (Pravoag: TRect; X,Y: Integer;
const: Tekst: string); - цртање текст во правоаголник
 
Двете методи испишуваат текст во аргументот Tekst со горен лев агол во точка (X,Y).
Втората метода отсекува делови на текстот кои би биле надвор од правоаголникот
претставен со аргументот Pravoag.
 Пр.: за TextOut метода
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Canvas.TextOut(X,Y,'Ovde smе na: ('+IntTostr(X)+','+IntTostr(Y)+') ');
end;
  
Пр. За TextRect метода:
procedure TForm1.Button2Click(Sender: TObject);
var Pravoag: TRect;
begin
Pravoag := Rect(10,10,100,150);
Form1.Canvas.TextRect(Pravoag,10,10,'Hello, world!');
Form1.Canvas.Brush.Color := clBlack;
Form1.Canvas.FrameRect(Pravoag);
end;
function TextWidth (const Tekst: string): Integer; - ширина на текстот
function TextHeight (const Tekst: string): Integer; - висина на текстот
 
Вредноста на првата функција е бројот на точки на екранот (pixels) по ширина,
a другата по висина кои се користат за процена дали текстот може да се смести
во одреден простор или за порамнување на различни начини (пр. Центрирано)
 
procedure CopyRect (Odrediste: TRect; Slika: TCanvas; Izvor: TRect); - копирај
правоаголник
procedure BrushCopy(const Odrediste: TRect; Bitmap: TBitmap; const Izvor: TRect;
Color: TColor);
 
Првата метода копира дел од слика од друго платно Slika одреден со
правоаголникот Izvor во делот на тековното платно одреден со правоаголникот
Odrediste.
Втората метода BrushCopy копира една боја на слика (BitMap) со боја четка
(Brush) на работното платно. Може да се користи кога сликата сакаме да ја
направиме транспарентна.
пример:
procedure TForm1.Button3Click(Sender: TObject);
var
Bitmap: TBitmap;
MyRect, MyOther: TRect;
begin
MyRect := Rect(10,10,100,100);
MyOther := Rect(10,111,100, 201);
Bitmap := TBitmap.Create;
Canvas.Brush.Color:=clRed;
Bitmap.LoadFromFile('C:\Documents and Settings\ADMIN\Desktop\
Italy_Flag_big.bmp');
Form1.Canvas.BrushCopy(MyRect,Bitmap, MyRect, clBlack);
Form1.Canvas.CopyRect(MyOther,Bitmap.Canvas,MyRect);
Bitmap.Free;
end;
 
procedure Draw (X,Y: Integer; Slika: TGraphic); - цртај
procedure StretchDraw (const Pravoаg: TRect; Slika: TGraphic);
- цртај развлекувајќи
 Првата метода црта слика од графичкиот објект претставен со аргумент Slika
со горниот лев агол во точка (X,Y). Втората метода таквата иста слика ја црта со
развлекување или собирање, прецизно пополнувајќи го правоаголникот
претставен со аргументот Pravoаg.
 Пример за Draw метода:
procedure TForm1.Button2Click(Sender: TObject);
var
Bitmap : TBitMap;
begin
Bitmap := TBitmap.Create;
try
with Bitmap do begin
LoadFromFile('..\Images\Splash\256color\factory.bmp');
Transparent := True;
TransParentColor := BitMap.canvas.pixels[50,50];
Form1.Canvas.Draw(0,0,BitMap);
TransparentMode := tmAuto; // Транспарентна боја сега е clDefault = TColor($20000000);
Form1.canvas.Draw(50,50,BitMap);
end;
finally
Bitmap.Free;
end;
 
Методи на други компоненти и цртање
 
Следните три методи, кои се однесуваат на исцртување компоненти на екранот,
ги поседуваат сите компоненти и форми. Порано не беа објаснети зошто нивната
употреба досега не беше потребна. Сите три методи се процедури без
аргументи.
Методата Invalidate (направи неважечко) означува компонентата (вклучително
и формата) за која е повикана треба одново да се исцрта штом биде можно (ако
Windows не би имал нешто поитно да работи). Како последица ќе се повика
настанот OnPaint (при исцртување). Оваа метода треба да се повикува во
ситуации кога ќе се процени дека компонентата треба повторно да се исцрта, а
Windows тоа не би го направил сам. Еден пр. на таква ситуација е промена на
големината на прозорецот.

Методата Update (ажурирај) налага барањето за повторно исцртување на


компонентата да се задоволи веднаш. Нема ефект без претходно повикување на
методата Invalidate.

Методата Refresh (обнови) прво ја чисти сликата и повторно ја исцртува,


повикувајќи ги методите Invalidate и Update.
Пример : Направи апликација Lissajous, која црта Lissajousovа крива зададена
со формулите:
x=rx(1+cosa) и
x=ry(1+sinb) за (o2)
Решение:
Следниот програмски код обезбедува точно функционирање на апликацијата.
procedure TForm1.FormPaint(Sender: TObject);
const N=500; A=5; B=7;
var Rx,Ry,X,Y,I: Integer;
Fi,DFi: Real;
begin
Dfi:=2*Pi/N;
Rx:=Canvas.ClipRect.Right div 2;
Ry:=Canvas.ClipRect.Bottom div 2;
Canvas.Pen.Width:=2;
Canvas.MoveTo(2*Rx,0);
for I:=1 to N do
begin
Fi:=I*Dfi;
X:=Round(Rx+Rx*Cos(A*Fi));
Y:=Round(Ry+Ry*Sin(B*Fi));
Canvas.LineTo (X,Y);
end
end;
 procedure TForm1.FormResize(Sender: TObject);
begin
Invalidate;
end;
Цртањето на кривата го прави FormPaint кој се повикува кога на формата ќе
случи настанот OnPaint (при исцртување).
Параметрите на кривата A i B се зададени како симболични константи.
Параметрите на кривите Rx i Ry се одредуваат така да кривата го исполни целото
платно. Кооринатите на долниот десен агол на правоаголникот Canvas.ClipRect
претставуваат истовремено и висина односно ширина на тој правоаголник. За
дебелина на линиите (Canvas.Pen.Width) се зема 2.
Кривата се црта од 500 (симболичка константа N). Прво перото со метода
Canvas.MoveTo се поместува без цртање во почетна точка на кривата. Потоа во
циклуси се пресметуваат координатите на следните точки кои се исцртуваат со
методата Canvas.LineTo.
FormResize, кој се повикува кога ќе се смени големината на прозорецот
(настанот OnResize – при промена на големина), постои само со повикување на
методата Invalidate, бара повторно исцртување на целата форма. Тоа доведува
до генерирање на настанот OnPaint, односно до повикување на FormPaint. Tака
кривата се црта во нова величина.
Контрола на текот на извршување на кодот
 

Object Pascal (Delphi) има неколку наредби кои го насочуваат текот на


извршување на кодот. Две се наредби на гранење, а три се наредби на јамка.
Наредбите на гранење се:

 Наредба IF
Наредба CASE
 
Наредбите на јамка се:

 Наредба REPEAT
Наредба WHILE
Наредба FOR
 
If Наредба на гранење
 
 
If наредбата го одредува текот на кодот врз основа на некој израз. Ако
условот е True, еден дел од кодот се извршува. if наредбата е :
 
if услов then
наредба(би);
 
 
Но постои if наредба која има резервиран збор else. Кај оваа if наредба,
наредбата после зборот else се извршува кога условот е False, кога условот
не е исполнет.
 
if услов then
наредба1
else
наредба2;
 
пример1:
 
procedure TForm1.Button1Click(Sender: TObject);
var A,B:Integer;
begin
A:=3;
B:=5;
if B>A then
Edit1.Text:=IntToStr(B);
end;
  
пример 2: 
procedure TForm1.Button1Click(Sender: TObject);
var A,B:Integer;
begin
A:=3;
B:=5;
if B>A then
Edit1.Text:=IntToStr(B)
else
Edit1.Text:=IntToStr(A);
end;
 
Во оваа if наредба нема симбол (;) се до крајот на делот на else наредбата, во
спротивно доаѓа до порака за грешка.
Постојат и други начини на користење односно пишување на if наредбата, како
пишување повеќе наредби во if наредбата и користење на вгнездени (nesting) if
наредби.
 
CASE Наредба на гранење
  Програмата може да има и наредба case за гранење, дури подобро користена
од серија на if наредби. Кодот со оваа наредба се извршува побрзо.
Декларацијата на case командите се:
  case s of
            c1: naredba1;
            c2: naredba2;
            …
            ck: naredbak;
end;

и со else делот:

 case s of
            c1: naredba1;
            c2: naredba2;
            …
            ck: naredbak;
else
            naredba;
end;
 Наредбата case ја користи вредноста во изразот за да одреди која линија во
рамката наредби case ќе се изврши. Како и if и наредбата case има опционен
дел else. Case наредбата се завршува со резервиран збор end.
 procedure TForm1.FormActivate(Sender: TObject);
begin
WindowState := wsMaximized;
Timer1.Interval := 50;
Randomize;
end;
 procedure TForm1.Timer1Timer(Sender: TObject);
var
X, Y: Integer;
begin
X := Random(Screen.Width - 10);
Y := Random(Screen.Height - 10);
Canvas.Pen.Color := Random(65535);
case Random(5) of
0: Canvas.Pen.Style := psSolid;
1: Canvas.Pen.Style := psDash;
2: Canvas.Pen.Style := psDot;
3: Canvas.Pen.Style := psDashDot;
4: Canvas.Pen.Style := psDashDotDot;
end;
Canvas.Rectangle(X, Y, X + Random(400), Y + Random(400));
end;
Repeat наредба (Repeat-јамка)

 Се употребува за реализација на структурата повторување со излез на крај.


Синтаксата на наредбата е:
Repeat
наредби;
Until услов;
Значењето на наредбата е: повторувај (Repeat) го извршувањето на наредбите
до (Until) исполнување на условот.
Наредбата repeat повторува наредба или серија наредби се додека некој услов
не стане True. Наредбата започнува со резервиран збор repeat и завршува со
резервиран збор until. Условот е секогаш Boolean израз.
Наредбите што се извршуваат со Repeat не се ставаат во блок меѓу Begin и End.

 
 While наредба (While-јамка)

Оваа наредба се употребува за реализација на структурата повторување


со излез на почеток.
Синтаксата на наредбата е:
почетна вредност;
While услов do
Begin
Наредба1;
Наредба2;

Наредбаn;
Инкремент (прираст);
End;
Додека repeat наредбата испитува услов на крајот на јамката, наредбата
while испитува услов на почеток на јамката. Наредбата започнува со
резервиран збор while и условот кој се тестира, кој секогаш мора да биде
Boolean. Ако условот е исполнет (True), јамката се извршува се додека не
се дојде до крајот на наредбата, кога изразот пак се испитува Штом
резултатот на изразот биде False, while јамката престанува да се
извршува, а програмата продолжува со наредбите после while јамката.

 
For наредба (For-јамка)

Оваа наредба се употребува за реализација на структурата повторување со


броење на циклусите. Повторувањата се бројат со посебен бројач, за кој се
задаваат почетната и крајната вредност на бројачот. Наредбата For е трет тип
јамка во Object Pascal. Вредноста која е бројач одредува колку пати ќе се
изврши for јамката. Променливата може да биде Integer, Boolen, Char и сл.
Синтаксата на наредбата е:
 
for brojac := pocetnaVrednost to poslednaVrednost do
Begin
наредбa1;
наредба2;
...
наредбаn;
End;

Значењето е: За вредности на бројачот од некоја почетна вредност,


зголемувајќи ја по 1 до некоја крајна вредност да се извршат наредбите
или синтаксата на наредбата е:

for brojac:= pocetnaVrednost downto poslednaVrednost do


Begin
наредбa1;
наредба2;
...
наредбаn;
End;
Значењето на наредбата е:
За вредности на бројачот од некоја почетна вредност, намалувајќи ја по 1 до некоја крајна
вредност, да се извршат наредбите.
 
Прашање е кога која јамка треба да се користи?
Користете for јамка доколку знаете колку пати сакате јамката да се изврши. For јамката е
мошне брза и ефикасна.
Користете repeat.. until јамка ако не знаете колку пати треба да се изврши, но знаете дека
треба да се изврши барем еднаш.
Користете while..do јамка ако не знаете колку пати јамката треба да се изврши, а можно е
да не се изврши ниту еднаш.
 
Заштита на програмски блокови
 
 
Delphi овозможува пишување на мошне робусни апликации, се подразбира
дека истите ги обработуваат грешките мошне безбедно, вашата апликација
може лесно да се врати од состојбата во која настапила грешката, ако е
возможно и да се заврши ако е неопходно, а без губење податоци или
ресурси. Условите во кои се јавуваат грешки во Delphi се иницираат како
исклучоци (exceptions). Исклучок е објектот кој содржи информации за тоа како
настанала грешката и каде се случила.
 
 
Блоковите на кодови со специфични реакции на исклучоци се безбедни
блокови зошто можат да се заштитата од грешки, во спротивно можат да ја
прекинат апликацијата или оштетат податоците. Безбеден блок започнува со
резервиран збор try и завршува со зборот end. Помеѓу овие два збора вие
сместувате...
 

You might also like