Professional Documents
Culture Documents
Platno Canvas
Platno Canvas
Како што рековме објектот TShape не е единствена техника за цртање
облици на екран. Често цртањето е подобро со користење на објектот
TCanvas.
Значи цртањето на слики во работната површина на некои
компоненти може да се изведе со користење на својството Canvas
(платно). Вакво својство имаат и формите, сликите(Image), рамки со
листи (ListBox) i ComboBox кои преминуваат надвор од нашиот курс.
Особини или својства на TCanvas
Покрај формите и сликите може да се спомне и PaintBox (рамка за
боење) која се користи кога цртањето треба да се ограничи на
работниот дел од формата. Се разликува од компонентата Image по
тоа што нејзината содржина не може да се одреди за време на
проектирањето, ниту слика во неа да се чита од датотека или слика
од неа да се смести во датотека.
Сликите цртани со својството Canvas се привремени. Кога прозорецот
или компонента со слика одново се појавува на екран пр. зошто е
покриен со други прозорци од иста или друга апликација, сликата
мора повторно да се исцрта. Постои специјален настан OnPaint (при
цртање) кој се генерира секогаш кога Windows ќе процени дека
содржината на некој прозор треба повторно да се исцрта.
Својството Canvas е на располагање само за време на извршување на
апликацијата. Неговиот тип е TCanvas кој претставува класа со
поголем број својства и методи. Подесување на параметрите на
цртање се врши со помош на својствата, a ефективното цртање со
помош на методите на таа класа.
Координатите се задаваат во точки на екранот (pixels) во однос на работната
површина на компонентата чие својство Canvas се користи. Координатниот
почеток е во горниот лев агол. Апцисата (x oска) е насочена од лево кон десно, а
ординатата (y oска) од горе кон долу.
x
y
За претставување на точките се користи типот TPoint кој е дефиниран со:
record X, Y: Integer end;
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 purple #9370DB Medium sea green #3CB371 Medium slate blue #7B68EE
Medium spring green #00FA9A Medium turquoise #48D1CC Medium violet red #C71585
Пр. Исечок:
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 тоа не би го направил сам. Еден пр. на таква ситуација е промена на
големината на прозорецот.
Наредба 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-јамка)
While наредба (While-јамка)
For наредба (For-јамка)