Sign in Join
Wiki copytemporary

Object Oriented Programming with Free Pascal and Lazarus/mk: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Постојат одлични прирачници за Pascal, но овој прирачник се обидува да го однесе почетникот понатаму во [[Glossary|Објект-ориентирано програмирање]], што всушност претставува проширување на стандарден Pascal, предложено од Turbo-pascal, Delphi и FreePascal/Lazarus.
22
33[[Glossary|Објект]] претставува проширување на стандардниот Pascal [запис](http://wiki.lazarus.freepascal.org/Запис)
44
55Стандардното програмирање во Pascal, врз основа на текст, е добро за креирање апликации, што како традиционалните Unix апликации, извршуваат една работа, но ја извршуваат добро. „Една работа“ што оваа програма ја извршува може да биде многу комплицирано дејство, а на корисникот може да му обезбеди неколку опции управувани од мени, но значително е ограничено придржувањето до наредбите што корисникот ги отчукува на тастатурата, како и слушањето на нивните одговори на терминалот или, пак, на печатачот.
66
77Со цел да се обезбеди [[Glossary|Графички кориснички интерфејс (GUI)]] вообичаено е да се повика некој вид метод на Објект-ориентирано програмирање (често користејќи [[Glossary|C]] или една од неговите променливи или Visual Basic или една од променливите [[Glossary|OO]] на Pascal, на пример, [[Glossary|FreePascal]] со или без [[Glossary|Lazarus]]).
88
99Во GUI на корисникот му се прикажува екран со голем број слики, распоредени на структуриран начин, кој се состои од поставки на алатки или [[Glossary|Widgets]], што се однесуваат на различни дејства, на пример:
1010
1111- избирање од мени,
1212- oтворање или зачувување датотеки,
1313- поврзување на интернет,
1414- извршување нумерички пресметки итн.
1515
1616Корисникот треба да го движи глувчето или друга алатка со стрелка/избирање низ екранот, со цел да избере дејства што треба да се извршат како одговор на кликање врз копчето од глувчето или од притискање тастер.
1717
1818Иако системите за работа со комплексни графички кориснички интерфејс можат да се напишат во стандарден Pascal или скоро во секој друг јазик за програмирање, многу е полесно користењето на објект-ориентиран систем, во кој секој графички објект може да ги има сите свои особини, процедури и функции на екранот, што се однесуваат на нивната употреба, коишто се чуваат заедно во стандардна структура.
1919
2020## Објекти – реална аналогија
2121
2222Разгледајте ја аналогијата за примерок од крв, земена во болница или во лекарска ординација.
2323
2424### Примерок од крв
2525
2626Физичкиот примерок сигурно претставува **објект**; тој има многу информации, документи и други физички објекти што се однесуваат на него.
2727
2828- **Епрувета со примерок**, на тип одреден со тестот што лекарот сака да го изврши.
2929
3030- **Локално правило** (или *метод*, *стандардна оперативна процедура*) со цел да се насочи медицинската сестра или техничарот при земање примероци.
3131 - кој тип на епрувета треба да се користи,
3232 - како да се обработува примерокот,
3333 - како да се чува, пред да се пренесе во лабораторија.
3434
3535- **Ознака** на епруветата со детали за:
3636 - идентификатор на примероци,
3737 - име на пациентот и датум на раѓање,
3838 - датум и време на земање,
3939 - потребни тестови.
4040
4141- **Формулар за барање** што е прикачен на примерокот додека се носи во лабораторија, со насочување за:
4242 - ИД на примероци,
4343 - ИД на лекарот кој го поднесува барањето,
4444 - кои тестови ги бара лекарот,
4545 - приложување на целосни детали за пациентот,
4646 - можната дијагноза за која се бара потврдување.
4747
4848Во белешките за пациентот се поставува копија од формуларот за барање, со цел лекарот да се потсети дека треба да очекува резултати во соодветно време.
4949
5050- Во лабораторијата - **локални методи** за одредување:
5151 - како да се анализира примерокот,
5252 - какви машини треба да се користат,
5353 - како да се калибрираат и управуваат машините,
5454 - како да се чуваат и форматираат резултатите,
5555 - како да му се врати извештај на лекарот.
5656
5757Вистинските **резултати** претставуаат евиденција дека лекарот асистира при дијагностицирањето и копија од резултатите што се внесува во белешките за пациентот.
5858
5959Физичкиот примерок треба да се задржи за забелешка, потврдување или за понатамошни тестови или, пак, може да се отстрани со истурање во лавабо или со спалување; ќе има метод во кој ќе се опише ова.
6060
6161Нема потреба лекарот да ги запишува сите детали и инструкции секогаш кога се собира примерок; а всушност тој можеби има многу малку знаење за тоа како примерокот се обработува во лабораторија. Деталите од различните процеси се **наследени** од претходни собирања и анализи на примероци – ќе има генерички планови за целата серија,а примерокот, сите документации и податоци за него и основните методи се сметаат за комплексен **објект**.
6262
6363Примерокот од крвта лекарот го гледа на ист начин како и резултатите, а за медицинските сестри и техничарите, примерокот, епруветата, ознаката и условите за чување, повторно оформуваат еден субјект.
6464
6565### Друг пример - Автомобил
6666
6767Ако не сакате крв, истиот тип на резонирање може да се примени кај автомобил што е однесен во гаража на поправка. Може да се состои од:
6868
6969- физичко возило;
7070- документи во сопственост на сопственикот: регистрација и дозвола (вклучувајќи регистарски таблици), осигурување, сметки од купување, делови, поправки итн.;
7171- историјата за потрошувачка на гориво;
7272- визачите на кои им е дозволено да користат возила, заедно со нивните податоци за дозвола;
7373- евиденција за сервис во сопственост на гаражата;
7474- методи или процедури за рутинска проверка и одржување;
7575- методи за нерутински поправки итн.;
7676- информации за наплата за корисникот.
7777
7878## Пример за програмирање
7979
8080Доста беше претставувањето на реални примери! Ајде да се упатиме на главната цел: програмирање во FreePascal.
8181
8282Ајде да ја разгледаме креацијата на едноставна форма со неколку управувачки елементи за апликација во FreePascal/Lazarus.
8383
8484![](/wiki-images/2/2e/ObjectInspector-TForm-mk.png)
8585
8686![](/wiki-images/1/1c/BlankForm-mk.png)
8787
8888При стартување на Lazarus IDE, на програмерот му се претставува празен шаблон за дизајн на форма, на што му се иницира да постави различни управувачки елементи или објекти.
8989
9090Ќе забележите дека претходно направената празна форма е веќе објект, со свои сопствени особини, на пример, позиција (Врв и Лево), големина (Височина и Широчина), боја, однапред зададен фонт за додавање текст итн.
9191
9292------------------------------------------------------------------------
9393
9494Ако на формата е поставен управувачки елемент Копче (тип TButton), тоа ќа има сопствена серија на особини, што можат да се прегледуваат во прозорецот на Објект-инспекторот.
9595
9696Неколку од особините имаат имиња слични со оние за формата; ова е поради тоа што многу особини се **Наследени** од некоја стандардна класа на Предок, што наведува како треба да се дефинираат и да се извршат особините, од страна на предок-класите.
9797
9898Освен особини, Објект-инспекторот, исто така, нуди јазиче наречено **Настани**, што им дава пристап на Извршувачите на настаните, тие претставуваат методи што им даваат инструкции на апликацијата за тоа како да се извршат дејствата како што е кликање со глувче на копче (OnClick) или, пак, некои промени во позицијата, големината или други особини (OnChange).
9999
100100физичкиот изглед на Копчето на формата, заедно со сите свои особини и методи за извршување настани, треба да се гледаат како еден субјект или **Објект** во Pascal.
101101
102102![](/wiki-images/f/fc/ObjectInspector-TButton-mk.png)
103103
104104![](/wiki-images/1/1e/FormWithButton-mk.png)
105105
106106![](/wiki-images/1/1d/Source_FormWithButton1-mk.png)
107107
108108## Објект-ориентирано проширување на стандарден Pascal
109109
110110Структурата за евиденција во Pascal е проширена со дефинирање
111111
112112### Објект
113113
114114Објект претставува посебен тип на евиденција. Евиденцијата ги содржи сите полиња што се декларирани во дефиницијата за Објектот (исто како и конвенционална евиденција), но сега процедурите и функциите можат да се декларираат како да се дел од евиденцијата и се чуваат како покажувачи за методите што се однесуваат на типот на објектот.
115115
116116На пример, еден објект може да содржи ред на реални вредности, заедно со Методот за пресметка на просечната вредност.
117117
118-`Type`\
119-`  Average = Object`\
120-`    NumVal: Integer;`\
121-`    Values: Array [1..200] of Real;`\
122-`    Function Mean: Real; { calculates the average value of the array }`\
123-`  End;`
118+``` pascal
119+Type
120+ Average = Object
121+ NumVal: Integer;
122+ Values: Array [1..200] of Real;
123+ Function Mean: Real; { calculates the average value of the array }
124+ End;
125+```
124126
125127Објектите можат да „наследат“ полиња и методи за „родител“-објекти. Ова значи дека овие полиња и методи можат да се користат ако биле вклучени во Објектот, декларирани како „дете“-објект.
126128
127129Освен ова, претставен е концепт за видливост: можат да се декларираат полиња, процедури и функции како јавни, заштитени и приватни. Како однапред назначени, полињата и методите се јавни и можат да се експортираат надвор од тековниот модул. Заштитени полиња или методи се достапни само во објектите што потекнуваат од тековниот предок-објект. Полиња или методи што се декларирани како приватни, единствено се достапни во тековниот модул: нивниот обем е ограничен на вградувањето на тековната датотека.
128130
129131### Класа
130132
131133Објектите не се користат многу често сами по себе во FreePascal и Lazarus; наместо тоа, во голем обем се користат Класи. Класата се дефинира на скоро ист начин како и Објектот, но повеќе претставува покажувач на Објект, отколку самиот Објект. Формално, ова значи дека Класата е назначена на Heap од програмата, додека Објектот е назначен на Stack.
132134
133135Ова е едноставен пример за типична декларација на Класа:
134136
135-`{-----------------------------------------}`\
136-`{example of Class declaration from the LCL}`\
137-`{-----------------------------------------}`\
138-` TPen = class(TFPCustomPen)`\
139-` private`\
140-`   FColor: TColor;`\
141-`   FPenHandleCached: boolean;`\
142-`   FReference: TWSPenReference;`\
143-`   procedure FreeReference;`\
144-`   function GetHandle: HPEN;`\
145-`   function GetReference: TWSPenReference;`\
146-`   procedure ReferenceNeeded;`\
147-`   procedure SetHandle(const Value: HPEN);`\
148-` protected`\
149-`   procedure DoAllocateResources; override;`\
150-`   procedure DoDeAllocateResources; override;`\
151-`   procedure DoCopyProps(From: TFPCanvasHelper); override;`\
152-`   procedure SetColor`\
153-`        (const NewColor: TColor; const NewFPColor: TFPColor); virtual;`\
154-`   procedure SetFPColor(const AValue: TFPColor); override;`\
155-`   procedure SetColor(Value: TColor);`\
156-`   procedure SetMode(Value: TPenMode); override;`\
157-`   procedure SetStyle(Value: TPenStyle); override;`\
158-`   procedure SetWidth(value: Integer); override;`\
159-` public`\
160-`   constructor Create; override;`\
161-`   destructor Destroy; override;`\
162-`   procedure Assign(Source: TPersistent); override;`\
163-`   property Handle: HPEN read GetHandle write SetHandle; deprecated;`\
164-`   property Reference: TWSPenReference read GetReference;`\
165-` published`\
166-`   property Color: TColor read FColor write SetColor default clBlack;`\
167-`   property Mode default pmCopy;`\
168-`   property Style default psSolid;`\
169-`   property Width default 1;`\
170-` end;`
137+``` pascal
138+{-----------------------------------------}
139+{example of Class declaration from the LCL}
140+{-----------------------------------------}
141+ TPen = class(TFPCustomPen)
142+ private
143+ FColor: TColor;
144+ FPenHandleCached: boolean;
145+ FReference: TWSPenReference;
146+ procedure FreeReference;
147+ function GetHandle: HPEN;
148+ function GetReference: TWSPenReference;
149+ procedure ReferenceNeeded;
150+ procedure SetHandle(const Value: HPEN);
151+ protected
152+ procedure DoAllocateResources; override;
153+ procedure DoDeAllocateResources; override;
154+ procedure DoCopyProps(From: TFPCanvasHelper); override;
155+ procedure SetColor
156+ (const NewColor: TColor; const NewFPColor: TFPColor); virtual;
157+ procedure SetFPColor(const AValue: TFPColor); override;
158+ procedure SetColor(Value: TColor);
159+ procedure SetMode(Value: TPenMode); override;
160+ procedure SetStyle(Value: TPenStyle); override;
161+ procedure SetWidth(value: Integer); override;
162+ public
163+ constructor Create; override;
164+ destructor Destroy; override;
165+ procedure Assign(Source: TPersistent); override;
166+ property Handle: HPEN read GetHandle write SetHandle; deprecated;
167+ property Reference: TWSPenReference read GetReference;
168+ published
169+ property Color: TColor read FColor write SetColor default clBlack;
170+ property Mode default pmCopy;
171+ property Style default psSolid;
172+ property Width default 1;
173+ end;
174+```
171175
172176Ќе забележите дека оваа класа е дефинирана како пример за друг **родител** или **предок** класа (*TFPCustomPen*) од која таа **наследува**. Има некои сопствени полиња, групирани под:
173177
174178- **Приватно** – ова значи дека елементите дефинирани овде се достапни или видливи замо за други класи или процедури/функции, дефинирани во истиот програмски модул (овој пример е од *Графика*, па која било од другите класи, на пример, *TBitMap*, *TPicture* итн. во истиот модул ќе можат да ги користат). Всушност, ова се локални променливи (на пример, *FColor*, *FPenHandleCached*) или методи што се користат локално (*GetHandle*, *SetHandle*), но можат да се користат или да се однесуват на елементи објавени во одделите **заштитено** или **јавно**.
175179- **Приватно** – ова значи дека елементите дефинирани овде се достапни или видливи само за класи што потекнуваат од оваа класа**предок** и ги наследуват нејзините особини или методи.
176180- **Приватно** – ова значи дека елементите дефинирани овде се достапни или видливи само за класи што потекнуваат од оваа класа**предок** и ги наследуват нејзините особини или методи.
177181- **Објавени** – е исто како и одделот **јавно**, но компајлерот, исто така, генерира тип на информација потрабна за автоматски тек на овие класи. Често листата на објавени елементи се појавува во Објект-инспекторот на Lazarus; Ако не постои **објавена** листа, тогаш сите **јавни** полиња обично се појавуваат во Објект-инспекторот.
178182
179183### Методи
180184
181185Методот е ист како и стандардната процедура или функција, но може да има некои дополнителни **директиви**.
182186
183187Некои од методите дефинирани погоре се означени со директива **виртуелно**; други пак се означени со директива**прескокни**.
184188
185189- **Виртуелно** значи дека типот или вистинскиот пример за методот не е познат во времето на компајлирање, но се избира во времето на извршување, во зависност од тоа која потпрограма, всушност, го повикува методот. Може да се смета како носител на место во дефиницијата на класата.
186190
187191- **Прескокни** значи дека во време на извршување, локално дадената дефиниција може да го заземе местото на дефиниција, наследена од предок-класа, особено ако станува збор за **виртуелно**. Ако посебно сакате да го употребите методот дефиниран во предок класата, понекогаш е потребно специјално да го повикате со клаузата **наследено**.
188192
189193Методите без виртуелна директива или директива за прескокнување се **статични** методи (стандарден тип во Pascal). Оние со виртуелна директива или директива за прескокнување се **динамични**.
190194
191195Посебни примери за методи се:
192196
193197- **Креирај** - **конструктор** за класа, што се грижи за доделување меморија, собирајќи ги сите информации потребни за конфигурирање/инсталирање на различни особини.
194198- **Уништи** - **уништувач** за класа, којшто на уреден и логичен начин ги отстранува сите делови на класата од системот и ги враќа сите нејзини извори за системот во повторна употреба.
195199
196200### Особини
197201
198202Особините се исти како и обичните полиња во конвенционален запис во Pascal, но тие можат да имаат **читај** и/или **пишувај** назначувачи.
199203
200204- Назначувачот **читај** претставува поле или функција, која враќа резултат од точниот тип за особината. Во горенаведениот пример, особината *Боја* има назначувач за читање *FColor*, што претставува локална променлива што ја содржи вредноста што треба да се употреби. Ако одредена особина има **читај**, но нема **пишувај** назначувач, тогаш може само да се прочита.
201205- Назначувачот **пишувај** претставува поле или процедура, што ќе ја складира вредноста на особината на одредена локација. Во горенаведениот пример, особината *Боја* има назначувач *SetColor*, што претставува процедура (дефинирана во одделот **заштитено**) за впишување на вредноста за бојата на некоја одредена локација. Ако одредена особина има **пишувај**, но нема **читај** назначувач, тогаш може само да се пишува.
202206- **Однапред назначено** – ќе забележите дека е возможно да поставите **однапред назначена** вредност за особината. На пример, *Боја* - овде се дава однапред назначена вредност *clBlack*, или црна, во моментот на креирање. Понатаму може да се даде друга вредност, со програмирање на исказ за назначување, или во Објект-инспекторот.
203207
204208## Дополнителни информации
205209
206210Со ова само површински ја обработивме оваа тема. За повеќе детали, на читачите им се препорачува да ги прочитаат упатствата [FreePascal](http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html), особено Поглавје 5 (**Објекти**) и 6 (**Класи**).
207211
208212--Kirkpatc 11:04, 20 July 2008 (CEST)
209213
210214---
211215*From the Free Pascal wiki, page "Object Oriented Programming with Free Pascal and Lazarus/mk", as it stood on 2015-06-19 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history