Vezba Paintce

Preview:

Citation preview

Вежба :

Со оваа вежба ќе направиме апликација слична на PaintBrush под оперативниот систем Windows. Вежбата ќе оди чекор по чекор, а ќе научиме и други можности на  Delphi. Ќе работиме чекорно.Основните чекори се:

Реагирање на глушец,Додавање полиња во објектот на формата,Цртање линии,Додавање tool bar на формата,Додавање speed button на tool bar,Реагирање на кликањa на копчињата од глушецот,Цртање со различни алатки,Прилагодување на перото и четката,Додавање status bar,Цртање на bitmapi,Додавање менија,Печатење графика,Работа со графички датотеки,Користење Clipboard со графика.

чекор – Реагирање на глувче

Постојат четири типа акции со глувчето на кои апликацијата може да реагира. Три од нив се единствено за глушецот:копче на глувчето долу (глувче долу),   OnMouseDownглувчето е поместено и OnMouseMoveкопче на глувчето горе (глувче горе) OnMouseUp

Во оваа вежба нашата апликација ќе црта облици како одговор на кликања и поместувања: кликање на копче на глувчето покренува цртање, a отпуштање на копчето на глувчето го завршува цртањето. Исто така апликацијата ќе црта привремена слика на цртежот додека поместуваме  глувче, додека копчето на глувчето е кликнато.

Постојат три настани за глувчето, дефинирани во Delphi: OnMouseDown, OnMouseMove, OnMouseUp.

Кога апликацијата пишувана во Delphi, детектира работа со глувче, го повикува event handler дефиниран за соодветниот настан, пренесувајќи му неколку параметри. Параметрите се следните

Параметар Значење

Sender Објект кој детектирал акција на глувчето

Button Покажува кое копче на глувчето е вклучено:mbLeft,mbMiddle или mbRight.

Shift Покажува состојба на копче Alt, Ctrl и Shift во моментот на акција на глувчето.

X,Y Координати на кои доаѓа акција со глувчето

Во повеќе случаи, најважната информација во event handler‐от на глувчето се координатите, но понекогаш ќе проверете Button, за да одредете кое копче го предизвика настанот.

OnMouseDownКога корисникот ќе притисне копче на глувчето, настанот OnMouseDown е активиран. Тогаш објектот може да реагира на настанот.пример: Ќе направиме апликација кај која кога и да притиснеме копче на глувчето над формата почнува да испишува некој текст.Да креираме event handler OnMouseDown за самата форма.

procedure TfrmCrtko.FormMouseDown(Sender:TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCanvas.TextOut(X,Y,' Ovde Sum na ('+inttostr(x)+','+inttostr(y)+') ');end;

Значи овде искористивме параметри X и Y да добиеме точна позиција на глувчето кога ќе кликнеме и на таа позиција го испишуваме текстот со методата TextOut за пишување текст

Апликацијата уште не е во состојба да црта линија. Кликот на копче и кажува на апликацијата каде ќе почне со цртање, a за линија потребна е и крајна точка.Ќе го спомнеме овој event handler, за поставување позиција на цртање на координати каде корисникот ќе кликне на глувчето:

procedure TfrmCrtko.FormMouseDown(Sender:TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCanvas.MoveTo(X,Y);

end;

Овде кликот на копчето ја поставува позицијата на перото, поставувајќи почетна точка за линијата.  Сега треба да нацртаме линија на која корисникот го отпушта копчето. За таа цел треба да напишеме реакција на настан на глувчето горе.

OnMouseUp

Настанот OnMouseUp се извршува секогаш кога корисникот ќе ослободи кликнатото копче, настанот е за објект над кој е покажувачот на глувчето кога копчето е ослободено. Ни овозможува да цртаме, пример: Линија како да излегува од рамката на формата.

Значи дефинираме event handler OnMouseUp за формата ќе ја именувамеfrmCrtko.procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCanvas.LineTo(X,Y);end;

Со апликацијата можеме да цртаме линии со клик, повлекување и ослободување на копчето на глувчето. Меѓутоа, линијата не се гледа додека не го ослободите копчето. Во продолжение креираме код кој ќе даде повратна информација цртајќи привремени линии додека глувчето се движи.

OnMouseMove

Настанот OnMouseMove се случува периодично, кога корисникот го поместува глувчето.Треба да дефинираме OnMouseMove настан. Дефинирајте OnMouseMove event handler за формата.

procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginCanvas.LineTo(X,Y);end;

Кога ќе започна апликацијата забележуваме дека поместување на глувчето над формата причинува цртање кое го следи глувчето,  дури и пред клик на копчето. Настанот се извршува и без клик на глувчето.Мораме да додадеме наредби во апликацијата така да линијата се исцртува само на клик на глувчето.За водење сметка дали копчето е кликнато, потребно е да додадеме поле на објектот на формата.

2. чекор – Додавање поле во објектот на формата

Кога додаваме компонента на формата, Delphi додава поле кое ја претставува таа компонента на објектот на формата, и се разбира може да ја повикувате компонентата со името на нејзиното поле. Можете да додадете свои полиња во формата со уредување на декларацијата на типот на врвот unit на формата.

Во нашиот пример треба да се води сметка дали корисникот притиснал копче на глувчето. За да го направите тоа треба да додадете Boolean поле на променлива и да ја поставите неговата вредност кога корисникот ќе притисне копче.За додавање поле односно променлива уредете го editor kod‐от специфицирајќи идентификатор на полето и тип после директивата public на дното на декларацијата.Delphi е сопственик на било која декларација пред директивата public; тука става полиња кои претставуваат контроли и методи кои одговараат на настани.Формата за да има поле по име CrtaSe од тип Boolean, внесете во директиватаpublic CrtaSe Boolean;

Прикажано е на сл.

typeTfrmCrtko = class(TForm)procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

private{ Private declarations }publicCrtaSe:  Boolean:{ Public declarations }end;

Додадете уште две полиња TPoint, првото именувајте го PocеtnaTоcka, a второтоKrajnaTоcka:typeTfrmCrtko = class(TForm)procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

private{ Private declarations }publicCrtaSe:  Boolean:PocetnaTоcka, KrajnaTоcka: TPoint;{ Public declarations }end;

Сега кога имаме променлива CrtaSe, со чија помош водиме сметка дали е потребно да се црта, треба да се сетира на True кога корисникот ќе притисне копче на глувчето, и на False кога ќе го ослободи копчето.

procedure TfrmCrtko.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCrtaSe:= True;Canvas.MoveTo(X,Y);

end;

procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCanvas.LineTo(X,Y);CrtaSe:= False;  end;

После оваа модификација, модифицирајте го event handler OnMouseMove за да истиот црта кога е променливата CrtaSe True.

procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif  CrtaSe thenCanvas.LineTo(X,Y);

end;

Сега линијата се црта само помеѓу клик и пуштање на копчето од глувчето, но тоа не е многу корисно. Се уште се добиваат кривилести линии кои го следат поместувањето на глувчето наместо прави линии, а немаат врска меѓу почетната и крајната точка.

Проблемот е што секогаш кога доаѓа до поместување на глувчето се повикуваLineTo, која ја поместува позицијата на перото, до времето додека не го ослободите копчето сте ја изгубиле точката од која линијата требаше да почне.Во следниот дел ќе користиме променлива PocetnaTоcka, и KrajnaTоcka.

3. чекор – Цртање линии

Првиот чекор кој ќе го направиме е водење сметка за почетната точка на линијата, за да можеме да ја нацртаме конечната линија.

3.1. Бележење на почетната линијаНајбитната работа за која треба да се води сметка кај цртањето линии е почетокот на линијата. Знаеме каде таа завршува, зошто тоа е место каде копчето е ослободено. Event handler OnMouseUp треба да знае каде започнува линијата. На сцена стапува полето PocetnaTоcka.Сетирајте PocetnaTоcka да покажува на место каде копчето на глувчето е кликнато, така да кај ослободувањето на глувчето, почетната точка биде прецизно одредена.

procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCanvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(X,Y);CrtaSe:= False;  end;

procedure TfrmCrtko.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCrtaSe:= True;Canvas.MoveTo(X,Y);PocetnaTocka:=Point(X,Y);

end;Овие промени доведуваат до тоа апликацијата да ја црта крајната линија повторно , но што со цртањето во меѓувреме.

Значи проблемот е со event handler OnMouseMove, односно додека се црта линијата од моменталната позиција на глувчето, тој црта и линија од последната позиција на глувчето, а не од почетната позиција.Сега кога апликацијата води сметка за почетната точка, проблемот може лесно да се отстрани. Поместете ја позицијата за цртање на почетната точка, и потоа цртајте до моменталната точка.

procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif  CrtaSe thenbeginCanvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(X,Y);

end;end;

Сега полето е врзано да добиете линија до моменталната позиција на глувчето. За жал и останатите линии се тука, па тешко е да се каже која линија е крајна.

Трикот е во тоа да се избрише секоја линија пред да се исцрта следната, а тоа значи да водиме сметка за тоа каде се наоѓала претходната линија. За таа намена ни служи променливата KrajnaTоcka, која порано ја додадовме.

Наместете ја променливата KrajnaTоcka на крајна точка на секоја меѓулинија, така да можете да користите KrajnaTоcka и PocetnaTоcka за бришење на тие линии кај цртање на следната линија.

procedure TfrmCrtko.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCrtaSe:= True;Canvas.MoveTo(X,Y);PocetnaTocka:=Point(X,Y);KrajnaTocka:=Point(X,Y);

end;procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif  CrtaSe thenbeginCanvas.Pen.Mode:=pmNotXor;Canvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(KrajnaTocka.X,  KrajnaTocka.Y); Canvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(X,Y);

end;KrajnaTocka:=Point(X,Y);Canvas.Pen.Mode:=pmCopy;end;

Сега добивме квалитетен “rubber‐band” ефект кога повлекуваме линија. Менувајќи го mod на перото на pmNotXor, ја комбиниравме нашата линија со позадински пиксели. Кога бришеме линија, ние всушност сетираме пиксели во состојба во која биле пред да станат дел од линијата. Менувајќи го mod на перото на pmCopy (што е подразбирлива состојба) после цртање линии, перото е повторно спремно за исцртување на крајната линија кога ќе го ослободиме глувчето.

Во продолжение ќе дефинираме tool bar кој ќе ни овозможи да избираме што да цртаме односно кои облици сакаме да ги цртаме; правоаголник, елипса итн.

4. чекор – Додавање tool bar на формата

Tool bar е панел, обично со целата ширина на горниот дел на формата, под menu bar‐от, на кој се наоѓаат контролите, обично копчиња. Toolbar ни овозможува лесен и прегледен начин за претставување опции на нашата програма. За да додадете toolbar на формата направете следно:

Додадете компонента Panel на формата.Сетирајте ја особината Align на AlTop. Кога е порамнета со врвот на формата, панелот ја задржува својата висина, но се подесува на ширината на клиент подрачјето на формата дури и кога прозорецот ја менува големината.Додадете компонента Speed button или друга компонента на bar.

Можете да додадете онолку tool bar‐ови на формата колку ни е потребно.

Додадете tool bar во нашата програма и избришете ја неговата особина Caption.

5. чекор – Додавање компонента speed button на tool bar

Со Delphi добивате компонента speed button дизајнирани за користење во tool bar‐ови. Speed button обично нема на себе натпис, само мала слика која се вика glyph, која претставува функција на копчето.Speed buttoon‐ите имаат три можни начини на работа.Тие можат

Да се однесуваат како стандардни копчињаДа се вклучуваат и исклучуваат како прекинувачиДа се однесуваат како група на radio копчиња

Нашата програма Crtko ќе користи нешто од тие можности.За да поставиме speed buttun на tool bar едноставно ставете компонента speed button на панелот кој претставува tool bar. Panel‐от е сопственик на speed копчињата така да поместување или отстранување на панелот, доведува до поместување или отстранување на speed копчињата.За нашиот пример додадете 6 speed копчиња како што е прикажано на сликата и сменете ја особината Name според табелата која се наоѓа под сликата.

Pozicija speed button (од лево на десно) Name

1 btnLinija

2 btnPravoagolnik

3 btnElipsa

4 btnZaobPravoagolnik

5 btnPenkalo

6 btnCetka

Подразбирлива висина (height) на tool bar е 41, на speed buton е 25. Ако ја сетирате особината Top за секое speed копче на 8 ќе бидат вертикално центрирани.

Додавање glyph за speed button

Секое speed копче треба на себе да има графичка презентација односно представка, во delphi наречена glyph, за да покажува што работи тоа копче. Ако на speed копчето придружиме само една слика, копчето манипулира со таа слика за да покаже дека копчето е притиснато, ослободено, селектирано или оневозможено. На секое копче можно е да се доделат повеќе слики, кои ќе ги прикажат сите состојби на копчето.Вообичаено е glyph‐oвите да се доделуваат за време на креирање на програмата, а можно е за време на извршување на програмата.За да доделиме glyph за speed копче за време на креирање на програмата направете следно:Селектирајте speed button, во Object Inspector‐от, селектирајте особина Glyph, и кликнете два пати на колоната Value покрај Glyph.

Тогаш delphi отвора picture editor 

Кликнете на Load, селектирајте *.bmp датотека која содржи слика која сакате да се прикаже на speed копчето и кликнете на OK,Кликнете на OK со што Picture editor‐от се затвора.

Направете го ова за секој speed button за нашата програма. На следната слика е прикажан готов tool bar, а во табелата се дадени имиња на датотеки со соодветна слика. Овие датотеки се наоѓаат во директориумот c:\Temp\Glyph

Pozicija speed button (од лево на десно)

Име на датотеката

1 Line.bmp

2 Rect.bmp

3 Ellipse.bmp

4 RoundRect.bmp

5 pen.bmp

6 Brush.bmp

Сетирање на почетните услови на speed button

Врз основа на изгледот на speed button, корисникот заклучува во која состојба е. Бидејќи немаат натпис на себе важно е графички да се долови состојбата на speed button‐от.

За да изгледа дека speed button е кликнат, неговата особина Down се сетира на True.За да изгледа дека speed button е оневозможен, неговата особина Enabledсетирајте ја на False.

Бидејќи подразбирливата алатка за цртање линии, треба да обезбедиме копчето за цртање линии е кликнато кога програмата ќе стартува.

Сетирајте ја особината Down на speed button‐от  btnLinijа na True.

Креирање група speed button

Серија speed button често претставува група меѓусебно исклучиви избори. Во тој случај треба да вклучите speed button‐и во група, така да клик на било кое копче во групата предизвикува реакција на други speed копчиња во групата.

За да вклучиме било кој број speed button во група, доделете ист број на секоја особина GroupIndex. Најлесно ова се прави со селектирање на сите speed копчиња кои ги сакаме во група, и додека е групата селектирана, сетирајте GroupIndex на единствена вредност.

Бидејќи алатките за избор на обликот кој се црта се меѓусебно исклучиви, вклучете ги во група.

Селектирајте 4 алатки за цртање (4 speed button‐и од лева страна) и сетирајте го нивниот GroupIndex на 1. Сега кога ја стартувате програмата, проверете што добивте.

Дозволување на “прекинувачака” работа

Понекогаш ќе сакате да кликнете на копче кое е веќе кликнато во tool bar‐от, со цел тоа да се исклучи, а да ниту едно копче во таа група во tool bar‐от не биде во тој момент вклучено, т.е. сите да се исклучени. Таквото копче се вика toggle(префрли од еден режим во друг). Со помош на AllowAllUp (допушти сите горе), креирајте групирано копче кое ќе се однесува како прекинувач: кликнете го повторно и тој е горе (исклучен).

За да групирате speed button, сетирајте ја неговата особина AllowAllUp na True. Со ова автоматски е подесена особината и за останатите speed button‐и во групата на иста вредност. Со ова групата функционира на стариот начин, но можно е во групата да нема воопшто селектирани (кликнати) копчиња.

И копчето за перо и копчето за четка се однесуваат во нашата вежба како прекинувачи. Обезбедете секој да има особина AllowAllUp на True, а потоа особината GroupIndex за btnPenkalo i btnCetka сетирајте ја на 2 и 3, респективно, зошто не сакаме да припаѓаат во иста група.

6. чекор – Реагирање на кликања на глувче

Кога корисникот ќе кликне на контрола, како што е speed button на tool bar‐от, програмата генерира OnClick настан, тоа го знаеме. Компонентата speed button има два настани : OnClick и OnDblClick.

Delphi генерира OnClick event handler по името на кликнатата контрола.

7. чекор – Цртање со различни алатки

Графичките програми имаат потреба за водење сметка за тоа кој тип алатки за цртање ви се на располагање во било кој момент. Можете да доделите број на секој тип на алатки, но морате да знаете секој број што значи. Полесно можете да направите доделувајќи константно име на секој број, но вашата програма нема да биде во состојба да разликува кои броеви се во соодветниот ранг и дали се на вистинскиот тип. За среќа Object Pascal има начини да ги регулира обата недостатоци. Може да декларирате променлива од преброив тип.

Преброив тип всушност е еден вид кратенка за доделување секвенцијални вредности на константите. За да декларираме преброив тип ќе го користиме резервираниот збор type, после доаѓа идентификаторот за тип, знакот за еднаквост и идентификаторите за вредности во типот во заградите, одвоени со запирки.Ќе додадете декларација од тип TAlatkiZaCtranje над декларациите во класата форма:typeTAlatkiZaCrtanje = (dtLinija,dtPravoagolnik,dtElipsa,dtZaobPrav);TForm1 = class(TForm)

....

....По договор, идентификаторите започнуваат со буквата T, а група на слични константи (како оние кои сочинуваат наброив тип) започнуваат со 2 мали букви кои имаат врска со името на типот (како што dt претставува “drawing tool”).Декларацијата од тип TAlatkiZaCrtanje е еквивалентна со декларацијата на група константи:constdtLinija = 0;dtPravoagolnik = 1;dtElipsa = 2;dtZaobPrav = 3;

Основната разлика е што се декларира преброив тип, на константната се придружува уште нешто освен вредноста, а тоа е типот кој овозможува со помош на проверка на типот во Object Pascal спречите голем број грешки. Променливата од тип AlatkiZaCrtanje може да е една од константите набројани кај декларацијата. Обидот за додавање на некој друг број (дури и оној од опсег 0..3) генерира грешка за време на компајлирањето.Сега може да додадете поле односно променлива на формата со цел водење сметка за алатката за цртање:typeTAlatkiZaCrtanje = (dtLinija,dtPravoagolnik,dtElipsa,dtZaobPrav);TfrmCrtko = class(TForm)

.....

.....

.....private{ Private declarations }publicCrtaSe: Boolean;PocetnaTocka,KrajnaTocka:TPoint;AlatkiZaCrtanje: TAlatkiZaCrtanje;{ Public declarations }end;

Сега кога сте во состојба на формата да и кажете кој тип алатка да користите, единствено треба да се научи формата како да црта различни облици. Единствени методи кои цртаат се поместување на глувчето и handler за подигнување на глувчето, и единствен код за цртање кој црта само линии, без оглед која алатка е избрана.

Користење на алатки за цртањеВашата програма треба да одбира како да црта, врз основа на селектираната алатка.Цртањето различни облици е едноставно како и цртањето линии: двете активности користат само една наредба, а се познати сите координати.Ако имате мал избор, ќе ја измените методата за цртање така да сега изгледа вака, односно измените OnMouseUp event handler за цртање облик за сите алатки кои ги дефиниравме:procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);begincase AlatkiZaCrtanje ofdtLinija: beginCanvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(X,Y);

end;dtPravoagolnik: beginCanvas.Rectangle(PocetnaTocka.X, PocetnaTocka.Y,X,Y);

end;dtElipsa:      beginCanvas.Ellipse(PocetnaTocka.X, PocetnaTocka.Y,X,Y);

end;

dtZaobPrav:    begin

Canvas.RoundRect(PocetnaTocka.X, PocetnaTocka.Y,X,Y,(PocetnaTocka.X‐X),(PocetnaTocka.Y‐Y));

end;end;          {end of case}CrtaSe:=False;end; 

Секако треба да го измените handler‐от OnMouseMove заради нови облици:procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif CrtaSe thenbeginCanvas.Pen.Mode:=pmNotXor;case AlatkiZaCrtanje ofdtLinija: begin

Canvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(KrajnaTocka.X, KrajnaTocka.Y);Canvas.MoveTo(PocetnaTocka.X, PocetnaTocka.Y);Canvas.LineTo(X,Y);

end;dtPravoagolnik: begin

Canvas.Rectangle(PocetnaTocka.X, PocetnaTocka.Y,KrajnaTocka.X, KrajnaTocka.Y);

Canvas.Rectangle(PocetnaTocka.X, PocetnaTocka.Y,X, Y);

end;

dtElipsa: beginCanvas.Ellipse(PocetnaTocka.X, PocetnaTocka.Y, KrajnaTocka.X, KrajnaTocka.Y);Canvas.Ellipse(PocetnaTocka.X, PocetnaTocka.Y, X, Y);end;dtZaobPrav: beginCanvas.RoundRect(PocetnaTocka.X, PocetnaTocka.Y, KrajnaTocka.X, 

KrajnaTocka.Y,(PocetnaTocka.X‐KrajnaTocka.X)div 2, (PocetnaTocka.Y‐KrajnaTocka.Y) div 2 );Canvas.RoundRect(PocetnaTocka.X, PocetnaTocka.Y, X, Y,(PocetnaTocka.X‐

KrajnaTocka.X) div 2,  (PocetnaTocka.Y‐KrajnaTocka.Y)div 2 );end;end; {end of case}KrajnaTocka:=Point(X,Y);

end;  {end of if}Canvas.Pen.Mode:=pmCopy;

end;

Ќе забележите дека овде има доста кодови кои се повторуваат. Всушност кодот за цртање на секој облик се повторува три различни пати. Ова е добар пример кога треба повторувачкиот код да го префрлите во посебна рутина. Во продолжение целиот код за цртање облици ќе го ставите во една метода која ја повикуваат двата  event handler‐и од глувчето.

Додавање методи односно процедури во формата

За да додадете процедура во формата направете:

Додадете декларација на метода во објектот на форма. Може да додадете декларација или во public или во private делот на крајот од декларацијата на објектот на форма. Ако кодот има детаљи за некои настани, посигурно е методата да биде private.

За да се ослободите од повторувачкиот код за цртање облици од event handler‐от, може да додадете метода по име CrtajShape и да ја повикате од секој handler:

Додадете декларација од CrtajShape во декларацијата на објектот на формата, така што во public ќе го запишете следното:

typeTAlatkiZaCrtanje = (dtLinija,dtPravoagolnik,dtElipsa,dtZaobPrav);TfrmCrtko = class(TForm).........publicCrtaSe: Boolean;PocetnaTocka,KrajnaTocka:TPoint; AlatkiZaCrtanje: TAlatkiZaCrtanje;procedure CrtajShape(TopLeft,BottomRight:TPoint;AMode:TPenMode);

{ Public declarations }end;

Сега треба да напишеме и процедура CrtajShape, ќе го направиме додавајќи го следниот код односно процедура implementation во делот unit.implementation{$R *.DFM}procedure TfrmCrtko.CrtajShape(TopLeft,BottomRight:TPoint;AMode:TPenMode);beginwith Canvas dobeginPen.Mode:=AMode; case AlatkiZaCrtanje of     dtLinija: begin

MoveTo(TopLeft.X, TopLeft.Y);LineTo(BottomRight.X,BottomRight.Y);

end;dtPravoagolnik: beginRectangle(TopLeft.X, TopLeft.Y,BottomRight.X,BottomRight.Y);

end;dtElipsa:   

beginEllipse(TopLeft.X, TopLeft.Y,BottomRight.X,BottomRight.Y);

end;dtZaobPrav: 

beginRoundRect(TopLeft.X, TopLeft.Y,BottomRight.X,BottomRight.Y,

(TopLeft.X‐BottomRight.X) div 2,(TopLeft.Y‐BottomRight.Y) div 2);end;end;  {end of case}end;     {end canvas do}end;

Секако треба да ги измените event handler‐ите, OnMoseUp, и OnMouseMove, за да ја повикате процедурата CrtajShape. Сега тие изгледаат:procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginif CrtaSe thenbeginCrtajShape(PocetnaTocka, Point(X,Y), pmCopy);CrtaSe:=False;end;

end;procedure TfrmCrtko.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);beginif CrtaSe thenbeginCrtajShape(PocetnaTocka, KrajnaTocka, pmNotXor);KrajnaTocka:=Point(X,Y);Canvas.Pen.Mode:=pmCopy;CrtajShape(PocetnaTocka, KrajnaTocka, pmNotXor);

end;end;

Сега програмата Crtko црта само линии, треба да го оспособиме да црта и други облици, не само линии.Во секој од speed button‐ите креирајте OnClick настан кој има структура:procedure TfrmCrtko.btnLinijaClick(Sender: TObject);beginAlatkiZaCrtanje := dtLinija;end;

procedure TfrmCrtko.btnPravoagolnikClick(Sender: TObject);beginAlatkiZaCrtanje := dtPravoagolnik;end;

procedure TfrmCrtko.btnElipsaClick(Sender: TObject);beginAlatkiZaCrtanje := dtElipsa;

end;

procedure TfrmCrtko.btnZaobPravClick(Sender: TObject);beginAlatkiZaCrtanje := dtZaobPrav;

end;

чекор – Подесување на перо и четка

Графичката програма којa дозволува цртање црно‐бели слики не е интересна. За да користите повеќе бои треба да ги измените перото и четката кои canvas ги користи за цртање и боење. Но, пред тоа ќе додадеме два нови скриени tool bar‐ови.Tool bar‐овите не мораат да бидат видливи цело време. На располагање треба имате повеќе tool bar‐ови, но да се прикажат по желба на корисникот.

За да креирате скриен tool bar,

Додадете два paneli на формата.За двата панели сменете ја особината Align на alTop, и наместете ја особината Visible на False. Се разбира избришете им ги вредностите за особината Caption.

Иако tool bar‐овите остануваат видливи за време на креирање на програмата и можете да ги модифицирате, се скриени за време на извршување на програмата се додека апликацијата не ја смени нивната состојба.

На првиот tool bar од горе дајте му име CetkaBar, односно напишете во особината Name CetkaBar, а на другиот PenkaloBar.

Даден е изгледот на tool bar‐овите, а во табелите и имињата на speed button‐ите.

Освен тоа забележувате дека во овие tool  bar‐ови имаме и други контроли освен speed button‐и: лизгач, лабелa и colorgrid во случај PenkaloBar,  како иcolorgrid во случај на CetkaBar.

Додадете ги контролите на tool bar‐от да изгледа како на сл.Особината Name за контролите на tool bar‐от CetkaBar:

Позиција на speed button (од лево на десно) Name

1 SolidPen2 DashPen3 DotPen4 DashDotPen5 DashDotDotPen6 ClearPen7 PenColor8 PenWidth9 PenSize

Особината Name за контролите на tool bar‐от PenkaloBar:

Позиција на speed button (од лево на десно) Name

1 SolidBrush

2 ClearBrush

3 HorizontalBrush

4 VerticalBrush

5 FDiagonalBrush

6 BDiagonalBrush

7 CrossBrush

8 DiagCrossBrush

9 BrushColor

Во продолжение дадена е табела со сетирање особини за tool bar‐овите:Komponenta Osobina Vrednost 

SolidPen Glyph Solid.bmpDown True

DashPen Glyph Dashed.bmpDotPen Glyph Dotted.bmp

DashDotPen Glyph Dashdot.bmpDashDotDotPen Glyph dashdot2.bmp

ClearPen Glyph clear.bmpPenColor BackgroundEnabled False

GridOrdering go8x2Height 30Top 5Width 144

PenWidth LargeChange 10Top 12

FocusControl PenWidthCaption 1Top 13

SolidBrush Glyph Fsolid.bmpDown True

ClearBrush Glyph fclear.bmpHorizontalBrush Glyph fhorizontal.bmpVerticalBrush BrushGlyph fvert.bmpFDiagonalBrush Glyph fdiag.bmpBDiagonalBrush Glyph bdiag.bmpCrossBrush Glyph cross.bmp

DiagCrossBrush Glyph dcross.bmpBrushColor BackgroundEnabled False

GridOrdering go8x2Height 30Top 5Width 144

Криење и прикажување на tool bar‐овите

За да сокриете или прикажете tool bar за време на извршување на програмата, сетирајте ја особината Visible на False или True.Во нашата вежба за да ги сокриеме или прикажеме tool bar‐овите PenkaloBar и CetkaBar, ќе додадеме OnClick настан за копчето btnPenkalo и копчето btnCetkaБидејќи секој клик на едно од овие копчиња “го спушта” или “го крева” копчето, може да се додаде event handler OnClick кој ќе ги прикаже или сокрие соодветнитеtool bar‐ови, зависно дали копчето е горе или долу.Додадете го следниот код:procedure TfrmCrtko.btnPenkaloClick(Sender: TObject);beginPenkaloBar.Visible:=btnPenkalo.Down;end;

procedure TfrmCrtko.btnCetkaClick(Sender: TObject);beginCetkaBar.Visible:=btnCetka.Down;end;

Ако ја извршиме апликацијата, ќе забележите дека tool bar‐овите се појавуваат и кријат по потреба.Сега кога имаме tool bar‐ови за перото и четката во продолжение ќе биде појаснето нивното користење за работа со алатките за цртање.

Менување стил на перотоСтилот на перото одредува кој тип на линија се исцртува со перото, како полна, испрекината или точкеста или др. Односно стилот на перо е дефиниран во особината Style која може да има вредности: psSolid, psDash, psDashDot,psDashDotDot или psClear.

Доделување на event handler

Различните методи можат да користат ист event handler за да ги регулираат настаните, се додека настаните се компатибилни, значи го користат event handler‐от со исти параметри во ист редослед.

За да доделиме event handler, ќе доделиме ист event handler за настани на неколку контроли. Ако треба да се одреди која контрола го предизвикала настанот, ќе го користиме параметарот Sender.Во нашата апликација, ќе креираме event handler OnClick, за сите копчиња кои треба да направат промена на стил на перо и ќе користиме параметарот Sender за да одредиме кое копче е притиснато.

Ќе го направиме на следниот начин:Селектирајте ги сите 6 копчиња за стил на перо (со Shift) кои се наоѓаат на tool bar‐от PenkaloBarВо страницата Events во Object Inspector‐от, селектирајте OnClick.Во колоната Handler (во белиот edit box за OnClick) внесете SetiranjeStilPenkalo i притиснетеEnter. Delphi генерира празен клик handler по име SetiranjeStilPero i поврзувајќи го OnClickevent handler за сите 6 копчиња.Пополнете го event handler, сетирајќи го стилот на перото зависно од вредноста на  Sender:procedure TfrmCrtko.SetiranjeStilPenkalo(Sender: TObject);beginwith Canvas.Pen doif Sender=SolidPen thenStyle:=psSolid

elseif Sender=DashPen thenStyle:=psDash

elseif Sender=DotPen thenStyle:=psDot

elseif Sender=DashDotPen thenStyle:=psDashDot

elseif Sender=ClearPen thenStyle:=psClear;

end;

Промена боја на перо 

Бојата на перото ја одредува бојата на линијата која се црта со перото, вклучително линиите кои претставуваат граничници на цртаните облици како и др. линии.Во нашиот пример ќе користиме ColorGrid компонента на tool bar‐от PeroBar за корисникот избере нова боја за перото. ColorGrid може да сетира и боја за позадина и боја напред. Во нашиот случај, сакаме само една боја, ќе користиме боја напред.Значи за компонентата ColorGrid која ја нарековме PenColor креирајте настан OnClick со следен код:procedure TfrmCrtko.PenColorClick(Sender: TObject);beginCanvas.Pen.Color:=PenColor.ForegroundColor;end;

Промена на ширина на перо

Ширината на перото одредува дебелина во пиксели на линијата која ја цртаме. Запомнете кога дебелината е поголема од  1, некои видео драјвери секогаш покажуваат полни линии, без оглед која вредност е сетирана за особина Style.Во нашиот пр. ќе користиме лизгач на tool bar‐от перо за сетирање вредност за ширина на перото. Ќе ја смените лабелата покрај лизгачот за да имаме приказ на моменталната вредност на лизгачот. Напишете event handler за настан OnChangeна лизгачот PenWidth:procedure TfrmCrtko.PenWidthChange(Sender: TObject);beginCanvas.Pen.wIDTH:=PenWidth.Position;PenSize.Caption:=IntToStr(PenWidth.Position);end;

Менување стил на четкаСтилот на четката одредува која шара ја користи canvas за пополнување на обликот при цртање.Во примеров аналогно на создавање на event hedler за сетирање на стил на перо, да креираме event handler OnClick за 8‐те  копчиња speed buton. Селектирајте ги сите 8 копчиња за промена на стилот на четката и впишете SetiranjeStilCetka за event handler  OnClick.procedure TfrmCrtko.SetiranjeStilCetka(Sender: TObject);beginwith Canvas.Brush dobegin

if Sender=SolidBrush thenStyle:=bsSolid

elseif Sender=ClearBrush thenStyle:=bsClear

elseif Sender=HorizontalBrush thenStyle:=bsHorizontal

else

if Sender=VerticalBrush thenStyle:=bsVertical

elseif Sender=FDiagonalBrush thenStyle:=bsFDiagonal

elseif Sender=BDiagonalBrush thenStyle:=bsBDiagonal

elseif Sender=CrossBrush thenStyle:=bsCross

elseif Sender=DiagCrossBrush thenStyle:=bsDiagCross;

end;end;

Промена на боја на четка

Исто така креирајте аналоген код како и кај перото и за компонентата ColorGrid за промена на боја на четката BrushColor.

procedure TfrmCrtko.BrushColorClick(Sender: TObject);beginCanvas.Brush.Color:=BrushColor.ForegroundColor;end;

9. чекор – Додавање status bar

Status bar е сличен на tool bar, освен што обично го завзема дното на прозорецот наместо врвот и наместо да има контроли, status bar‐от обично прикажува текст. Delphi има посебна компонента StatusBar на картичката Win32, но ние сами ќе направиме status bar со помош на компонентата Panel. За да креирате status bar на формата направете:

Сместете компонента Panel на формата, сетирајте ја нејзината особина Align наalBottom,  a  пак  особината Caption избришете ја.

Делење на status bar

Често ќе сакаме да го поделиме панелот, посебно оној кој служи како status bar на повеќе независни подрачја. Тоа ќе го постигнеме на следниов начин:

Додадете уште еден Panel кој ќе го ставите на Panel кој пред малку го креиравте. Именувајте го PanPocetnaPozicija (Name),  сетирајте му ја особината Align на alLeft. Потоа додадете и десен Panel исто така ставете го на постоечкиот Panel, именувајте го PanMomentnaPozicija (Name) и сетирајте му ја особината Align на alClient.

Потоа и на едниот и на другиот Panel сетирајте ја особината BeveIlnner и BorderWidth на bvLowered и 2 респективно.Со тоа нашиот Status bar има 3d изглед.

Менување содржина на status barКога поставувате status bar на формата потребно е да менувате информации кои се наоѓаат наstatus bar‐от. Бидејќи имаме два панели содржината на PanPocetnaPozicija ќе рефлектира положба на почетна позиција на глувчето, а  PanMomentnaPozicija ќе рефлектира положба на моменталната положба на глувчето.Мораме да го промениме event handler OnMouseMove , OnMouseDown и OnMouseUp.procedure TfrmCrtko.FormMouseDown(Sender:TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginCrtaSe:=True;Canvas.MoveTo(X,Y);PocetnaTocka:=Point(X,Y);KrajnaTocka:=Point(X,Y);PanPocetnaPozicija.Caption:=Format('pocetna pozicija: (%d,%d)', [X,Y]);

end;procedure TfrmCrtko.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);beginif CrtaSe thenbeginCrtajShape(PocetnaTocka, Point(X,Y), pmCopy);CrtaSe:=False;end;PanMomentnaPozicija.Caption:=Format('momentalna pozicija: (%d,%d)', [X,Y]);end;

10. чекор – Цртање на bitmapа

Многу ретко ќе цртаме директно на формата. Почесто, апликацијата ќе ја цртаме на  bitmapа, зошто bitmap‐ите се флексибилни за операции како копирање, печатење и зачувување. Delphi‐евата контрола Image е компонента која може во себе да има bitmapa, со што е олеснет начинот на сместување една или повеќе bitmap‐и на формата.Bitmapa‐та може да биде или помала или поголема од самата големина на формата. Додавајќи лизгач на формата и сместувајќи image контрола на неа, може да цртате на bitmap‐ите кои се доста поголеми од формата или поголеми од екранот.За креирање на скроловано подрачје, сместете ја scroll box компонентата ( Additional палета со компоненти) на формата и сетирајте ја особината Align на alClient, со што обезбедувате покриеност на целото подрачје на формата.

А за да креирате контрола за приказ на слика уфрлете на формата компонентаImage и сетирајте ја нејзината особина AutoSize на True и особината Left и Bottomна вредност 0.

Сетирање на почетните големини за bitmapаКога ставате image компонента, таа на себе нема слика. Креиравте подлога, но нема податок за тоа што прикажува. Ако подлогата чува една одредена слика, може да ја сетирате особината Picture контролата за време на креирање на формата. Компонентата може да вчита слика за време на извршување на програмата. Ако од друга страна ви е потребна празна контрола заради цртање, тогаш треба да ја креирате за време на извршување на програмата.За креирање на празна bitmapа кога стартува апликацијата,поврзете го event handler‐от за OnCreate настан на формата која има контрола, креирајте bitmap објект, и доделете  го на особината Picture на Graphic контрола image. Појасно ќе биде кога ќе го видиме кодот.Значи за формата која ја именувавме frmCrtko треба да креираме настан OnCreate и да го впишиме следниот код.

procedure TfrmCrtko.FormCreate(Sender: TObject);var Bitmap:TBitmap;beginBitMap:=TBitmap.Create;Bitmap.Width:=400;Bitmap.Height:=400;Image1.Picture.Graphic:=Bitmap;end;

Доделување на bitmap‐ата особина Graphic му дава на објектот слика со сопственост над bitmap‐ата. Од тие причини, кога ќе заврши работа со неа, ќе ја уништи, така да нема потреба вие тоа експлицитно да го работите.Ако сега ја стартуваме апликацијата ќе видиме дека клиент подрачјето на формата има еден бел дел кој претставува bitmap‐а. Ако се промени големината на формата како не би се видела целосно bitmap‐ата, автоматски се поставуваат соодветни лизгачи со кои може да се види целата bitmap‐а.Но ако се обидете да цртате по bitmap‐а, сеуште не сте во можност, зошто апликацијата црта по формата, која сега се наоѓа под подрачјето на лизгачот.За да цртате по bitmap‐а морате да користите canvas за image, а не canvas за form‐а.Најлесно е да извршите промени со еditor‐овото search‐and‐replace дијалог прозорец, со кое секое појавување “Canvas” ќе го замените со “Image.Canvas” за настаните на формата OnMouseDown, OnMouseMove, OnMouseUp и CrtajShape.Поврзете ги handler за настаните од страна на глувчето со одредени настани на контролата image.Во Object Inspector‐от, кликнете на листата покрај OnMouseDown за контролата image, односно компонента и селектирајте FormMouseDown, истото направете го и за OnMouseUp и OnMouseMove. Ако сакате можете да ги  “отфрлете” овие  handler‐и од формата, зошто не и се потребни, но и не морате, зошто формата заради контролите на неа, не е во состојба да прими настани врзани за глувчето на кои би можела да реагира.Сега кога ја извршувате апликацијата можете да цртате како и порано, но само на image контролата.

11. чекор – Додавање менија

За да ја комплетираме нашата апликација треба да работи и со менија, ако апликацијата е предвидена за работа со глувче.

За да додадеме мени за апликација, додадете невидлива компонента MainMenu(Standard) на формата.После тоа кликнете два пати на иконатаMainMeni да добиете Meni дијалог прозорец во кој ќе креирате опции и подопции на мени. Креирајте опции File и Edit, како и подопции прикажани во табелата:

&File &Edit

&Nova slika O&dseci

&Otvori  &Kopiraj

&Zacuvaj Z&alepi

Zacuvaj &kako

P&ecati

‐ (crta)

&Izlez

Сега кога имаме meni, пожелно е одма да креирате event handler за опција излез од менито File со чија помош се излегува од програмата. Едноставно ќе го поврзите веќе креираниот event handler OnClick за speed button btnIzlеz со настанот OnClick за подопцијата Izlеz.

На останатите опции на менито, во продолжение ќе придружите соодветниevent handler‐и.

Печатење графика

Печатење слика од Delphi е мошне едноставен процес. Единствено потребно е да додадете unit Printers во uses клаузулата на формата која ќе го повика печатачот. Unit Printers декларира објект Printer кој содржи canvas кој претставува печатена страница.На нашиот пример, ќе печатиме содржина на контролата image како одговор на клик на опцијата Печати на менито File. Креирајте OnClick настан за опцијата Печати.procedure TfrmCrtko.Pecati1Click(Sender: TObject);beginwith Printer dobeginBeginDoc;Canvas.Draw(0,0,Image1.Picture.Graphic);endDoc;end;

end;

12. чекор‐Работа со графички датотеки

Сликите кои постојат само за време на извршување на програмата се од помало значење. Пожелно е во програмата да имаме опции за отворање на веќе зачувани слики и опција за зачувување на сликата.Пред да ја направиме таа можност во програмата мораме да го направиме следното:

Додадете невидлива компонента OpenDialog и SaveDialog, одвишно е да зборуваме која за што служи.Ќе додадеме една јавна променлива под име TekovenFajl од тип String.

Вчитување слика од датотека

Способноста за вчитување слика од датотека е мошне важна ако апликацијата има потреба за модификација на сликата.За да вчитате слика во контролата image повикајте LoadFromFile метода на контролата image на објектот Picture. Додадете го следниот handler настан OnClickна опцијата Otvori на менито File.

procedure TfrmCrtko.Otvori1Click(Sender: TObject);beginif OpenDialog1.Execute thenbeginTekovenFajl:=OpenDialog1.FileName;Image1.Picture.LoadFromFile(TekovenFajl);end;

end;

Зачувување слика во датотека

Аналогно на отворање на fajl односно слика, креирајте handler за зачувување слика за опциите Zacuvaj I Zacuvaj kako од менито File, кои регулираат повторно зачувување, зачувување датотека која сеуште нема име и зачувување постоечка датотека под ново име.

procedure TfrmCrtko.Zacuvaj1Click(Sender: TObject);beginif TekovenFajl<>' '  thenImage1.Picture.SaveToFile(TekovenFajl)else Zacuvajkako1Click(Sender);

end;

procedure TfrmCrtko.Zacuvajkako1Click(Sender: TObject);beginif SaveDialog1.Execute thenbeginTekovenFajl:=SaveDialog1.FileName;Zacuvaj1Click(Sender);end;

end;

Замена на слики

Во Image контролата можете да замените слика во секој момент. Ако доделите нова слика, таа ја заменува постоечката на екранот.За да замените слика во image контролата, доделете нова слика во Picture објектот.Креирањето нова слика е ист процес како и креирањето иницијална слика, но треба да дадеме можност корисникот да одбере големина на слика која сака да ја креира. Најлесно е да се направи со помош на дијалог бокс како следниов:

Form‐ата именувајте ја frmBmpDlg ‐ особина Name, а во особината Captionнапишете Dimenzii na Bitmapa.На самата форма поставете две компоненти Label и во Caption поставете натпис Sirina i Visina респективно.На формата поставете две нови компоненти под име BitButton на кои респективно ќе ја сетираме особината Kind на bkOk и bkCancel.

Потребно е уште да ја поврземе главната форма со формата која врши промена на големината на нашата слика.Ќе го направиме така што за опцијата Nova Slika ќе додадеме event handler OnClickprocedure TfrmCrtko.Novaslika1Click(Sender: TObject);var Bitmap:TBitmap;beginwith frmBmpDlg dobeginActiveControl:=edit1;Edit1.Text:=IntToStr(Image1.Picture.Graphic.Width);Edit2.Text:=IntToStr(Image1.Picture.Graphic.Height);if ShowModal<>idCancel thenbeginBitmap:=TBitmap.Create;Bitmap.Width:=StrToInt(Edit1.Text);Bitmap.Height:=StrToInt(Edit2.Text);Image1.Picture.Graphic:=Bitmap;TekovenFajl:=' ';end;

end;end;

Важно е да се разбере да доделувањето на нова bitmap‐а на особината Graphic на picture објектот предизвикува бришење на постоечката bitmape и превземање сопствеништво над другата.13. чекор – Користење Clipboard со слики

Windows Clipboard може да се користи за копирање и префрлување слика во вашата апликација или за размена на слика со други апликации.

Пред да го користите објектот Clipboard во било која ваша апликација потребно е да додадетеunit ClipBrd во uses клаузулата на unit кој треба да има пристап до податоците од Clipboard. Копирање слика во Clipboard

Може да копирате слика, вклучувајќи содржина на image контролатаe, во Clipboard. Еднаш, кога ќе најде во Clipboard, сликата е достапна на сите Windows апликации.

За да копирате слика во Clipboard, доделете слика на објектот Clipboard со методата Assign.Значи формирајте OnClick настан за опцијата Kopiraj на менито Edit, и во него внесете го следниот код:

procedure TfrmCrtko.Kopiraj1Click(Sender: TObject);beginClipboard.Assign(Image1.Picture);end;

Преместување слика во Clipboard

Префрлувањето слика во Clipboard е исто како копирање, со тоа што сликата се бриши од изворот.За нашиот пример можете да го поврзете следниот event handler за OnClickнастанот на опцијата Odseci од менито Editprocedure TfrmCrtko.Odseci1Click(Sender: TObject);var Pravoagolnik:TRect;beginKopiraj1Click(Sender);with Image1.Canvas dobeginCopyMode:=cmWhiteness;Pravoagolnik:=Rect(0,0,Image1.Width,Image1.Height);CopyRect(Pravoagolnik,Image1.Canvas,Pravoagolnik);CopyMode:=cmSrcCopy;end;

end;

Префрлување слика од ClipboardАко Windows Clipboard содржи bitmap‐ска графика, може да ја префрлите во било кој image објект, вклучително image контрола, како и површината на формата.За да префрлиме слика од Clipboard, повикајте Clipboard метода HasFormat, за да проверите дали Clipboard содржи слика.HasFormat е Boolean функција. Враќа True ако Clipboard има содржина во релација со пренесените параметри. За да проверите дали Clipboard содржи слика, да го пренесеме параметарот CF_BITMAPКрерајте OnClick настан за опцијата Zalepi од менито Edit.procedure TfrmCrtko.Zalepi1Click(Sender: TObject);var Bitmap:TBitmap;beginif Clipboard.HasFormat(CF_BITMAP) thenbeginBitmap:=TBitmap.Create;tryBitmap.Assign(Clipboard);Image1.Canvas.Draw(0,0,Bitmap);finallyBitmap.Free;end;    end;

end;и со тоа ја завршивме нашата апликација Crtko.

Вклучување фонтови во апликацијата (односно *.exe)1. ЧекорПрво треба да креираме т.н. rc датотека односно датотека соекстензија rc. Ја креираме во кој било текст едитор, пр. во notepad исекако треба да ја зачуваме со наставка rc.Датотеката содржи опис на фонтови кои се користат во апликацијата.Би изгледало вака:

MY_FONT ANYOL1 "Bauhs93.ttf"MY_FONT ANYOL2 "Bauhs94.ttf"итн...

2. ЧекорСега треба да креираме т.н. ресурс датотека со наставка *.res. и тоа на следниот начин:Одиме во DOS prompt:и пишуваме BRCC32 MyFont, Така креираме датотекаMyFont.res.

3. ЧекорСега треба во апликацијата да ја вклучиме датотеката res со фонтовите.Во unit под implementation 

{$R *.DFM} треба да внесеме {$R MyFont.res}Овозможивме користење на фонтови во апликацијата.4. ЧекорЗа настанот OnCreate на самата форма го пишуваме следниот код:procedure TForm1.FormCreate(Sender: TObject);varRes : TResourceStream;beginRes := TResourceStream.Create(hInstance, 'MY_FONT', Pchar('ANYOL1'));Res.SavetoFile('Bauhs93.ttf');Res.Free;AddFontResource(PChar('Bauhas93.ttf'));SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);end;

5. ЧекорСега сите фонтови од res датотеката се достапни и може да гикористиме, пр. фонтот “Bauhaus 93” преку следниот код:

procedure TForm1.Button1Click(Sender: TObject);begin

Button1.Font.Name := 'Bauhaus 93';end;