Object Oriented Programming with Free Pascal and Lazarus/mk

From Lazarus wiki
Revision as of 12:05, 19 June 2015 by FTurtle (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

English (en) español (es) français (fr) magyar (hu) italiano (it) македонски (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)