Sign in Join
Wiki copytemporary

Object Oriented Programming with Free Pascal and Lazarus/ru: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Существует много отличных учебников по Pascal, но этот служит попыткой вести начинающего программиста далее, в объектно-ориентированное программирование ([[Glossary|Object-Oriented Programming]]) являющееся расширением стандартного Pascal, применяемое в TurboPascal, Delphi и FreePascal/Lazarus.
22
33[[Glossary|Object]] (Объект) - это расширение стандартной структуры Pascal [record](http://wiki.lazarus.freepascal.org/Record) (Запись).
44
55Стандартное текстовое программирование на Pascal пригодно для создания приложений, которые, как обычные приложения Unix, очень хорошо выполняют всего одну функцию. Программа может выполнять и очень сложные действия, предлагая пользователю выборы из меню, но по существу ограничена командами, которые пользователь набирает на клавиатуре и смотрит ответы на терминале или принтере.
66
77Для создания графического интерфейса пользователя [[Glossary|Graphical User Interface (GUI)]] обычно применяются методы объектно-ориентированного программирования (чаще всего на [[Glossary|C]] или его вариантах, или Visual Basic, или на одном из [[Glossary|OO]] вариантов Pascal, таких, как [[Glossary|FreePascal]] совместно с [[Glossary|Lazarus]], или без него).
88
99На GUI потребителю предоставляется экран с множеством картинок, отображающих определенную структуру, содержащую набор инструментов, или [[Glossary|Widgets]] (Виджетов), ассоциированных с различными действиями, таких как
1010
1111- Выбор из меню,
1212- Открытие или сохранение файлов,
1313- Соединение с Интернет,
1414- Выполнение вычислений, и т.п.
1515
1616Пользователь перемещает по экрану указатель мыши или иного инструмента выбора точки для выбора действия, выполняемого в ответ на щелчок мыши или нажатие клавиши.
1717
1818Программы со сложным графическим интерфейсом могут быть написаны на стандартном Pascal или любом другом языке программирования, но намного проще применить объектно-ориентированную систему, в которой каждый графический объект на экране может иметь собственный набор свойств, процедур и функций, существующих совместно, в общей структуре.
1919
2020## Объекты - аналогия реального мира
2121
2222Объекты напоминают результаты анализа крови из больницы или поликлиники.
2323
2424### Анализ крови
2525
2626Экземпляр анализа - несомненно, **объект**; он имеет много связанной информации, документов и других физических объектов.
2727
2828- **Трубка для анализа**, определенного типа, который заказал врач.
2929
3030- **Отдельные правила** (или *методика*, *способ выполнения*) для указания медсестре, берущей анализ.
3131 - какой тип трубки применить,
3232 - как произвести отбор анализа,
3333 - как хранить его до передачи в лабораторию.
3434
3535- **Этикетка** на трубке с указанием
3636 - номера анализа
3737 - имени пациента и даты рождения
3838 - даты и времени взятия
3939 - требуемых проверок.
4040
4141- **Бланк запроса** для лаборатории, указывающий
4242 - Номер анализа
4343 - Номер запроса врача
4444 - что предусматривает запрос врача и
4545 - дается более полная информация о пациенте
4646 - возможный диагноз, которому нужно подтверждение.
4747
4848Копия запроса помещается в карточку пациента для напоминания врачу об ожидании результата в соответствующее время.
4949
5050- В лабораторию - **отдельные методы** для указания
5151 - как производить анализ,
5252 - какую применять аппаратуру,
5353 - как откалибровать и произвести замеры на приборе,
5454 - как результаты должны быть отображены и
5555 - направлены врачу.
5656
5757Фактически **результаты** - запись, помогающая врачу установить диагноз, и ее копия помещается в карточку пациента.
5858
5959Физическая доза крови может быть оставлена на хранение для контроля или дальнейших проверок, может быть слита в раковину, или сожжена; это также должно быть описано.
6060
6161Однако в жизни для врача нет необходимости описывать по буквам все детали и инструкции для каждого анализа; действительно, он может иметь немного понятий об обработке анализа в лаборатории. Детали разных процессов **унаследованы** от предшествующих анализов - имеется общий план для всей последовательности - и мы можем представить анализ крови с его документами, данными и основными методами, как комплекс **объект**.
6262
6363В уме врача анализ крови выглядит в большей степени, как его результат, для медсестры - как доза крови, трубка, этикетка и условия хранения; а по сути - это единый объект.
6464
6565### Другой пример - автомобиль
6666
6767Если Вас пугает пример с кровью, те же рассуждения могут быть приложены к автомобилю, сданному в гараж для ремонта.
6868
6969Он может состоять из:
7070
7171- физической автомашины
7272- документов владельца: регистрации или лицензии (включая номерной знак), страхового свидетельства, денег для покупки частей, оплаты ремонта и т.д.
7373- информации о потреблении топлива
7474- документов водителей, управлявших машиной, с их частными лицензиями
7575- записей об обслуживании, хранящихся в гараже
7676- описаний способов или процедур для обычной проверки и эксплуатации
7777- способов более сложного ремонта и т.д.
7878- выписанного счета для клиента
7979
8080## Пример программирования
8181
8282Достаточно этих введений с примерами из реального мира! Обратимся к основной цели - программированию на FreePascal.
8383
8484Рассмотрим создание простой формы с несколькими элементами управления для приложения на FreePascal/Lazarus.
8585
8686![](/wiki-images/2/25/ObjectInspector-TForm.png)
8787
8888![](/wiki-images/e/e2/BlankForm.png)
8989
9090Вначале Lazarus IDE представляет программисту шаблон пустой формы, на которой можно размещать различные элементы управления, или объекты.
9191
9292Предоставленный бланк уже является объектом, со своими свойствами, такими как Позиция (Верх и Отступ), размер (Высота и Ширина), цвет, шрифт для текста и т.д.
9393
9494------------------------------------------------------------------------
9595
9696Если на форму поместить кнопку (тип TButton), она будет иметь свой набор свойств, который можно просмотреть в окне Инспектора Объектов.
9797
9898Некоторые свойства кнопки имеют те же имена, что и свойства формы, что является следствием **Наследования** многих свойств из общего класса - предка, указывающего, как свойства определяются и управляются в классе - потомке.
9999
100100Как и для свойств, Инспектор Объектов имеет вкладку, называемую **События**, дающую возможность настроить реакцию объекта на внешние воздействия, такие как щелчок мыши на кнопке (OnClick), или некоторое изменение позиции, размера, или других свойств (OnChange), для того, чтобы приложение выполняло в ответ некоторые действия.
101101
102102Физический образ кнопки на форме, совместно с его свойствами и методами обработки событий считается единой сущностью, или **Объектом** в Pascal.
103103
104104![](/wiki-images/f/f5/ObjectInspector-TButton.png)
105105
106106![](/wiki-images/e/e8/FormWithButton.png)
107107
108108![](/wiki-images/4/4d/Source_FormWithButton1.png%E2%80%8E)
109109
110110## Объектно-ориентированное расширение стандартного Pascal
111111
112112Структура Pascal "Запись" расширена определением
113113
114114### Объект
115115
116116Объект - это специальный тип записи. Запись объекта содержит все поля, объявленные в определении объекта (как и в обычной записи), но в дополнение могут быть объявлены процедуры и функции, как неотъемлемые части этой записи, указывающие на методы, ассоциированные с типом объекта.
117117
118118Например, объект содержит массив вещественных значений, совместно с Методом для вычисления среднего арифметического.
119119
120-`Type`\
121-`  Average = Object`\
122-`    NumVal: Integer;`\
123-`    Values: Array [1..200] of Real;`\
124-`    Function Mean: Real; { calculates the average value of the array }`\
125-`  End;`
120+``` pascal
121+Type
122+ Average = Object
123+ NumVal: Integer;
124+ Values: Array [1..200] of Real;
125+ Function Mean: Real; { calculates the average value of the array }
126+ End;
127+```
126128
127129Объекты могут ”наследовать” поля и методы от ”родительских” объектов. Этим подразумевается, что эти поля и методы могут применяться и в объекте, объявленном ”потомком”.
128130
129131Кроме того, введено понятие видимости: поля, процедуры и функции могут объявляться публичными, защищенными и частными. По умолчанию, поля и методы - публичные, и могут экспортироваться из текущего модуля. Защищенные поля или методы пригодны только для непосредственных потомков текущего родительского объекта. Частные поля или методы доступны только в текущем модуле: их область действия ограничена текущим модулем.
130132
131133### Класс
132134
133135Объекты применяются самостоятельно во FreePascal и Lazarus не очень часто; однако классы получили широкое применение. Класс определяется почти так же, как объект, но является не самим объектом, а указателем на него. Технически это означает, что Класс располагается в теле программы, тогда как Объект располагается в стеке.
134136
135137Приведем пример обычного объявления Класса:
136138
137-`{-----------------------------------------}`\
138-`{example of Class declaration from the LCL}`\
139-`{-----------------------------------------}`\
140-` TPen = class(TFPCustomPen)`\
141-` private`\
142-`   FColor: TColor;`\
143-`   FPenHandleCached: boolean;`\
144-`   FReference: TWSPenReference;`\
145-`   procedure FreeReference;`\
146-`   function GetHandle: HPEN;`\
147-`   function GetReference: TWSPenReference;`\
148-`   procedure ReferenceNeeded;`\
149-`   procedure SetHandle(const Value: HPEN);`\
150-` protected`\
151-`   procedure DoAllocateResources; override;`\
152-`   procedure DoDeAllocateResources; override;`\
153-`   procedure DoCopyProps(From: TFPCanvasHelper); override;`\
154-`   procedure SetColor`\
155-`        (const NewColor: TColor; const NewFPColor: TFPColor); virtual;`\
156-`   procedure SetFPColor(const AValue: TFPColor); override;`\
157-`   procedure SetColor(Value: TColor);`\
158-`   procedure SetMode(Value: TPenMode); override;`\
159-`   procedure SetStyle(Value: TPenStyle); override;`\
160-`   procedure SetWidth(value: Integer); override;`\
161-` public`\
162-`   constructor Create; override;`\
163-`   destructor Destroy; override;`\
164-`   procedure Assign(Source: TPersistent); override;`\
165-`   property Handle: HPEN read GetHandle write SetHandle; deprecated;`\
166-`   property Reference: TWSPenReference read GetReference;`\
167-` published`\
168-`   property Color: TColor read FColor write SetColor default clBlack;`\
169-`   property Mode default pmCopy;`\
170-`   property Style default psSolid;`\
171-`   property Width default 1;`\
172-` end;`
139+``` pascal
140+{-----------------------------------------}
141+{example of Class declaration from the LCL}
142+{-----------------------------------------}
143+ TPen = class(TFPCustomPen)
144+ private
145+ FColor: TColor;
146+ FPenHandleCached: boolean;
147+ FReference: TWSPenReference;
148+ procedure FreeReference;
149+ function GetHandle: HPEN;
150+ function GetReference: TWSPenReference;
151+ procedure ReferenceNeeded;
152+ procedure SetHandle(const Value: HPEN);
153+ protected
154+ procedure DoAllocateResources; override;
155+ procedure DoDeAllocateResources; override;
156+ procedure DoCopyProps(From: TFPCanvasHelper); override;
157+ procedure SetColor
158+ (const NewColor: TColor; const NewFPColor: TFPColor); virtual;
159+ procedure SetFPColor(const AValue: TFPColor); override;
160+ procedure SetColor(Value: TColor);
161+ procedure SetMode(Value: TPenMode); override;
162+ procedure SetStyle(Value: TPenStyle); override;
163+ procedure SetWidth(value: Integer); override;
164+ public
165+ constructor Create; override;
166+ destructor Destroy; override;
167+ procedure Assign(Source: TPersistent); override;
168+ property Handle: HPEN read GetHandle write SetHandle; deprecated;
169+ property Reference: TWSPenReference read GetReference;
170+ published
171+ property Color: TColor read FColor write SetColor default clBlack;
172+ property Mode default pmCopy;
173+ property Style default psSolid;
174+ property Width default 1;
175+ end;
176+```
173177
174178Этот класс определен как экземпляр другого **родительского** или класса **предка** (*TFPCustomPen*) от которого он **наследует** все его свойства и методы. Он имеет собственные поля, сгруппированные как
175179
176180- **private(частные)** - это означает, что элементы, определенные здесь, доступны или видимы другим классам или процедурам/функциям, определенным только внутри данного программного модуля (Этот пример - из *Graphics*, так что любой из других классов -*TBitMap*, *TPicture* и т.д. этого же модуля может их использовать). Это как локальные переменные (напр. *FColor*, *FPenHandleCached*) или локально используемые методы (*GetHandle*, *SetHandle*), но можно использовать или ссылаться на элементы, объявленные в секциях **protected** или **public**.
177181- **protected(защищенные)** - это означает, что элементы, определенные здесь, доступны или видимы только классам, произведенным из этого класса - **предка**, и унаследовали его свойства и методы.
178182- **public** - это означает, что элементы, определенные здесь, доступны любому программному модулю, включившему текущий модуль в свою секцию [[Glossary|Uses]]
179183- **published** - подобна секции **public**, но компилятор генерирует типовую информацию, требуемую для автоматического подключения этих классов. Часто список published элементов появляется Инспекторе объектов Lazarus; если список **published** отсутствует, в Инспекторе объектов обычно появляются поля **public**.
180184
181185### Методы
182186
183187Метод подобен обычной процедуре или функции, но может иметь некие дополнительные **директивы**.
184188
185189Некоторые методы, определенные выше, помечены директивой **virtual (виртуальный)**; другие - **override (аннулируемый)**.
186190
187191- **virtual** означает, что тип, или фактический экземпляр метода не известен во время компиляции, но выбирается во время выполнения в зависимости от того, какая подпрограмма вызывает метод. Он может рассматриваться как заполнитель в определении класса.
188192- **override** означает, что во время выполнения локально данное определение может заменить определение, унаследованное от класса - предка, особенно, если оно было **virtual**. Если необходимо применить метод, определенный в родительском классе, его нужно вызывать специфично, с оговоркой **inherited**.
189193
190194Методы без директив virtual или override являются **статическими** (обычными для Pascal). Методы, имеющие такие директивы, считаются **динамическими**.
191195
192196Методы имеют специальные возможности:
193197
194198- **create** - **constructor** для класса, заботящегося о распределении памяти, сбора всей необходимой информации и настройки/инициализации различных свойств.
195199- **destroy** - **destructor** для класса, упорядоченно удаляющего все составляющие класса из системы, и возвращающего все свои ресурсы системе для повторного использования.
196200
197201### Свойства
198202
199203Свойства аналогичны простым полям в "Записи" стандартного Pascal, но могут иметь указатели **чтение** и/или **запись**.
200204
201205- Указатель **чтение** является полем или функцией, возвращающим результат корректного типа для свойства. В вышеприведенном примере, свойство *Color* имеет указатель чтения *FColor*, являющийся локальной переменной, которая содержит используемое значение. Если свойство имеет указатель **read** и не имеет **write**, оно служит только для чтения.
202206- Указатель **запись** является полем или процедурой, устанавливающей значение свойства в определенное место. В вышеприведенном примере, *Color* имеет указатель записи *SetColor*, являющийся процедурой (определено в секции **protected**) для записи значения цвета в указанное место. Если свойство имеет указатель **write** и не имеет **read**, оно служит только для записи.
203207- **default** - имеется возможность установки значения свойства по умолчанию **default**. Например, *Color* имеет значение по умолчанию *clBlack*, или черный, во время создания. Впоследствии ему можно присвоить другое значение оператором присвоения в программе или через Инспектор объектов.
204208
205209## Дальнейшая информация
206210
207211Здесь даны только самые начала темы. Для дальнейшего изучения настоятельно рекомендуется читать руководство [FreePascal](http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html), в особенности главы 5 (**Объекты**) и 6 (**Классы**)
208212
209213--Kirkpatc 11:04, 20 July 2008 (CEST)
210214
211215------------------------------------------------------------------------
212216
213217[[Console Mode Pascal/ru]]
214218
215219---
216220*From the Free Pascal wiki, page "Object Oriented Programming with Free Pascal and Lazarus/ru", as it stood on 2015-06-19 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history