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

From Lazarus 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 | ...)
 
 
(28 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Object_Oriented_Programming_with_FreePascal_and_Lazarus}}
+
{{Object Oriented Programming with Free Pascal and 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
 
  
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.  
+
[[Glossary#Object | Објект]] претставува проширување на стандардниот Pascal [http://wiki.lazarus.freepascal.org/Запис запис]
  
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]]).
 
  
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
+
Стандардното програмирање во Pascal, врз основа на текст, е добро за креирање апликации, што како традиционалните Unix апликации, извршуваат една работа, но ја извршуваат добро.
*selecting from a menu,  
+
„Една работа“ што оваа програма ја извршува може да биде многу комплицирано дејство, а на корисникот може да му обезбеди неколку опции управувани од мени, но значително е ограничено придржувањето до наредбите што корисникот ги отчукува на тастатурата, како и слушањето на нивните одговори на терминалот или, пак, на печатачот.
*opening or saving files,  
+
 
*connecting to the Internet,  
+
Со цел да се обезбеди [[Glossary#GUI | Графички кориснички интерфејс (GUI)]] вообичаено е да се повика некој вид метод на Објект-ориентирано програмирање (често користејќи [[Glossary#C Програмски јазик | C]] или една од неговите променливи или Visual Basic или една од променливите [[Glossary#OO | OO]] на Pascal, на пример, [[Glossary#FreePascal | FreePascal]] со или без [[Glossary#Lazarus | Lazarus]]).
*performing numerical computations, etc.  
+
 
 +
Во GUI на корисникот му се прикажува екран со голем број слики, распоредени на структуриран начин, кој се состои од поставки на алатки или [[Glossary#Widget | Widgets]], што се однесуваат на различни дејства, на пример:
 +
*избирање од мени,
 +
*oтворање или зачувување датотеки,
 +
*поврзување на интернет,
 +
*извршување нумерички пресметки итн.
 
   
 
   
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,  
 
**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 of requesting physician
+
**име на пациентот и датум на раѓање,
**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.
+
== Пример за програмирање ==
  
<div class="floatleft">[[Image:ObjectInspector-TForm.png]]</div>
+
Доста беше претставувањето на реални примери! Ајде да се упатиме на главната цел: програмирање во FreePascal.
<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.
+
Ајде да ја разгледаме креацијата на едноставна форма со неколку управувачки елементи за апликација во FreePascal/Lazarus.
  
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.
+
<div class="floatleft">[[Image:ObjectInspector-TForm-mk.png]]</div>
 +
<div class="floatright">[[Image:BlankForm-mk.png]]</div>
 +
 
 +
При стартување на Lazarus IDE, на програмерот му се претставува празен шаблон за дизајн на форма, на што му се иницира да постави различни управувачки елементи или објекти.
 +
 
 +
Ќе забележите дека претходно направената празна форма е веќе објект, со свои сопствени особини, на пример, позиција (Врв и Лево), големина (Височина и Широчина), боја, однапред зададен фонт за додавање текст итн.
  
  
Line 90: Line 95:
 
----
 
----
  
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), тоа ќа има сопствена серија на особини, што можат да се прегледуваат во прозорецот на Објект-инспекторот.
 +
 
 +
Неколку од особините имаат имиња слични со оние за формата; ова е поради тоа што многу особини се '''Наследени''' од некоја стандардна класа на Предок, што наведува како треба да се дефинираат и да се извршат особините, од страна на предок-класите.
 +
 
 +
Освен особини, Објект-инспекторот, исто така, нуди јазиче наречено '''Настани''', што им дава пристап на Извршувачите на настаните, тие претставуваат методи што им даваат инструкции на апликацијата за тоа како да се извршат дејствата како што е кликање со глувче на копче (OnClick) или, пак, некои промени во позицијата, големината или други особини (OnChange).
 +
 
 +
физичкиот изглед на Копчето на формата, заедно со сите свои особини и методи за извршување настани, треба да се гледаат како еден субјект или '''Објект''' во Pascal.
 +
 
 +
<div class="floatleft">[[Image:ObjectInspector-TButton-mk.png]]</div>
 +
<div class="floatright">[[Image:FormWithButton-mk.png]]</div>
 +
<div class="floatright">[[Image:Source_FormWithButton1-mk.png]]</div>
 +
 
 +
== Објект-ориентирано проширување на стандарден Pascal ==
 +
 
 +
Структурата за евиденција во Pascal е проширена со дефинирање
 +
 
 +
=== Објект ===
 +
 
 +
Објект претставува посебен тип на евиденција. Евиденцијата ги содржи сите полиња што се декларирани во дефиницијата за Објектот (исто како и конвенционална евиденција), но сега процедурите и функциите можат да се декларираат како да се дел од евиденцијата и се чуваат како покажувачи за методите што се однесуваат на типот на објектот.
 +
 
 +
На пример, еден објект може да содржи ред на реални вредности, заедно со Методот за пресметка на просечната вредност.
 +
 
 +
 
 +
 
 +
 
  
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).
 
  
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.
 
  
<div class="floatleft">[[Image:ObjectInspector-TButton.png]]</div>
 
<div class="floatright">[[Image:FormWithButton.png]]</div>
 
<div class="floatright">[[Image:Source_FormWithButton1.png‎ ]]</div>
 
  
== Object-Oriented Extensions to standard Pascal ==
 
  
The Pascal record structure is extended by defining an
 
=== 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
Line 119: Line 136:
 
   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 183:
  
  
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'''.
+
*'''Прескокни''' значи дека во време на извршување, локално дадената дефиниција може да го заземе местото на дефиниција, наследена од предок-класа, особено ако станува збор за '''виртуелно'''. Ако посебно сакате да го употребите методот дефиниран во предок класата, понекогаш е потребно специјално да го повикате со клаузата '''наследено'''.
  
Special instances of methods are:
+
Методите без виртуелна директива или директива за прескокнување се '''статични''' методи (стандарден тип во Pascal). Оние со виртуелна директива или директива за прескокнување се '''динамични'''.
*'''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.
+
=== Особини ===
*'''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.
 
*'''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.
 
*'''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.
 
  
 +
Особините се исти како и обичните полиња во конвенционален запис во Pascal, но тие можат да имаат '''читај''' и/или '''пишувај''' назначувачи.
 +
*Назначувачот '''читај''' претставува поле или функција, која враќа резултат од точниот тип за особината. Во горенаведениот пример, особината ''Боја'' има назначувач за читање ''FColor'', што претставува локална променлива што ја содржи вредноста што треба да се употреби. Ако одредена особина има '''читај''', но нема '''пишувај''' назначувач, тогаш може само да се прочита.
 +
*Назначувачот '''пишувај''' претставува поле или процедура, што ќе ја складира вредноста на особината на одредена локација. Во горенаведениот пример, особината ''Боја'' има назначувач ''SetColor'', што претставува процедура (дефинирана во одделот '''заштитено''') за впишување на вредноста за бојата на некоја одредена локација. Ако одредена особина има '''пишувај''', но нема '''читај''' назначувач, тогаш може само да се пишува.
 +
*'''Однапред назначено''' – ќе забележите дека е возможно да поставите '''однапред назначена''' вредност за особината. На пример, ''Боја'' - овде се дава однапред назначена вредност ''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)

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)