Ракитин Р.Ю. ООП в Turbo Delphi
.PDF41
цвета основного кода. Ниже представлен перечень всех зарезервированных слов Object Pascal:
and |
function |
property |
array |
goto |
raiseas |
if |
record |
asm |
implementation |
repeat |
begin |
in |
resourcestring |
case |
inherited |
set |
class |
initialization |
shl |
const |
inline |
shr |
constructor |
interface |
string |
destructor |
is |
then |
dispinterface |
label |
threadvar |
div |
library |
to |
do |
mod |
try |
downto |
nil |
type |
else |
not |
unit |
end |
object |
until |
except |
of |
uses |
exports |
or |
var |
file |
out |
while |
finalization |
packed |
with |
finally |
procedure |
xor |
for |
program |
Также не рекомендуется использовать в качестве идентификаторов стандартные директивы:
absolute |
implements |
published |
abstract |
index |
read |
assembler |
message |
readonly |
automated |
name |
register |
cdecl |
near |
reintroduce |
contains |
nodefault |
requires |
default |
overload |
resident |
dispid |
override |
safecall |
dynamic |
package |
stdcoll |
export |
pascal |
stored |
external |
private |
virtual |
far |
protected |
write |
forward |
public |
writeonly |
|
4.Оформление исходных текстов на Delphi
Ни для кого не является секретом тот факт, что качество оформления исходных текстов имеет важное значение, хотя, на первый взгляд, не оказывает прямого влияния на качество окончательного программного продукта. На
самом деле четкое следование определенному стилю оформления позволяет значительно снизить усилия, затрачиваемые на создание, отладку и, в особенности сопровождение программы.
Опираясь на стандарты де-факто, установленные компанией Borland/Inprise, можно сформулировать несколько требований к оформлению исходных текстов программы.
Самым главным требованием необходимо считать четкое отражение вложенности операторов в отступах начала строки от левой границы.
Стандартным считается отступ на два символа для каждого следующего вложения:
42
первый уровень второй уровень
третий уровень
Это требование должно выполняться одинаково как для составных (с begin и end), так и для простых операторов:
while Condition do begin
Operator1;
Operator2; end;
for i:=StartValue to EndValue do Action;
В тех случаях, когда длина простого оператора невелика, он может записываться на одной строке с оператором более высокого уровня:
for i:=StartValue to EndValue do Action;
Операторные «скобки» begin и end записываются на уровне порождающего их оператора и не влияют на отступы вложенных операторов. Необходимо четко следить, чтобы парные begin-end находились на одном уровне. Самый простой способ избежать ошибок, связанных с их установкой: устанавливать их одновременно.
При переносе частей длинного простого оператора производится сдвиг переносимых частей на следующий уровень:
begin
SomeVeryVeryVeryVeryLongNameProcedureCall(
FirstVeryVeryVeryVeryLongParameter,
SecondVeryVeryVeryVeryLongParameter,
ThirdVeryVeryVeryVeryLongParameter); end;
begin
SomeString:=String1+String2+String3+String4+String5+
String6+String7+String8+String8+String9+String10; end;
Правила вложенности распространяются также на объявления типов переменных, констант, и вложенных функций, и процедур:
procedure FirstLevel; const
XSize = SomeValue; type
XType = array [-XSize..XSize] of SomeType; var
X: XType;
43
procedure SecondLevel(Value: XType); var
i, j: Integer; begin
SecondLevelRealization; end;
begin
FirstLevelRealization;
SecondLevel(X); end;
Названия разделов объявления классов записываются на том же уровне, что и само объявление:
type
TSomeObject=class
// published - объявления
...
private
// private - объявления
...
protected
// protected - объявления
...
public
// public - объявления
...
end;
Комментарии записываются перед оператором на его уровне:
// комментарий оператора 1 Operator1;
for i:=StartValue to EndValue do
{ комментарий оператора Action } Action;
Короткие комментарии могут записываться в конце строки с операторами:
Inc(X, 2); // увеличиваем значение на 2
Зарезервированные слова пишутся только строчными буквами:
IF ... THEN ... ELSE // неправильно If ... Then ... Else // неправильно if ... then ... else // правильно
Идентификаторы должны начинаться с прописных букв (исключая идентификаторы, начинающиеся с префиксов – в таких идентификаторах префиксы пишутся строчными буквами, а прописной буквой выделяется собственно идентификатор). В том случае, если название идентификатора составлено из нескольких слов, каждое слово выделяется прописной буквой:
44
var
Variable: Integer;
PenColor: TColor; procedure UpdatePageCount;
type
// исключение - использование префиксов
TPageState = (psUnknown,psOpen,psClose);
Не рекомендуется использование бессмысленных идентификаторов:
var
A1, AAA, VAR1: Integer; // не рекомендуется
Частым исключением являются традиционные идентификаторы цикловых переменных: i, j, k и так далее. Но и их использование должно быть сокращено до минимума. Вместо них, где это возможно, должны использоваться осмысленно названные переменные.
Подпрограммы должны отделяться друг от друга пустыми строками и желательно сопровождаться комментарием о назначении данной процедуры или функции.
При выборе идентификаторов необходимо придерживаться основных правил наименования, которые гласят, что к идентификатору типа должна добавляться буква T, имена private-полей должны иметь впереди F, а имена методов доступа должны начинаться на Set и Get:
type
TExample = class private
FField: TFieldType;
function GetField: TFieldType;
procedure SetFieldType(Value: TFieldType); published
property Field: TFieldType read GetField write SetField;
end;
var
Example: TExample;
В так называемых enumerated-типах, как правило, используются константы, начинающиеся с двух- или трехбуквенных префиксов, отражающих в сокращенном виде название типа:
type
TSomeNameType = (snFirst,snSecond,snThird);
Константы WinAPI пишутся прописными буквами, что, во-первых, выделяет их в тексте, и, во-вторых, соответствует их написанию в справочной системе и экспортирующих модулях:
ShowWindow(Handle,SW_MAXIMIZE);
45
В начале каждого файла рекомендуется помещать информационный комментарий. Нужно составить шаблон этого комментария, сохранить в PAS- файле и пользоваться операцией загрузки блока в Delphi IDE для его установки в начало каждого файла. Такие комментарии обычно содержат информацию о модуле и авторских правах:
{ |
Модуль SomeModule |
} |
{ |
Библиотека SomeLibrary |
} |
{ |
Copyright (C) 2009 SomeCompany |
} |
{ |
www.somecompany.com |
} |
{ |
support@somecompany.com |
} |
При создании проектов в визуальной среде Delphi программисту приходится работать со множеством объектов: Форм, Кнопок, Переключателей и др. При создании нового объекта Delphi автоматически присваивает ему имя, идентифицирующее его в программе. При этом имя компонента образовано из типа компонента и его порядкового номера, например Edit12. Такой
идентификатор является не наглядным и усложняет разработку больших проектов. Поэтому рекомендуется изменять стандартные имена на более понятные. При этом следуют следовать правилу – имя объекта составляется из двух частей: первая сокращение от типа объекта (Form – F, Edit – Ed, Label – Lb, Button – But и другие), вторая краткая характеристика объекта (например «Кнопка отмены» – ButCancel, «Информационная Панель»
–PanInfo и т.д.).
+Применение таких простых правил делает программу понятной и более читаемой.
5.Приложение (класс TApplication)
На основе данного класса можно обрабатывать системные сообщения Windows, предназначенные для приложения, организовать оперативные подсказки и выполнять специфические действия, зависящие от операционной системы.
Каждая программа, создаваемая в Delphi, имеет доступ к глобальной переменной Application класса TApplication. К ней следует обращаться, когда необходимо воспользоваться возможностями этого класса.
Основные свойства:
Active – имеет значение true, если приложение активно (имеет фокус); ExeName – полное имя файла программы вместе с путем поиска; Handle – внутренний идентификатор программы в системе Windows; Hint – текст всплывающей подсказки, принятый по умолчанию; HintColor –цвет окна всплывающей подсказки;
HintHidePause – временной интервал в миллисекундах, по истечении которого всплывающая подсказка будет убрана;
46
HintPause, HintShortPause – временной интервал в миллисекундах, по истечении которого всплывающая подсказка появляется на экране. Свойство HintShortPause определяет этот интервал в случаи, когда уже отображается другая подсказка;
HintShortCuts – если значение True, то в всплывающей подсказке будет отображаться информация о «горячей клавише»;
Icon – значок, который будет использоваться системой Windows для идентификации данного приложения;
MainForm – данное свойство имеет тип TForm и определяет главную форму программы;
Terminated – имеет значение true, если приложение получило сообщение WM_QUIT, означающее, что приложение должно закончить работу;
Title – заголовок приложения, строка, которая отображается на кнопке
Панели задач.
Основные методы:
procedure ActivateHint(CursorPos: TPoint); – отображает всплывающую подсказку в заданной точке экрана;
procedure BringToFront; – перемещает последнее из активных окон на передний план экрана;
procedure CancelHint; – убирает всплывающую подсказку;
procedure CreateForm(InstanceClass: TComponentClass;
var Reference); –запрашивает память у операционной системы и создает там объект Reference, являющийся экземпляром класса InstanceClass;
procedure HandleMessage; – прерывает работу программы для обработки очередного системного сообщения Windows, которое хранится в очереди сообщений. Данный метод полезен, когда приложение выполняет длительные вычисления и требует периодической проверки: не поступила ли от ОС какая-либо команда;
function MessageBox (const Text, Caption: Pchar;
Flags: longint): integer; – показывает стандартное диалоговое окно, содержащее кнопки, определяемые параметром Flags;
procedure Minimize; – свертывает все окна приложения;
procedure ProcessMessages; – работает как и метод HandleMessage, но обрабатывает не одно, а все системные сообщения из очереди Windows;
procedure Restore; – восстанавливает все свернутые окна программы до нормального размера;
procedure Run; – запускает приложение;
47
procedure ShowException(E: Exception); – выводит диалоговое окно с сообщением, описывающим исключительную ситуацию (параметр E);
procedure Terminate; – завершает работу приложения.
Рассмотрим пример использования класса TApplication. Пусть выполняется длинный цикл с большим объемом вычислений.
for i:= 1 to 100000 do begin
...
//счёт
...
end;
Прямой подсчет не совсем корректен, потому что цикл монопольно захватывает ресурсы процессора. Чтобы позволить пользователю переключиться на другую программу, а системе Windows оптимально распределить нагрузку, в цикл надо добавить команду обработки очереди системных сообщений.
for i:= 1 to 100000 do begin
...
//счёт
Application.ProcessMessage; end;
Если в процессе работы программы необходимо создать новую форму с идентификатором FormNew, некоторого объявленного класса TFormNew, то
нужно вызвать метод
Application.CreateForm(TFormNew, FormNew);
6.Форма и её свойства
Форма – это заготовка для будущего окна приложения и, в то же время, контейнер для всех видов компонентов (визуальных, невизуальных и диалоговых), добавляемых в программу во время визуального построения.
Любое приложение, созданное в среде Delphi, имеет одну основную форму. Рассмотрим основные свойства объекта TForm. Большинство из рассмотренных свойств характерны для любого визуального объекта в Delphi.
ActiveControl – указывает на компонент, который должен быть активным по умолчанию;
Align – выравнивание компонента. Любой компонент может быть выровнен по одной из сторон родительского компонента. Этому свойству можно присвоить следующие значения: alNone, alBottom, alLeft, alRight, alTop.
Компоненты выравниваются относительно формы, а форма выравнивается относительно окна;
48
AlphaBlend – тип свойства логический, который означает, имеет ли форма прозрачность;
AutoScroll – тип свойства логический, который означает, будет ли форма автоматически производить прокрутка (скроллинг) или нет;
AutoSize – тип свойства логический, который означает, должны ли компоненты на форме автоматически корректировать размеры;
BorderIcons – свойство, определяющее какие кнопки должны присутствовать у окна. Это свойство раскрывающееся. Если щелкнуть по квадрату слева от имени свойства, то раскроется список из четырёх свойств: biSystemMenu – показать меню (иконка слева в строке заголовка окна) и другие кнопки заголовка окна;
biMinimize – кнопка минимизации окна; biMaximize – кнопка максимизации окна.; biHelp – кнопка помощи;
BorderStyle – свойство формы. Отвечает за вид оборки окна; Caption – это строковое свойство, которое отвечает за заголовок окна;
Constraints – в этом свойстве содержатся максимальные значения размеров окна;
Cursor – это свойство отвечает за курсор, который будет отображаться при наведении мышкой на форму/компонент;
Enabled – тип свойства – логический. Означает доступность компонента. Если это свойство равно True, то пользователь может работать с этим компонентом, иначе компонент недоступен и окрашен серым цветом;
Font – шрифт используемый при выводе текста на форме. Если ты дважды щёлкнешь по этой строке, то появится стандартное окно Windows выбора шрифта;
FormStyle – стиль формы. Здесь тебе доступны для выбора следующие
варианты
fsNormal – нормальное окно;
fsMDIForm – окно является родительским для MDI окон. MDI означает мультидокументные окна, которые могут находится и перемещаться только внутри основного окна. fsMDIForm – создаёт главное окно; fsMDIChild – окно является дочерним MDI окном. fsMDIChild создаёт дочернее, то есть то окно, которое будет внутри главного. Главное окно не может быть данного типа;
fsStayOnTop – окно с этим параметром будет находиться всегда поверх остальных;
Height – тип свойства – целое число, высота окна;
Icon – иконка отображающаяся в заголовке окна. Если дважды щёлкнуть по этому свойству, то появится окно загрузки иконки;
Menu – меню, которое используется в главном окне;
Position – Позиция окна при старте приложения. Доступны следующие варианты:
49
poDefault – Windows сам будет решать, где расположить окно и какие будут его размеры;
poDefaultPosOnly – Windows сам будет решать, где расположить окно, а размеры его будут такими, какие установит программист в свойствах; poDefaultSizeOnly – Windows будет решать только какими будут размеры окна, а позиция будет такая, какую программист укажет в свойствах; poDesigned – и размер, и позиция будут такими, какими программист укажешь в свойствах;
poDesktopCenter – окно будет располагаться по центру рабочего стола; poMainFormCenter – окно будет располагаться по центру основной формы; poOwnerFormCenter – окно будет располагаться по центру основного окна, которое вызвало данное;
poScreenCenter – окно будет располагаться по центру экрана;
Visible – тип свойства логический. Если оно равно True, то форма/компонент видимая, иначе форма/компонент не видима;
Width – тип свойства – целое число. Ширина окна;
WindowState – состояние окна после запуска. Доступны следующие параметры:
wsNormal – окно показывается в нормальном состоянии; wsMaximized – окно показывается максимизированным; wsMinimized – окно показывается минимизированным.
Практическое задание.
1.Создание проекта Delphi.
Запустим Delphi, откроется новый проект, состоящий из Формы (Form), на которую будем наносить объекты (в Проектировщике форм) и окно Программного кода (Unit), куда будем записывать программный код. Если заготовка проекта не создалась автоматически, то сделаем это, выбрав File → New → VCL Forms Application – Delphi for Win32 (Файл → Создать → Приложение).
В окне программного кода автоматически будет создан следующий код: unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm) private
{Private declarations } public
{Public declarations }
end;
50
var
Form1: TForm1;
implementation
{$R *.dfm} end.
В интерфейсной части Interface выполняется подключение базовых модулей (раздел uses), затем объявляется тип TForm1, содержащий описание формы, и декларируется одна переменная этого типа (раздел var). В разделе type создан новый класс TForm1, наследующий характеристики своего родителя TForm. Таким образом, созданная форма Form1 представлена в программе классом TForm1, который не имеет новых полей и методов, так как форма пуста. В дальнейшем члены класса TForm1 будут добавляться по мере необходимости как автоматически (при размещении их на форме в Проектировщике форм), так и вручную. Более подробно о структуре модулей смотрите в Главе 8.
Директива {$R *.dfm}, описанная в разделе реализации связывает модуль с описанием соответствующей ему формы. В файле DFM, как говорилось ранее, содержится информация о свойствах формы и всех её объектов. В случае пустой формы в файле может содержаться следующий код:
object Form1: TForm1 Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 292
ClientWidth = 554 Color = clBtnFace
Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11
Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13
end
Как вы видите, в коде описан объект и перечислены его свойства и значения. Информация в файле автоматически обновляется, по мере
добавления новых объектов и изменении их свойств в Инспекторе объектов
(Object Inspector).
2.Сохранение приложения.
Созданное таким образом приложение является вполне работоспособным. Теперь можем его откомпилировать и запустить, нажав F9. Перед нами