Difference between revisions of "Object Oriented Programming with Free Pascal and Lazarus/mk"

From Lazarus wiki
Jump to navigationJump to search
 
(10 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Object Oriented Programming with FreePascal and Lazarus}}
+
{{Object Oriented Programming with Free Pascal and Lazarus}}
  
 
Постојат одлични прирачници за Pascal, но овој прирачник се обидува да го однесе почетникот понатаму во [[Glossary#OO | Објект-ориентирано програмирање]], што всушност претставува проширување на стандарден Pascal, предложено од Turbo-pascal, Delphi и FreePascal/Lazarus.
 
Постојат одлични прирачници за Pascal, но овој прирачник се обидува да го однесе почетникот понатаму во [[Glossary#OO | Објект-ориентирано програмирање]], што всушност претставува проширување на стандарден Pascal, предложено од Turbo-pascal, Delphi и FreePascal/Lazarus.
Line 82: Line 82:
 
Доста беше претставувањето на реални примери! Ајде да се упатиме на главната цел: програмирање во FreePascal.
 
Доста беше претставувањето на реални примери! Ајде да се упатиме на главната цел: програмирање во FreePascal.
  
Ајде да ја разгледаме креацијата на едноставна Форма со неколку управувачки елементи за апликација во FreePascal/Lazarus.
+
Ајде да ја разгледаме креацијата на едноставна форма со неколку управувачки елементи за апликација во FreePascal/Lazarus.
  
<div class="floatleft">[[Image:ObjectInspector-TForm.png]]</div>
+
<div class="floatleft">[[Image:ObjectInspector-TForm-mk.png]]</div>
<div class="floatright">[[Image:BlankForm.png]]</div>
+
<div class="floatright">[[Image:BlankForm-mk.png]]</div>
  
При стартување на Lazarus IDE, на програмерот му се претставува празен шаблон за дизајн на Форма, на што му се иницира да постави различни управувачки елементи или објекти.  
+
При стартување на Lazarus IDE, на програмерот му се претставува празен шаблон за дизајн на форма, на што му се иницира да постави различни управувачки елементи или објекти.
  
Ќе забележите дека претходно направената празна Форма е веќе Објект, со свои сопствени особини, како на пример позиција (Врв и Лево), големина (Височина и Широчина), боја, однапред зададен фонт за додавање на текст, итн.  
+
Ќе забележите дека претходно направената празна форма е веќе објект, со свои сопствени особини, на пример, позиција (Врв и Лево), големина (Височина и Широчина), боја, однапред зададен фонт за додавање текст итн.
  
  
Line 95: Line 95:
 
----
 
----
  
Ако на Формата е поставен управувачки елемент Копче (тип TButton), тоа ќа има сопствена серија на особини, коишто можат да се прегледуваат во прозорецот на Објект инспекторот.  
+
Ако на формата е поставен управувачки елемент Копче (тип TButton), тоа ќа има сопствена серија на особини, што можат да се прегледуваат во прозорецот на Објект-инспекторот.
  
Неколку од особините имаат имиња слични со оние за Формата; ова е поради тоа што многу особини се '''Наследени''' од некоја стандардна класа на Предок, којашто наведува како треба да се дефинираат и извршат особините, од страна на предок класите.  
+
Неколку од особините имаат имиња слични со оние за формата; ова е поради тоа што многу особини се '''Наследени''' од некоја стандардна класа на Предок, што наведува како треба да се дефинираат и да се извршат особините, од страна на предок-класите.
  
Освен особини, Објект инспекторот исто така нуди јазиче наречено '''Настани''', што им дава пристап на Извршувачите на Настани, тие претставуваат методи коишто им даваат инструкции на апликацијата за тоа како да се извршат дејствата како што е кликање со глушец на копче (OnClick), или пак некои промени во позицијата, големината или други особини (OnChange).
+
Освен особини, Објект-инспекторот, исто така, нуди јазиче наречено '''Настани''', што им дава пристап на Извршувачите на настаните, тие претставуваат методи што им даваат инструкции на апликацијата за тоа како да се извршат дејствата како што е кликање со глувче на копче (OnClick) или, пак, некои промени во позицијата, големината или други особини (OnChange).
  
физичкиот изглед на Копчето на Формата, заедно со сите свои особини и методи за извршување на Настани, треба да се гледаат како еден субјект или '''Објект''' во Pascal.
+
физичкиот изглед на Копчето на формата, заедно со сите свои особини и методи за извршување настани, треба да се гледаат како еден субјект или '''Објект''' во Pascal.
  
<div class="floatleft">[[Image:ObjectInspector-TButton.png]]</div>
+
<div class="floatleft">[[Image:ObjectInspector-TButton-mk.png]]</div>
<div class="floatright">[[Image:FormWithButton.png]]</div>
+
<div class="floatright">[[Image:FormWithButton-mk.png]]</div>
<div class="floatright">[[Image:Source_FormWithButton1.png]]</div>
+
<div class="floatright">[[Image:Source_FormWithButton1-mk.png]]</div>
  
 
== Објект-ориентирано проширување на стандарден Pascal ==
 
== Објект-ориентирано проширување на стандарден Pascal ==
  
Структурата за евиденција во Pascal е проширена со дефинирање на
+
Структурата за евиденција во Pascal е проширена со дефинирање  
 +
 
 
=== Објект ===
 
=== Објект ===
  
Објект претставува посебен тип на евиденција. Евиденцијата ги содржи сите полиња што
+
Објект претставува посебен тип на евиденција. Евиденцијата ги содржи сите полиња што се декларирани во дефиницијата за Објектот (исто како и конвенционална евиденција), но сега процедурите и функциите можат да се декларираат како да се дел од евиденцијата и се чуваат како покажувачи за методите што се однесуваат на типот на објектот.
се декларирани во дефиницијата за Објектот (исто како и конвенционална евиденција), но сега процедурите и функциите можат да се декларираат како да се дел од евиденцијата, и се чуваат како покажувачи за методите што се однесуваат на типот на објектот.  
 
  
Како на пример, еден објект може да содржи ред на реални вредности, заедно со Метод за пресметка на просечната вредност.  
+
На пример, еден објект може да содржи ред на реални вредности, заедно со Методот за пресметка на просечната вредност.
  
  
Line 138: Line 138:
 
Објектите можат да „наследат“ полиња и методи за „родител“-објекти. Ова значи дека овие полиња и методи можат да се користат ако биле вклучени во Објектот, декларирани како „дете“-објект.
 
Објектите можат да „наследат“ полиња и методи за „родител“-објекти. Ова значи дека овие полиња и методи можат да се користат ако биле вклучени во Објектот, декларирани како „дете“-објект.
  
Освен ова, претставен е концепт за видливост: можат да се декларираат полиња, процедури и функции како јавни, заштитени и приватни. Како однапред назначени, полињата и методите се јавни, и можат да се експортираат надвор од тековниот модул. Заштитени полиња или методи се достапни само во објектите коишто потекнуваат од тековниот предок објект. Полиња или методи коишто се декларирани како приватни, единствено се достапни во тековниот модул:
+
Освен ова, претставен е концепт за видливост: можат да се декларираат полиња, процедури и функции како јавни, заштитени и приватни. Како однапред назначени, полињата и методите се јавни и можат да се експортираат надвор од тековниот модул. Заштитени полиња или методи се достапни само во објектите што потекнуваат од тековниот предок-објект. Полиња или методи што се декларирани како приватни, единствено се достапни во тековниот модул:
 
нивниот обем е ограничен на вградувањето на тековната датотека.
 
нивниот обем е ограничен на вградувањето на тековната датотека.
  
Line 183: Line 183:
  
  
Ќе забележите дека оваа класа е дефинирана како пример за друг '''родител''' или '''предок''' класа (''TFPCustomPen'') од која таа '''наследува'''.  
+
Ќе забележите дека оваа класа е дефинирана како пример за друг '''родител''' или '''предок''' класа (''TFPCustomPen'') од која таа '''наследува'''.
Има некои сопствени полиња, групирани под
+
Има некои сопствени полиња, групирани под:
*'''приватно''' – ова значи дека елементите дефинирани овде се достапни или видливи замо за други класи или процедури/функции, дефинирани во истиот програмски модул (овој пример е од ''Графика'', па било која од другите класи како на пример ''TBitMap'', ''TPicture'' итн. во истиот модул ќе можат да ги користат). Тие всушност се локални променливи (пр.''FColor'', ''FPenHandleCached'') или методи коишто се користат локално (''GetHandle'', ''SetHandle'')но можат да се користат или да се однесуват на елементи објавени во одделите '''заштитено''' или '''јавно'''.
+
*'''Приватно''' – ова значи дека елементите дефинирани овде се достапни или видливи замо за други класи или процедури/функции, дефинирани во истиот програмски модул (овој пример е од ''Графика'', па која било од другите класи, на пример, ''TBitMap'', ''TPicture'' итн. во истиот модул ќе можат да ги користат). Всушност, ова се локални променливи (на пример, ''FColor'', ''FPenHandleCached'') или методи што се користат локално (''GetHandle'', ''SetHandle''), но можат да се користат или да се однесуват на елементи објавени во одделите '''заштитено''' или '''јавно'''.
*'''приватно''' – ова значи дека елементите дефинирани овде се достапни или видливи замо за класи коишто потекнуваат од оваа класа'''предок''', и ги наследуват нејзините особини или методи.
+
*'''Приватно''' – ова значи дека елементите дефинирани овде се достапни или видливи само за класи што потекнуваат од оваа класа'''предок''' и ги наследуват нејзините особини или методи.
*'''приватно''' – ова значи дека елементите дефинирани овде се достапни или видливи замо за класи коишто потекнуваат од оваа класа'''предок''', и ги наследуват нејзините особини или методи.  
+
*'''Приватно''' – ова значи дека елементите дефинирани овде се достапни или видливи само за класи што потекнуваат од оваа класа'''предок''' и ги наследуват нејзините особини или методи.
*'''објавени''' – е исто како и одделот '''јавно''', но компајлерорт исто така генерира тип на информација потрабна за автоматски тек на овие класи. Често листата на објавени елементи се појавува во Објект Инспекторот на Lazarus; Ако не постои '''објавена''' листа, тогаш сите '''јавни''' полиња обично се појавуваат во Објект инспекторот.
+
*'''Објавени''' – е исто како и одделот '''јавно''', но компајлерот, исто така, генерира тип на информација потрабна за автоматски тек на овие класи. Често листата на објавени елементи се појавува во Објект-инспекторот на Lazarus; Ако не постои '''објавена''' листа, тогаш сите '''јавни''' полиња обично се појавуваат во Објект-инспекторот.
  
 
=== Методи ===
 
=== Методи ===
Line 194: Line 194:
  
 
Некои од методите дефинирани погоре се означени со директива '''виртуелно'''; други пак се означени со директива'''прескокни'''.
 
Некои од методите дефинирани погоре се означени со директива '''виртуелно'''; други пак се означени со директива'''прескокни'''.
*'''виртуелно''' значи дека типот или вистинскиот пример за методот не е познат во времето на компајлирање, но се избира во времето на извршување, во зависност од тоа која подпрограма всушност го повикува методот. Може да се смета како носител на место во дефиницијата на класата.  
+
*'''Виртуелно''' значи дека типот или вистинскиот пример за методот не е познат во времето на компајлирање, но се избира во времето на извршување, во зависност од тоа која потпрограма, всушност, го повикува методот. Може да се смета како носител на место во дефиницијата на класата.
  
*'''прескокни''' значи дека во време на извршување, локално дадената дефиниција може да го завземе местото на дефиниција, наследена од предок класа, особено ако станува збор за '''виртуелно'''. Ако посебно сакате да го употребите методот дефиниран во предок класата, понекогаш е потребно специјално да го повикате со клаузата '''наследено'''.
+
*'''Прескокни''' значи дека во време на извршување, локално дадената дефиниција може да го заземе местото на дефиниција, наследена од предок-класа, особено ако станува збор за '''виртуелно'''. Ако посебно сакате да го употребите методот дефиниран во предок класата, понекогаш е потребно специјално да го повикате со клаузата '''наследено'''.
  
 
Методите без виртуелна директива или директива за прескокнување се '''статични''' методи (стандарден тип во Pascal). Оние со виртуелна директива или директива за прескокнување се '''динамични'''.
 
Методите без виртуелна директива или директива за прескокнување се '''статични''' методи (стандарден тип во Pascal). Оние со виртуелна директива или директива за прескокнување се '''динамични'''.
  
 
Посебни примери за методи се:
 
Посебни примери за методи се:
*'''креирај''' - '''конструктор''' за класа, што се грижи за доделување на меморија, собирајќи ги сите информации потребни за конфигурирање/инсталирање на различни особини.
+
*'''Креирај''' - '''конструктор''' за класа, што се грижи за доделување меморија, собирајќи ги сите информации потребни за конфигурирање/инсталирање на различни особини.
*'''уништи''' -  '''уништувач''' за класа, којшто на уреден и логичен начин ги отстранува сите делови на класата од системот, и ги враќа сите нејзини извори за системот во повторна употреба.  
+
*'''Уништи''' -  '''уништувач''' за класа, којшто на уреден и логичен начин ги отстранува сите делови на класата од системот и ги враќа сите нејзини извори за системот во повторна употреба.
  
 
=== Особини ===
 
=== Особини ===
  
 
Особините се исти како и обичните полиња во конвенционален запис во Pascal, но тие можат да имаат '''читај''' и/или '''пишувај''' назначувачи.
 
Особините се исти како и обичните полиња во конвенционален запис во Pascal, но тие можат да имаат '''читај''' и/или '''пишувај''' назначувачи.
*назначувачот '''читај''' претставува поле или функција, која враќа резултат од точниот тип за особината. Во горенаведениот пример, особината ''Боја'' има назначувач за читање ''FColor'', којшто претставува локална променлива што ја содржи вредноста што треба да се употреби. Ако одредена особина има '''читај''' но нема '''пишувај''' назначувач, тогаш може само да се прочита.  
+
*Назначувачот '''читај''' претставува поле или функција, која враќа резултат од точниот тип за особината. Во горенаведениот пример, особината ''Боја'' има назначувач за читање ''FColor'', што претставува локална променлива што ја содржи вредноста што треба да се употреби. Ако одредена особина има '''читај''', но нема '''пишувај''' назначувач, тогаш може само да се прочита.
*назначувачот '''пишувај''' претставува поле или процедура, што ќе ја складира вредноста на особината на одредена локација. Во горенаведениот пример, особината ''Боја'' има назначувач ''SetColor'', којшто претставува процедура (дефинирана во одделот '''заштитено''') за впишување на вредноста за бојата на некоја одредена локација. Ако одредена особина има '''пишувај''' но нема '''читај''' назначувач, тогаш може само да се пишува.
+
*Назначувачот '''пишувај''' претставува поле или процедура, што ќе ја складира вредноста на особината на одредена локација. Во горенаведениот пример, особината ''Боја'' има назначувач ''SetColor'', што претставува процедура (дефинирана во одделот '''заштитено''') за впишување на вредноста за бојата на некоја одредена локација. Ако одредена особина има '''пишувај''', но нема '''читај''' назначувач, тогаш може само да се пишува.
*'''однапред назначено''' – ќе забележите дека е возможно да поставите '''однапред назначена''' вредност за особината. Како на пример, ''Боја''-овде се дава однапред назначена вредност ''clBlack'', или црна, во моментот на креирање. Понатаму може да се даде друга вреднсот, со програмирање на исказ за назначување, или во Објект Инспекторот.  
+
*'''Однапред назначено''' – ќе забележите дека е возможно да поставите '''однапред назначена''' вредност за особината. На пример, ''Боја'' - овде се дава однапред назначена вредност ''clBlack'', или црна, во моментот на креирање. Понатаму може да се даде друга вредност, со програмирање на исказ за назначување, или во Објект-инспекторот.
 
 
  
 
== Дополнителни информации ==
 
== Дополнителни информации ==
  
Со ова само површински ја обработивме оваа тема. За повеќе детали, на читачите им се препорачува да ги прочитаат упатствата [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html FreePascal], особено Поглавје 5 ('''Објекти''') и 6 ('''Класи''')
+
Со ова само површински ја обработивме оваа тема. За повеќе детали, на читачите им се препорачува да ги прочитаат упатствата [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html FreePascal], особено Поглавје 5 ('''Објекти''') и 6 ('''Класи''').
  
 
--[[user:Kirkpatc|Kirkpatc]] 11:04, 20 July 2008 (CEST)
 
--[[user:Kirkpatc|Kirkpatc]] 11:04, 20 July 2008 (CEST)

Latest revision as of 13:05, 19 June 2015

English (en) español (es) français (fr) magyar (hu) italiano (it) 日本語 (ja) македонски (mk) русский (ru) 中文(中国大陆)‎ (zh_CN) 中文(台灣)‎ (zh_TW)

Постојат одлични прирачници за Pascal, но овој прирачник се обидува да го однесе почетникот понатаму во Објект-ориентирано програмирање, што всушност претставува проширување на стандарден Pascal, предложено од Turbo-pascal, Delphi и FreePascal/Lazarus.


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


Стандардното програмирање во Pascal, врз основа на текст, е добро за креирање апликации, што како традиционалните Unix апликации, извршуваат една работа, но ја извршуваат добро. „Една работа“ што оваа програма ја извршува може да биде многу комплицирано дејство, а на корисникот може да му обезбеди неколку опции управувани од мени, но значително е ограничено придржувањето до наредбите што корисникот ги отчукува на тастатурата, како и слушањето на нивните одговори на терминалот или, пак, на печатачот.

Со цел да се обезбеди Графички кориснички интерфејс (GUI) вообичаено е да се повика некој вид метод на Објект-ориентирано програмирање (често користејќи C или една од неговите променливи или Visual Basic или една од променливите OO на Pascal, на пример, FreePascal со или без Lazarus).

Во GUI на корисникот му се прикажува екран со голем број слики, распоредени на структуриран начин, кој се состои од поставки на алатки или Widgets, што се однесуваат на различни дејства, на пример:

  • избирање од мени,
  • oтворање или зачувување датотеки,
  • поврзување на интернет,
  • извршување нумерички пресметки итн.

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

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


Објекти – реална аналогија

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

Примерок од крв

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

  • Епрувета со примерок, на тип одреден со тестот што лекарот сака да го изврши.
  • Локално правило (или метод, стандардна оперативна процедура) со цел да се насочи медицинската сестра или техничарот при земање примероци.
    • кој тип на епрувета треба да се користи,
    • како да се обработува примерокот,
    • како да се чува, пред да се пренесе во лабораторија.
  • Ознака на епруветата со детали за:
    • идентификатор на примероци,
    • име на пациентот и датум на раѓање,
    • датум и време на земање,
    • потребни тестови.
  • Формулар за барање што е прикачен на примерокот додека се носи во лабораторија, со насочување за:
    • ИД на примероци,
    • ИД на лекарот кој го поднесува барањето,
    • кои тестови ги бара лекарот,
    • приложување на целосни детали за пациентот,
    • можната дијагноза за која се бара потврдување.

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

  • Во лабораторијата - локални методи за одредување:
    • како да се анализира примерокот,
    • какви машини треба да се користат,
    • како да се калибрираат и управуваат машините,
    • како да се чуваат и форматираат резултатите,
    • како да му се врати извештај на лекарот.

Вистинските резултати претставуаат евиденција дека лекарот асистира при дијагностицирањето и копија од резултатите што се внесува во белешките за пациентот.

Физичкиот примерок треба да се задржи за забелешка, потврдување или за понатамошни тестови или, пак, може да се отстрани со истурање во лавабо или со спалување; ќе има метод во кој ќе се опише ова.

Нема потреба лекарот да ги запишува сите детали и инструкции секогаш кога се собира примерок; а всушност тој можеби има многу малку знаење за тоа како примерокот се обработува во лабораторија. Деталите од различните процеси се наследени од претходни собирања и анализи на примероци – ќе има генерички планови за целата серија,а примерокот, сите документации и податоци за него и основните методи се сметаат за комплексен објект.

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

Друг пример - Автомобил

Ако не сакате крв, истиот тип на резонирање може да се примени кај автомобил што е однесен во гаража на поправка. Може да се состои од:

  • физичко возило;
  • документи во сопственост на сопственикот: регистрација и дозвола (вклучувајќи регистарски таблици), осигурување, сметки од купување, делови, поправки итн.;
  • историјата за потрошувачка на гориво;
  • визачите на кои им е дозволено да користат возила, заедно со нивните податоци за дозвола;
  • евиденција за сервис во сопственост на гаражата;
  • методи или процедури за рутинска проверка и одржување;
  • методи за нерутински поправки итн.;
  • информации за наплата за корисникот.

Пример за програмирање

Доста беше претставувањето на реални примери! Ајде да се упатиме на главната цел: програмирање во FreePascal.

Ајде да ја разгледаме креацијата на едноставна форма со неколку управувачки елементи за апликација во FreePascal/Lazarus.

ObjectInspector-TForm-mk.png
BlankForm-mk.png

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

Ќе забележите дека претходно направената празна форма е веќе објект, со свои сопствени особини, на пример, позиција (Врв и Лево), големина (Височина и Широчина), боја, однапред зададен фонт за додавање текст итн.



Ако на формата е поставен управувачки елемент Копче (тип TButton), тоа ќа има сопствена серија на особини, што можат да се прегледуваат во прозорецот на Објект-инспекторот.

Неколку од особините имаат имиња слични со оние за формата; ова е поради тоа што многу особини се Наследени од некоја стандардна класа на Предок, што наведува како треба да се дефинираат и да се извршат особините, од страна на предок-класите.

Освен особини, Објект-инспекторот, исто така, нуди јазиче наречено Настани, што им дава пристап на Извршувачите на настаните, тие претставуваат методи што им даваат инструкции на апликацијата за тоа како да се извршат дејствата како што е кликање со глувче на копче (OnClick) или, пак, некои промени во позицијата, големината или други особини (OnChange).

физичкиот изглед на Копчето на формата, заедно со сите свои особини и методи за извршување настани, треба да се гледаат како еден субјект или Објект во Pascal.

ObjectInspector-TButton-mk.png
FormWithButton-mk.png
Source FormWithButton1-mk.png

Објект-ориентирано проширување на стандарден Pascal

Структурата за евиденција во Pascal е проширена со дефинирање

Објект

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

На пример, еден објект може да содржи ред на реални вредности, заедно со Методот за пресметка на просечната вредност.







Type
  Average = Object
    NumVal: Integer;
    Values: Array [1..200] of Real;
    Function Mean: Real; { calculates the average value of the array }
  End;

Објектите можат да „наследат“ полиња и методи за „родител“-објекти. Ова значи дека овие полиња и методи можат да се користат ако биле вклучени во Објектот, декларирани како „дете“-објект.

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

Класа

Објектите не се користат многу често сами по себе во FreePascal и Lazarus; наместо тоа, во голем обем се користат Класи. Класата се дефинира на скоро ист начин како и Објектот, но повеќе претставува покажувач на Објект, отколку самиот Објект. Формално, ова значи дека Класата е назначена на Heap од програмата, додека Објектот е назначен на Stack.

Ова е едноставен пример за типична декларација на Класа:

{-----------------------------------------}
{example of Class declaration from the LCL}
{-----------------------------------------}
 TPen = class(TFPCustomPen)
 private
   FColor: TColor;
   FPenHandleCached: boolean;
   FReference: TWSPenReference;
   procedure FreeReference;
   function GetHandle: HPEN;
   function GetReference: TWSPenReference;
   procedure ReferenceNeeded;
   procedure SetHandle(const Value: HPEN);
 protected
   procedure DoAllocateResources; override;
   procedure DoDeAllocateResources; override;
   procedure DoCopyProps(From: TFPCanvasHelper); override;
   procedure SetColor
        (const NewColor: TColor; const NewFPColor: TFPColor); virtual;
   procedure SetFPColor(const AValue: TFPColor); override;
   procedure SetColor(Value: TColor);
   procedure SetMode(Value: TPenMode); override;
   procedure SetStyle(Value: TPenStyle); override;
   procedure SetWidth(value: Integer); override;
 public
   constructor Create; override;
   destructor Destroy; override;
   procedure Assign(Source: TPersistent); override;
   property Handle: HPEN read GetHandle write SetHandle; deprecated;
   property Reference: TWSPenReference read GetReference;
 published
   property Color: TColor read FColor write SetColor default clBlack;
   property Mode default pmCopy;
   property Style default psSolid;
   property Width default 1;
 end;


Ќе забележите дека оваа класа е дефинирана како пример за друг родител или предок класа (TFPCustomPen) од која таа наследува. Има некои сопствени полиња, групирани под:

  • Приватно – ова значи дека елементите дефинирани овде се достапни или видливи замо за други класи или процедури/функции, дефинирани во истиот програмски модул (овој пример е од Графика, па која било од другите класи, на пример, TBitMap, TPicture итн. во истиот модул ќе можат да ги користат). Всушност, ова се локални променливи (на пример, FColor, FPenHandleCached) или методи што се користат локално (GetHandle, SetHandle), но можат да се користат или да се однесуват на елементи објавени во одделите заштитено или јавно.
  • Приватно – ова значи дека елементите дефинирани овде се достапни или видливи само за класи што потекнуваат од оваа класапредок и ги наследуват нејзините особини или методи.
  • Приватно – ова значи дека елементите дефинирани овде се достапни или видливи само за класи што потекнуваат од оваа класапредок и ги наследуват нејзините особини или методи.
  • Објавени – е исто како и одделот јавно, но компајлерот, исто така, генерира тип на информација потрабна за автоматски тек на овие класи. Често листата на објавени елементи се појавува во Објект-инспекторот на Lazarus; Ако не постои објавена листа, тогаш сите јавни полиња обично се појавуваат во Објект-инспекторот.

Методи

Методот е ист како и стандардната процедура или функција, но може да има некои дополнителни директиви.

Некои од методите дефинирани погоре се означени со директива виртуелно; други пак се означени со директивапрескокни.

  • Виртуелно значи дека типот или вистинскиот пример за методот не е познат во времето на компајлирање, но се избира во времето на извршување, во зависност од тоа која потпрограма, всушност, го повикува методот. Може да се смета како носител на место во дефиницијата на класата.
  • Прескокни значи дека во време на извршување, локално дадената дефиниција може да го заземе местото на дефиниција, наследена од предок-класа, особено ако станува збор за виртуелно. Ако посебно сакате да го употребите методот дефиниран во предок класата, понекогаш е потребно специјално да го повикате со клаузата наследено.

Методите без виртуелна директива или директива за прескокнување се статични методи (стандарден тип во Pascal). Оние со виртуелна директива или директива за прескокнување се динамични.

Посебни примери за методи се:

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

Особини

Особините се исти како и обичните полиња во конвенционален запис во Pascal, но тие можат да имаат читај и/или пишувај назначувачи.

  • Назначувачот читај претставува поле или функција, која враќа резултат од точниот тип за особината. Во горенаведениот пример, особината Боја има назначувач за читање FColor, што претставува локална променлива што ја содржи вредноста што треба да се употреби. Ако одредена особина има читај, но нема пишувај назначувач, тогаш може само да се прочита.
  • Назначувачот пишувај претставува поле или процедура, што ќе ја складира вредноста на особината на одредена локација. Во горенаведениот пример, особината Боја има назначувач SetColor, што претставува процедура (дефинирана во одделот заштитено) за впишување на вредноста за бојата на некоја одредена локација. Ако одредена особина има пишувај, но нема читај назначувач, тогаш може само да се пишува.
  • Однапред назначено – ќе забележите дека е возможно да поставите однапред назначена вредност за особината. На пример, Боја - овде се дава однапред назначена вредност clBlack, или црна, во моментот на креирање. Понатаму може да се даде друга вредност, со програмирање на исказ за назначување, или во Објект-инспекторот.

Дополнителни информации

Со ова само површински ја обработивме оваа тема. За повеќе детали, на читачите им се препорачува да ги прочитаат упатствата FreePascal, особено Поглавје 5 (Објекти) и 6 (Класи).

--Kirkpatc 11:04, 20 July 2008 (CEST)