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

From Free Pascal wiki
Jump to navigationJump to search
(New page: {{Object_Oriented_Programming_with_FreePascal_and_Lazarus}} There are many excellent tutorials about Pascal, but this tutorial attempts to take the beginner further, into [[Glossary#OO | ...)
 
Line 1: Line 1:
{{Object_Oriented_Programming_with_FreePascal_and_Lazarus}}
+
{{Објект_ориентирано_програмирање_со_FreePascal_и_Lazarus}}
  
There are many excellent tutorials about Pascal, but this tutorial attempts to take the beginner further, into [[Glossary#OO | Object-Oriented Programming]], which is an extension to standard Pascal, offered by Turbo-pascal, Delphi and FreePascal/Lazarus.
+
Постојат одлични прирачници за Pascal, но овој прирачник се обидува да го однесе почетникот понатаму во [[Glossary#OO | Објект-ориентирано програмирање]], што всушност претставува проширување на стандарден Pascal, предложено од Turbo-pascal, Delphi и FreePascal/Lazarus.
  
An [[Glossary#Object | Object]] is an extension of the standard Pascal [http://wiki.lazarus.freepascal.org/Record record] structure
+
An [[Glossary#Object | Object]] is an extension of the standard Pascal [http://wiki.lazarus.freepascal.org/Запис запис]  
  
Standard text-based Pascal programming is good for creating applications which, like traditional Unix applications, do one thing and do it very well. The 'one thing' that a program does might be a very complicated action, and might offer the user several menu-driven options, but it is essentially restricted to obeying commands that the user types at the keyboard and listing its responses on the terminal or a printer.  
+
Стандардното програмирање во Pascal врз основа на текст, е добро за креирање на апликации, коишто како традиционалните Unix апликации, извршуваат една работа, но ја извршуваат добро.  
 +
'Едната работа' што оваа програм ја извршува може да биде многу комплицирано дејство, а на корисникот може да му обезбеди неколку опции управувани од мени, но значително е ограничено придржувањето до наредбите коишто корисникот ги отчукува на тастатаурата, како и слушањето на нивните одговори на терминалот или пак на печатачот.  
  
In order to provide a [[Glossary#GUI | Graphical User Interface (GUI)]] it is usual to invoke some sort of Object-Oriented Programming method (often making use of [[Glossary#C Programming Language | C]] or one of its variants, or Visual Basic, or one of the [[Glossary#OO | OO]] variants of Pascal such as [[Glossary#FreePascal | FreePascal]] with or without [[Glossary#Lazarus | Lazarus]]).  
+
Со цел да се обезбеди [[Glossary#GUI | Графички кориснички интерфејс (GUI)]] вообичаено е  да се повика некој вид метод на Објект-ориентирано програмирање (често користејќи [[Glossary#C Програмски јазик | C]] или една од неговите променливи, или пак Visual Basic,или една од променливите [[Glossary#OO | OO]] на Pascal, како на пример [[Glossary#FreePascal | FreePascal]] со или без  [[Glossary#Lazarus | Lazarus]]).  
  
In a GUI the user is presented with a screen with a large number of images arranged in a structured way, consisting of a set of tools or [[Glossary#Widget | Widgets]] that are associated with various actions such as
+
Во GUI на корисникот му се прикажува екран со голем број на слики, распоредени на структуриран начин, којшто се содрши од поставки на алатки или [[Glossary#Widget | Widgets]], што се однесуваат на различни дејстваt како на пример
*selecting from a menu,  
+
*избирање од мени,  
*opening or saving files,  
+
*Отварање или зачувување фајлови,  
*connecting to the Internet,  
+
*поврзување на Интернет,  
*performing numerical computations, etc.  
+
*извршување нумерички пресметки, итн.  
 
   
 
   
The user is expected to move a mouse or other pointer/selection tool over the screen, to select actions which are to be performed in response to a mouse button click or a key-press.
+
Корисникот треба да го движи глувчето или друга алатка со стрелка/избирање низ екранот, со цел да избере дејства коишто треба да се извршат како одговор на кликање врз копчето од глувчето или од притискање на тастер.  
  
While systems to deal with a complex graphical user interface could be written in standard  Pascal or almost any other programming language, it is much easier to use an object-oriented system, in which each graphical object on the screen can have all its properties and the procedures and functions associated with its use kept together in a common structure.
+
Иако системите за работа со комплексни графички кориснички интерфејс можат да се напишаат во стандарден Pascal или скоро во секој друг јазик за програмирање, многу е полесно користењето на објект-ориентиран систем, во кој секој графички објект може да ги има сите свои особини, процедури и функции на екранот, што се однесуваат на нивната употреба, коишто се чуваат заедно во стандрардна структура.
  
  
== Objects - a real-world analogy ==  
+
== Објекти – реална аналогија ==  
Consider the analogy of a blood sample collected in a hospital or a doctor's office.
+
Разгледајте ја аналогијата за примерок од крв, земена во болница или во докторска ординација.
=== Blood Sample ===
+
=== Примерок од крв ===
The physical sample is certainly an '''object'''; it has, associated with it, a lot of information, documents and other physical objects.  
+
Физичкиот примерок сигурно претставува '''објект'''; тој има многу информации документи и други физички објекти што се однесуваат на него.  
  
*'''Sample tube''', of a type determined by the test that the physician wants performed.
+
*'''Епрувета со примерок''', на тип одреден со тестот којшто докторот сака да го изврши.
  
*'''Local rule''' (or ''method'', ''standard operating procedure'') to direct the nurse or technician collecting the sample
+
*'''Локално правило''' (или ''метод'', ''стандардна оперативна процедура'') со цел да се насочи медицинската сестра или техничарот при земање на примероци.
**which type of tube to use,  
+
**кој тип на tube треба да се користи,  
**how to process the sample
+
**како да се обработува примерокот
**how to store it before transfer to the lab.   
+
**како да се чува, пред да се пренесе во лабараторија.   
  
*'''Label''' on the tube with details of the
+
*'''Ознака''' на епруветата со детали за
**sample identifier
+
**идентификатор на примероци
**patient's name  and birthdate
+
**име на пациентот и датум на раѓање
**date and time of collection
+
**датум и време на земање
**tests required.  
+
**потребни тестови.  
  
*'''Request form''' that accompanies the sample to the lab, directing
+
*'''Формулар за барање''' којшто е прикачен на примерокот додека се носи во лабараторија, со насочување за
**sample ID
+
** ID на примероци
**ID of requesting physician
+
**ID на лекарот кој го поднесува барањето
**what test the physician requests and
+
**кои тестови ги бара лекарот, и
**giving fuller details of the patient
+
**приложување на целосни детали за пациентот
**the possible diagnosis for which confirmation is sought.  
+
**можната дијагноза за која се бара потврдување.  
  
A copy of the request form is placed in the patient's notes, to remind the physician to expect results within an appropriate time.  
+
Во белешките за пациентот се поставува копија од формуларот за барање, со цел лекарот да се потсети дека треба да очекува резултати во соодветно време.  
  
*In the lab - '''local methods''' to determine
+
*Во лабараторијата - '''локални методи''' за одредување
**how the sample is to be analysed,  
+
**како да се анализира примерокот,  
**what machines to use,  
+
**какви машини треба да се користат,  
**how the machines are to be calibrated and operated,  
+
**како да се калибрираат и управуваат машините,  
**how the results are to be stored, formatted and
+
**как да се чуваат и форматираат резултатите, и
**reported back to the physician.  
+
**како да му се врати извештај на лекарот.  
  
The actual '''results''' are a record that the physician uses to assist the diagnosis, and a copy of the results is filed in the patient notes.
+
Вистинските '''резултати''' претставуаат евиденција дека лекарот асистира при дијагностицирањето, и копија од резултатите која се внесува во белешките за пациентот.
  
The physical sample might be retained for reference, confirmation or further tests, or might be disposed of by pouring down the sink or by incineration; there will be a method to describe this.
+
Физичкиот примерок треба да се задржи за примедба, потврдување или за понатамошни тестови, или пак може да се отстрани со истурање во лавабо или пак со спалување; ќе има метод во кој ќе се опише ова.  
  
There is no need for a physician to spell out all the details and instructions every time a sample is collected; indeed, he may have very little knowledge of how the sample is processed in the lab. The details of the various processes are '''inherited''' from previous sample collections and analyses - there will be a generic plan for the whole sequence, and together we could think of the blood sample, all its documents and data, and the underlying methods, as a complex '''object'''.  
+
Нема потреба лекарот да ги запишува сите детали и инструкции секој пат кога се собира примерок; а всушност тој можеби има многу малку знаење за тоа како примерокот се обработува во лабараторија. Деталите од различните процеси се '''наследени''' од претходни собирања и анализи на примероци – ќе има генерички планови за целата серија,а примерокот, сите документации и податоци за него и основните методи се сметаат за комплексен '''објект'''.  
  
In the physician's mind, the blood sample is seen as almost the same entity as its results, and to the nurses and technicians the sample, the tube, the label and the storage conditions again form a single entity.
+
Приерокот од крвта лекарот го гледа на ист начин како и резултатите, а за медицинските сестри и техничарите, примерокот, епруветата, ознаката и условите за чување, повторно оформуваат еден субјект.  
=== Another Example - Automobile ===
 
If you don't like blood, the same sort of reasoning could be applied to a car taken to a garage for repair.
 
It might consist of:
 
*the physical vehicle
 
*documents held by the owner: registration or license (including license plates), insurance, receipts for purchase, parts, repairs etc
 
*the fuel consumption history
 
*the drivers allowed to use the vehicle, with their license particulars
 
*service records held by the garage
 
*methods or procedures to be followed for routine checking and maintenance
 
*methods to be followed for non-routine repairs etc
 
*billing information for the customer
 
  
== Programming Example ==
+
=== Друг пример - Автомобил ===
 +
Ако не сакате крв, истиот тип на резонирање може да се примени кај автомобил којшто е однесен во гаража на поправка.
 +
Може да се состои од:
 +
*физичото возило
 +
*Документи во сопственост на сопственикот: регистрација и дозвола (вклучувајќи регистарски таблици), осигурување, сметки од купување, делови, поправки, итн.
 +
*историјата за потрошувачка на гориво
 +
*визачите на кои им е дозволено да користат возила, заедно со нивните податоци за дозвола
 +
*евиденција за сервис во сопственост на гаражата:
 +
*методи или процедури за рутинска проверка и одржување
 +
*методи за нерутински поправки, итн.
 +
*информации за наплата за корисникот
  
Enough of this pre-occupation with Real-World examples! Let us proceed to the main purpose: programming in FreePascal.
+
== Пример за програмирање ==
  
Let us consider the creation of a simple Form with a few controls for an application in FreePascal/Lazarus.
+
Доста беше претставувањето на реални примери! Ајде да се упатиме на главната цел: програмирање во FreePascal.
  
 +
Ајде да ја разгледаме креацијата на едноставна Форма со неколку управувачки елементи за апликација во FreePascal/Lazarus.
 +
 +
<div class="floatleft">[[Image:ObjectInspector-TForm.png]]</div>
 
<div class="floatleft">[[Image:ObjectInspector-TForm.png]]</div>
 
<div class="floatleft">[[Image:ObjectInspector-TForm.png]]</div>
<div class="floatright">[[Image:BlankForm.png]]</div>
 
  
On invoking the Lazarus IDE, the programmer is presented with a blank template Form design, on which he is encouraged to place various controls or objects.
+
При стартување на Lazarus IDE, на програмерот му се претставува празен шаблон за дизајн на Форма, на што му се иницира да постави различни управувачки елементи или објекти.  
  
Note that the pre-made blank Form is already an Object, with its own properties such as position (Top and Left), size (Height and Width), colour, default font for adding text etc.
+
Ќе забележите дека претходно направената празна Форма е веќе Објект, со свои сопствени особини, како на пример позиција (Врв и Лево), големина (Височина и Широчина), боја, однапред зададен фонт за додавање на текст, итн.  
  
  
Line 90: Line 92:
 
----
 
----
  
If a Button control is placed on the Form (type TButton), it will have its own series of properties, which can be examined in the Object Inspector window.  
+
Ако на Формата е поставен управувачки елемент Копче (тип TButton), тоа ќа има сопствена серија на особини, коишто можат да се прегледуваат во прозорецот на Објект инспекторот.  
  
Several of the properties have names similar to those for the Form; this is because many properties are '''Inherited''' from some common Ancestor class, which lays out how properties are to be defined and handled by the descendant classes.  
+
Неколку од особините имаат имиња слични со оние за Формата; ова е поради тоа што многу особини се '''Наследени''' од некоја стандардна класа на Предок, којашто наведува како треба да се дефинираат и извршат особините, од страна на предок класите.  
  
As well as properties, the Object Inspector offers a tab called '''Events''', which gives access to Event Handlers which are methods instructing the application how to deal with things such as a mouse click on a button (OnClick) or some change in the position, size or other properties (OnChange).
+
Освен особини, Објект инспекторот исто така нуди јазиче наречено '''Настани''', што им дава пристап на Извршувачите на Настани, тие претставуваат методи коишто им даваат инструкции на апликацијата за тоа како да се извршат дејствата како што е кликање со глушец на копче (OnClick), или пак некои промени во позицијата, големината или други особини (OnChange).
  
The physical image of the Button on the Form, together with all its properties and Event Handler methods, should be regarded as a single entity or '''Object''' in Pascal.
+
Физичкиот изглед на Копчето на Формата, заедно со сите свои особини и методи за извршување на Настани, треба да се гледаат како еден субјект или '''Објект''' во Pascal.
  
 
<div class="floatleft">[[Image:ObjectInspector-TButton.png]]</div>
 
<div class="floatleft">[[Image:ObjectInspector-TButton.png]]</div>
 
<div class="floatright">[[Image:FormWithButton.png]]</div>
 
<div class="floatright">[[Image:FormWithButton.png]]</div>
<div class="floatright">[[Image:Source_FormWithButton1.png‎ ]]</div>
+
<div class="floatright">[[Image:Source_FormWithButton1.png?]]</div>
  
== Object-Oriented Extensions to standard Pascal ==
+
== Објект-ориентирано проширување на стандарден Pascal ==
  
The Pascal record structure is extended by defining an
+
Структурата за евиденција во Pascal е проширена со дефинирање на
=== Object ===
+
=== Објект ===
  
An Object is a special kind of record. The record contains all the fields that
+
Објект претставува посебен тип на евиденција. Евиденцијата ги содржи сите полиња што
are declared in the object's definition (just like a conventional record), but now procedures and functions can be declared as if they were part of the record and are held as pointers to the methods associated with the object's type.   
+
се декларирани во дефиницијата за Објектот (исто како и конвенционална евиденција), но сега процедурите и функциите можат да се декларираат како да се дел од евиденцијата, и се чуваат како покажувачи за методите што се однесуваат на типот на објектот.   
  
For example, an object could contain an array of real values, together with a Method for calculating the average.
+
Како на пример, еден објект може да содржи ред на реални вредности, заедно со Метод за пресметка на просечната вредност.  
  
 
  Type
 
  Type
 
   Average = Object
 
   Average = Object
 +
 
     NumVal: Integer;
 
     NumVal: Integer;
 
     Values: Array [1..200] of Real;
 
     Values: Array [1..200] of Real;
Line 119: Line 122:
 
   End;
 
   End;
  
Objects can ”inherit” fields and methods from ”parent” objects. This means that these fields and methods can be used as if they were included in the objects declared as a ”child” object.
+
Објектите можат да ”наследат” полиња и методи за ”родител” објекти. Ова значи дека овие полиња и методи можат да се користат ако биле вклучени во Објектот, декларирани како ”дете” објект.  
  
Furthermore, a concept of visibility is introduced: fields, procedures and functions can be declared
+
Освен ова, претставен е концепт за видливост: ? можат да се декларираат полиња, процедури и функции
as public, protected or private. By default, fields and methods are public, and can be exported outside the
+
како јавни, заштитени и приватни. Како однапред назначени, полињата и методите се јавни, и можат да се експортираат надвор од
current unit. Protected fields or methods are available only to objects descended from the current ancestor object. Fields or methods that are declared private are only accessible in the current unit:
+
тековниот модул. Заштитени полиња или методи се достапни само во објектите коишто потекнуваат од тековниот предок објект. Полиња или методи коишто се декларирани како приватни, единствено се достапни во тековниот модул:
their scope is limited to the implementation of the current unit.
+
нивниот обем е лимитиран на имплементацијата на тековниот фајл.  
  
=== Class ===
+
=== Класа ===
Objects are not used very often by themselves in FreePascal and Lazarus; instead, Classes are used very widely. A Class is defined in almost the same way as an Object, but is a pointer to an Object rather than the Object itself. Technically, this means that the Class is allocated on the Heap of a program, whereas the Object is allocated on the Stack.
+
Објектите не се користат многу често сами по себе во FreePascal и Lazarus; наместо тоа, во голем обем се користат Класи. Класата се дефинира на скоро ист начин како и Објектот, но повеќе претставува покажувач на Објект, отколку самиот Објект. Формално, ова значи дека Класата е назначена на Heap од програмата, додека Објектот е назначен на Stack.
  
Here is a simple example of a typical Class declaration:
+
Ова е едноставен пример за типична декларација на Класа:
 
  {-----------------------------------------}
 
  {-----------------------------------------}
 
  {example of Class declaration from the LCL}
 
  {example of Class declaration from the LCL}
Line 168: Line 171:
  
  
Note that this class is defined as an instance of another '''parent''' or '''ancestor''' class (''TFPCustomPen'') from which it '''inherits''' all its properties and methods. It has some fields of its own, grouped under
+
Ќе забележите дека оваа класа е дефинирана како пример за друг '''родител''' или '''предок''' класа (''TFPCustomPen'') од која таа '''наследува'''  
*'''private''' - this means that items defined here are only available or visible to other classes or procedures/function defined within the same program unit (this example is from ''Graphics'', so any of the other classes such as ''TBitMap'', ''TPicture'' etc in the same unit can use them). They are essentially local variables (eg ''FColor'', ''FPenHandleCached'') or locally used methods (''GetHandle'', ''SetHandle'') but can be used or referred to in items declared in the '''protected''' or '''public''' sections.
+
Има некои сопствени полиња, групирани под
*'''protected''' - this means that items defined here are only available or visible to classes that are descended from this '''ancestor''' class, and inherit its properties or methods
+
*'''приватно''' – ова значи дека елементите дефинирани овде се достапни или видливи замо за други класи или процедури/функции, дефинирани во истиот програмски модул (овој пример е од ''Графика'', па било која од другите класи како на пример ''TBitMap'', ''TPicture'' итн. во истиот модул ќе можат да ги користат). Тие всушност се локални променливи (пр.''FColor'', ''FPenHandleCached'') или методи коишто се користат локално (''GetHandle'', ''SetHandle'')но можат да се користат или да се однесуват на елементи објавени во одделите '''заштитено''' или '''јавно'''.
*'''public''' - this means that items defined here are available to any programming unit that includes the current unit in its [[Glossary#Uses | Uses]] clause
+
*'''приватно''' – ова значи дека елементите дефинирани овде се достапни или видливи замо за класи коишто потекнуваат од оваа класа'''предок''', и ги наследуват нејзините особини или методи.
*'''published''' - is the same as a '''public''' section, but the compiler also generates type information that is needed for automatic streaming of these classes. Often the list of published items appear in the Object Inspector of Lazarus; if there is no '''published''' list, all the '''public''' fields usually appear in the Object Inspector.
+
*'''приватно''' – ова значи дека елементите дефинирани овде се достапни или видливи замо за класи коишто потекнуваат од оваа класа'''предок''', и ги наследуват нејзините особини или методи.
 +
*'''објавени''' – е исто како и одделот '''јавно''', но компајлерорт исто така генерира тип на информација потрабна за автоматски тек на овие класи. Често листата на објавени елементи се појавува во Објект Инспекторот на Lazarus; Ако не постои  '''објавена''' листа, тогаш сите '''јавни''' полиња обично се појавуваат во Објект инспекторот.
 +
 
 +
=== Методи ===
 +
Методот е ист како и стандардната процедура или функција, но може да има некои дополнителни '''директиви'''.
  
=== Methods ===
+
Некои од методите дефинирани погоре се означени со директива '''виртуелно'''; други пак се означени со директива'''прескокни'''.
A method is just like a standard procedure or function, but can have some additional '''directives'''.
+
*'''виртуелно''' значи дека типот или вистинскиот пример за методот не е познат во времето на компајлирање, но се избира во времето на извршување, во зависност од тоа која подпрограма всушност го повикува методот. Може да се смета како носител на место во дефиницијата на класата.  
  
Some of the methods defined above are labelled with the directive '''virtual'''; others are labelled with the '''override''' directive.
+
*'''прескокни''' значи дека во време на извршување, локално дадената дефиниција може да го завземе местото на дефиниција, наследена од предок класа, особено ако станува збор за '''виртуелно'''. Ако посебно сакате да го употребите методот дефиниран во предок класата, понекогаш е потребно специјално да го повикате со клаузата '''наследено'''.
*'''virtual''' means that the type or actual instance of a method is not known at compile-time, but is selected at run-time depending on what sub-program actually calls the method. It could be considered a place-holder in the definition of the class.
 
*'''override''' means that at run-time the locally given definition can take the place of a definition inherited from an ancestor class, particularly if it was '''virtual'''. If you particularly want to use the method defined in the ancestor class, it is sometimes necessary to call it specifically with the '''inherited''' clause.
 
  
Methods with no virtual or override directive are '''static''' methods (the usual kind in Pascal). Those with a virtual or override directive are '''dynamic'''.
+
Методите без виртуелна директива или директива за прескокнување се '''статични''' методи (стандарден тип во Pascal). Оние со виртуелна директива или директива за прескокнување се '''динамични'''.
  
Special instances of methods are:
+
Посебни примери за методи се:
*'''create''' - a '''constructor''' for a class, which takes care of allocating memory, collecting together all the information needed and configuring/initializing the various properties.
+
*'''креирај''' - '''конструктор''' за класа, што се грижи за доделување на меморија, собирајќи ги сите информации потребни за конфигурирање/инсталирање на различни особини.
*'''destroy''' - a '''destructor''' for a class, which removes all the parts of the class from the system in an orderly and logical way, and returns all its resources for the system to re-use.
+
*'''уништи''' - '''уништувач''' за класа, којшто на уреден и логичен начин ги отстранува сите делови на класата од системот, и ги враќа сите нејзини извори за системот во повторна употреба.  
  
=== Properties ===
+
=== Особини ===
  
Properties are just like ordinary fields in a conventional Pascal record, but they can have '''read''' and/or '''write''' specifiers.
+
Особините се исти како и обичните полиња во конвенционален запис во Pascal, но тие можат да имаат '''читај''' и/или '''пишувај''' назначувачи.
*'''read''' specifier is a field, or a function that returns a result of the correct type for the property. In the example above, the property ''Color'' has a read specifier ''FColor'', which is a local variable containing the value to be used. If a property has a '''read''' but no '''write''' specifier, it is read-only.
+
*назначувачот '''читај''' претставува поле или функција, која враќа резултат од точниот тип за особината. Во горенаведениот пример, особината ''Боја'' има назначувач за читање ''FColor'', којшто претставува локална променлива што ја содржи вредноста што треба да се употреби. Ако одредена особина има '''читај''' но нема '''пишувај''' назначувач, тогаш може само да се прочита.  
*'''write''' specifier is a field, or a procedure that will store the value of the property in a specific location. In the example above, ''Color'' has a write specifier ''SetColor'' that is a procedure (defined in the  '''protected''' section) for writing the color value to some specified location. If a property has a '''write''' but no '''read''' specifier, it is write-only.
+
*назначувачот '''пишувај''' претставува поле или процедура, што ќе ја складира вредноста на особината на одредена локација. Во горенаведениот пример, особината ''Боја'' има назначувач ''SetColor'', којшто претставува процедура (дефинирана во одделот '''заштитено''') за впишување на вредноста за бојата на некоја одредена локација. Ако одредена особина има '''пишувај''' но нема '''читај''' назначувач, тогаш може само да се пишува.
*'''default''' - note that it is possible to set a '''default''' value for a property. For example, ''Color'' here is given the default value ''clBlack'', or black, at the time of creation. It could subsequently be given a different value, by a programming assignment statement, or in the Object Inspector.
+
*'''однапред назначено''' – ќе забележите дека е возможно да поставите '''однапред назначена''' вредност за особината. Како на пример, ''Боја''-овде се дава однапред назначена вредност ''clBlack'', или црна, во моментот на креирање. Понатаму може да се даде друга вреднсот, со програмирање на исказ за назначување, или во Објект Инспекторот.  
  
  
== Further information ==
+
== Дополнителни информации ==
  
This has only scratched the surface of the topic. For more details, readers are strongly recommended to read the [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html FreePascal] manuals, especially Chapters 5 ('''Objects''') and 6 ('''Classes''')
+
Со ова само површински ја обработивме оваа тема. За повеќе детали, на читачите им се препорачува да ги прочитаат упатствата [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)

Revision as of 17:18, 27 September 2008

Template:Објект ориентирано програмирање со FreePascal и Lazarus

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

An Object is an extension of the standard Pascal запис

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ObjectInspector-TForm.png
ObjectInspector-TForm.png

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

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



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

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

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

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

ObjectInspector-TButton.png
FormWithButton.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)