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

From Free Pascal wiki
Jump to navigationJump to search
 
(40 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}}
  
Существует много отличных учебников по Pascal, но этот служит попыткой вести начинающего программиста далее, в объектно-ориентированное программирование ( [[Glossary#OO | Object-Oriented Programming]], )являющееся расширением стандартного Pascal, применяемое в Turbo-pascal, Delphi и FreePascal/Lazarus.
+
Существует много отличных учебников по Pascal, но этот служит попыткой вести начинающего программиста далее, в объектно-ориентированное программирование ([[Glossary#OO|Object-Oriented Programming]]) являющееся расширением стандартного Pascal, применяемое в TurboPascal, Delphi и FreePascal/Lazarus.
  
 
[[Glossary#Object | Object]] (Объект) - это расширение стандартной структуры Pascal [http://wiki.lazarus.freepascal.org/Record record] (Запись).  
 
[[Glossary#Object | Object]] (Объект) - это расширение стандартной структуры Pascal [http://wiki.lazarus.freepascal.org/Record record] (Запись).  
Line 22: Line 22:
 
== Объекты - аналогия реального мира ==  
 
== Объекты - аналогия реального мира ==  
 
Объекты напоминают результаты анализа крови из больницы или поликлиники.
 
Объекты напоминают результаты анализа крови из больницы или поликлиники.
=== 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.
+
== Пример программирования ==
 +
 
 +
Достаточно этих введений с примерами из реального мира! Обратимся к основной цели - программированию на FreePascal.
 +
 
 +
Рассмотрим создание простой формы с несколькими элементами управления для приложения на FreePascal/Lazarus.
  
 
<div class="floatleft">[[Image:ObjectInspector-TForm.png]]</div>
 
<div class="floatleft">[[Image:ObjectInspector-TForm.png]]</div>
 
<div class="floatright">[[Image:BlankForm.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="floatcenter">[[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
Line 119: Line 121:
 
   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 не очень часто; однако классы получили широкое применение. Класс определяется почти так же, как объект, но является не самим объектом, а указателем на него. Технически это означает, что Класс располагается в теле программы, тогда как Объект располагается в стеке.
  
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 168:
  
  
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.
+
*'''private(частные)''' - это означает, что элементы, определенные здесь, доступны или видимы другим классам или процедурам/функциям, определенным только внутри данного программного модуля (Этот пример - из ''Graphics'', так что любой из других классов -''TBitMap'', ''TPicture'' и т.д. этого же модуля может их использовать). Это как локальные переменные (напр. ''FColor'', ''FPenHandleCached'') или локально используемые методы (''GetHandle'', ''SetHandle''), но можно использовать или ссылаться на элементы, объявленные в секциях '''protected''' или '''public'''.
*'''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
+
*'''protected(защищенные)''' - это означает, что элементы, определенные здесь, доступны или видимы только классам, произведенным из этого класса - '''предка''', и унаследовали его свойства и методы.
*'''public''' - this means that items defined here are available to any programming unit that includes the current unit in its [[Glossary#Uses | Uses]] clause
+
*'''public''' - это означает, что элементы, определенные здесь, доступны любому программному модулю, включившему текущий модуль в свою секцию [[Glossary#Uses | Uses]]
*'''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.
+
*'''published''' - подобна секции '''public''', но компилятор генерирует типовую информацию, требуемую для автоматического подключения этих классов. Часто список published элементов появляется Инспекторе объектов Lazarus; если список '''published''' отсутствует, в Инспекторе объектов обычно появляются поля '''public'''.
  
=== 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 (виртуальный)'''; другие - '''override (аннулируемый)'''.
*'''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.
+
*'''virtual''' означает, что тип, или фактический экземпляр метода не известен во время компиляции, но выбирается во время выполнения в зависимости от того, какая подпрограмма вызывает метод. Он может рассматриваться как заполнитель в определении класса.
*'''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.
+
*'''override''' означает, что во время выполнения локально данное определение может заменить определение, унаследованное от класса - предка, особенно, если оно было '''virtual'''. Если необходимо применить метод, определенный в родительском классе,  его нужно вызывать специфично, с оговоркой '''inherited'''.
  
Methods with no virtual or override directive are '''static''' methods (the usual kind in Pascal). Those with a virtual or override directive are '''dynamic'''.
+
Методы без директив virtual или override являются '''статическими''' (обычными для 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.
+
*'''create''' - '''constructor''' для класса, заботящегося о распределении памяти, сбора всей необходимой информации и настройки/инициализации различных свойств.
*'''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.
+
*'''destroy''' - '''destructor''' для класса, упорядоченно удаляющего все составляющие класса из системы, и возвращающего все свои ресурсы системе для повторного использования.
  
=== 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.
+
*Указатель '''чтение''' является полем или функцией, возвращающим результат корректного типа для свойства. В вышеприведенном примере, свойство ''Color'' имеет указатель чтения ''FColor'', являющийся локальной переменной, которая содержит используемое значение. Если свойство имеет указатель '''read''' и не имеет '''write''', оно служит только для чтения.
*'''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.
+
*Указатель '''запись''' является полем или процедурой, устанавливающей значение свойства в определенное место. В вышеприведенном примере, ''Color'' имеет указатель записи ''SetColor'', являющийся процедурой (определено в секции '''protected''') для записи значения цвета в указанное место. Если свойство имеет указатель '''write''' и не имеет '''read''', оно служит только для записи.
*'''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.
+
*'''default''' - имеется возможность установки значения свойства по умолчанию '''default'''. Например, ''Color'' имеет значение по умолчанию ''clBlack'', или черный, во время создания. Впоследствии ему можно присвоить другое значение оператором присвоения в программе или через Инспектор объектов.
  
 +
== Дальнейшая информация ==
  
== Further information ==
+
Здесь даны только самые начала темы. Для дальнейшего изучения настоятельно рекомендуется читать руководство [http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html FreePascal], в особенности главы 5 ('''Объекты''') и 6 ('''Классы''')
 
 
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''')
 
  
 
--[[User:Kirkpatc|Kirkpatc]] 11:04, 20 July 2008 (CEST)
 
--[[User:Kirkpatc|Kirkpatc]] 11:04, 20 July 2008 (CEST)
  
 
----
 
----
[[Console Mode Pascal]]
+
 
 +
[[Console Mode Pascal/ru]]

Latest revision as of 12:06, 19 June 2015

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

Существует много отличных учебников по Pascal, но этот служит попыткой вести начинающего программиста далее, в объектно-ориентированное программирование (Object-Oriented Programming) являющееся расширением стандартного Pascal, применяемое в TurboPascal, Delphi и FreePascal/Lazarus.

Object (Объект) - это расширение стандартной структуры Pascal record (Запись).

Стандартное текстовое программирование на Pascal пригодно для создания приложений, которые, как обычные приложения Unix, очень хорошо выполняют всего одну функцию. Программа может выполнять и очень сложные действия, предлагая пользователю выборы из меню, но по существу ограничена командами, которые пользователь набирает на клавиатуре и смотрит ответы на терминале или принтере.

Для создания графического интерфейса пользователя Graphical User Interface (GUI) обычно применяются методы объектно-ориентированного программирования (чаще всего на C или его вариантах, или Visual Basic, или на одном из OO вариантов Pascal, таких, как FreePascal совместно с Lazarus, или без него).

На GUI потребителю предоставляется экран с множеством картинок, отображающих определенную структуру, содержащую набор инструментов, или Widgets (Виджетов), ассоциированных с различными действиями, таких как

  • Выбор из меню,
  • Открытие или сохранение файлов,
  • Соединение с Интернет,
  • Выполнение вычислений, и т.п.

Пользователь перемещает по экрану указатель мыши или иного инструмента выбора точки для выбора действия, выполняемого в ответ на щелчок мыши или нажатие клавиши.

Программы со сложным графическим интерфейсом могут быть написаны на стандартном Pascal или любом другом языке программирования, но намного проще применить объектно-ориентированную систему, в которой каждый графический объект на экране может иметь собственный набор свойств, процедур и функций, существующих совместно, в общей структуре.


Объекты - аналогия реального мира

Объекты напоминают результаты анализа крови из больницы или поликлиники.

Анализ крови

Экземпляр анализа - несомненно, объект; он имеет много связанной информации, документов и других физических объектов.

  • Трубка для анализа, определенного типа, который заказал врач.
  • Отдельные правила (или методика, способ выполнения) для указания медсестре, берущей анализ.
    • какой тип трубки применить,
    • как произвести отбор анализа,
    • как хранить его до передачи в лабораторию.
  • Этикетка на трубке с указанием
    • номера анализа
    • имени пациента и даты рождения
    • даты и времени взятия
    • требуемых проверок.
  • Бланк запроса для лаборатории, указывающий
    • Номер анализа
    • Номер запроса врача
    • что предусматривает запрос врача и
    • дается более полная информация о пациенте
    • возможный диагноз, которому нужно подтверждение.

Копия запроса помещается в карточку пациента для напоминания врачу об ожидании результата в соответствующее время.

  • В лабораторию - отдельные методы для указания
    • как производить анализ,
    • какую применять аппаратуру,
    • как откалибровать и произвести замеры на приборе,
    • как результаты должны быть отображены и
    • направлены врачу.

Фактически результаты - запись, помогающая врачу установить диагноз, и ее копия помещается в карточку пациента.

Физическая доза крови может быть оставлена на хранение для контроля или дальнейших проверок, может быть слита в раковину, или сожжена; это также должно быть описано.

Однако в жизни для врача нет необходимости описывать по буквам все детали и инструкции для каждого анализа; действительно, он может иметь немного понятий об обработке анализа в лаборатории. Детали разных процессов унаследованы от предшествующих анализов - имеется общий план для всей последовательности - и мы можем представить анализ крови с его документами, данными и основными методами, как комплекс объект.

В уме врача анализ крови выглядит в большей степени, как его результат, для медсестры - как доза крови, трубка, этикетка и условия хранения; а по сути - это единый объект.

Другой пример - автомобиль

Если Вас пугает пример с кровью, те же рассуждения могут быть приложены к автомобилю, сданному в гараж для ремонта.

Он может состоять из:

  • физической автомашины
  • документов владельца: регистрации или лицензии (включая номерной знак), страхового свидетельства, денег для покупки частей, оплаты ремонта и т.д.
  • информации о потреблении топлива
  • документов водителей, управлявших машиной, с их частными лицензиями
  • записей об обслуживании, хранящихся в гараже
  • описаний способов или процедур для обычной проверки и эксплуатации
  • способов более сложного ремонта и т.д.
  • выписанного счета для клиента

Пример программирования

Достаточно этих введений с примерами из реального мира! Обратимся к основной цели - программированию на FreePascal.

Рассмотрим создание простой формы с несколькими элементами управления для приложения на FreePascal/Lazarus.

ObjectInspector-TForm.png
BlankForm.png

Вначале Lazarus IDE представляет программисту шаблон пустой формы, на которой можно размещать различные элементы управления, или объекты.

Предоставленный бланк уже является объектом, со своими свойствами, такими как Позиция (Верх и Отступ), размер (Высота и Ширина), цвет, шрифт для текста и т.д.



Если на форму поместить кнопку (тип TButton), она будет иметь свой набор свойств, который можно просмотреть в окне Инспектора Объектов.

Некоторые свойства кнопки имеют те же имена, что и свойства формы, что является следствием Наследования многих свойств из общего класса - предка, указывающего, как свойства определяются и управляются в классе - потомке.

Как и для свойств, Инспектор Объектов имеет вкладку, называемую События, дающую возможность настроить реакцию объекта на внешние воздействия, такие как щелчок мыши на кнопке (OnClick), или некоторое изменение позиции, размера, или других свойств (OnChange), для того, чтобы приложение выполняло в ответ некоторые действия.

Физический образ кнопки на форме, совместно с его свойствами и методами обработки событий считается единой сущностью, или Объектом в Pascal.

ObjectInspector-TButton.png
FormWithButton.png
Source FormWithButton1.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 не очень часто; однако классы получили широкое применение. Класс определяется почти так же, как объект, но является не самим объектом, а указателем на него. Технически это означает, что Класс располагается в теле программы, тогда как Объект располагается в стеке.

Приведем пример обычного объявления Класса:

{-----------------------------------------}
{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) от которого он наследует все его свойства и методы. Он имеет собственные поля, сгруппированные как

  • private(частные) - это означает, что элементы, определенные здесь, доступны или видимы другим классам или процедурам/функциям, определенным только внутри данного программного модуля (Этот пример - из Graphics, так что любой из других классов -TBitMap, TPicture и т.д. этого же модуля может их использовать). Это как локальные переменные (напр. FColor, FPenHandleCached) или локально используемые методы (GetHandle, SetHandle), но можно использовать или ссылаться на элементы, объявленные в секциях protected или public.
  • protected(защищенные) - это означает, что элементы, определенные здесь, доступны или видимы только классам, произведенным из этого класса - предка, и унаследовали его свойства и методы.
  • public - это означает, что элементы, определенные здесь, доступны любому программному модулю, включившему текущий модуль в свою секцию Uses
  • published - подобна секции public, но компилятор генерирует типовую информацию, требуемую для автоматического подключения этих классов. Часто список published элементов появляется Инспекторе объектов Lazarus; если список published отсутствует, в Инспекторе объектов обычно появляются поля public.

Методы

Метод подобен обычной процедуре или функции, но может иметь некие дополнительные директивы.

Некоторые методы, определенные выше, помечены директивой virtual (виртуальный); другие - override (аннулируемый).

  • virtual означает, что тип, или фактический экземпляр метода не известен во время компиляции, но выбирается во время выполнения в зависимости от того, какая подпрограмма вызывает метод. Он может рассматриваться как заполнитель в определении класса.
  • override означает, что во время выполнения локально данное определение может заменить определение, унаследованное от класса - предка, особенно, если оно было virtual. Если необходимо применить метод, определенный в родительском классе, его нужно вызывать специфично, с оговоркой inherited.

Методы без директив virtual или override являются статическими (обычными для Pascal). Методы, имеющие такие директивы, считаются динамическими.

Методы имеют специальные возможности:

  • create - constructor для класса, заботящегося о распределении памяти, сбора всей необходимой информации и настройки/инициализации различных свойств.
  • destroy - destructor для класса, упорядоченно удаляющего все составляющие класса из системы, и возвращающего все свои ресурсы системе для повторного использования.

Свойства

Свойства аналогичны простым полям в "Записи" стандартного Pascal, но могут иметь указатели чтение и/или запись.

  • Указатель чтение является полем или функцией, возвращающим результат корректного типа для свойства. В вышеприведенном примере, свойство Color имеет указатель чтения FColor, являющийся локальной переменной, которая содержит используемое значение. Если свойство имеет указатель read и не имеет write, оно служит только для чтения.
  • Указатель запись является полем или процедурой, устанавливающей значение свойства в определенное место. В вышеприведенном примере, Color имеет указатель записи SetColor, являющийся процедурой (определено в секции protected) для записи значения цвета в указанное место. Если свойство имеет указатель write и не имеет read, оно служит только для записи.
  • default - имеется возможность установки значения свойства по умолчанию default. Например, Color имеет значение по умолчанию clBlack, или черный, во время создания. Впоследствии ему можно присвоить другое значение оператором присвоения в программе или через Инспектор объектов.

Дальнейшая информация

Здесь даны только самые начала темы. Для дальнейшего изучения настоятельно рекомендуется читать руководство FreePascal, в особенности главы 5 (Объекты) и 6 (Классы)

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


Console Mode Pascal/ru