Копија на викитоогледало

Ова е огледало на викито на pascal.chat. Уредувањето, историјата и најавата се таму.

Object Oriented Programming with Free Pascal and Lazarus/mk

English · Español · Français · Italiano · Magyar · Македонски · Русский · 中文(中国) · 中文(台灣) · 日本語

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Структурата за евиденција во 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.

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

pascal
{-----------------------------------------}
{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) од која таа наследува. Има некои сопствени полиња, групирани под:

Методи

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

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

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

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

Особини

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

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

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

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


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.

Верзија 3, последно променета од WikiArchive .