Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ракитин Р.Ю. ООП в Turbo Delphi

.PDF
Скачиваний:
55
Добавлен:
18.03.2015
Размер:
3.59 Mб
Скачать

31

Рассмотрим базовые классы Delphi.

Класс TObject

Класс TObject является родоначальником всей иерархии использующихся в Delphi классов VCL. Он реализует функции, которые обязательно будет выполнять любой объект, который может быть создан в среде разработки.

В первую очередь это создание экземпляра объекта и его уничтожение. Любой объект выполняет эти две операции в обязательном порядке.

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

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

constructor Create;

В конструкторах потомков это объявление может перекрываться, но при

необходимости вызвать конструктор предка используется оператор inherited:

constructor TSomeObject.Create; begin

inherited Create; //вызываем родительский конструктор

...

end;

Для уничтожения экземпляра объекта в классе TObject предназначены методы Destroy и Free:

destructor Destroy; virtual; procedure Free;

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

constructor TSomeObject.Destroy; begin

...

//вызываем родительский деструктор inherited Destroy;

end;

При уничтожении объектов рекомендуется вместо деструктора использовать метод Free, который просто вызывает деструктор, но перед этим проверяет, чтобы указатель на экземпляр объекта был не пустым (не был равен

32

Nil). Если объект является владельцем других объектов (например, форма владеет всеми размешенными на ней компонентами), то метод Free автоматически вызовет методы Free для всех объектов. Поэтому при закрытии

формы разработчик избавлен от необходимости заботиться об уничтожении всех компонентов.

Как известно, программирование для Windows основано на событиях.

Каждое приложение и программный объект должны уметь реагировать на сообщение о событиях и в свою очередь рассылать сообщения.

Метод

procedure Dispatch(var Message); virtual;

осуществляет обработку сообщений, поступающих к объекту. Он определяет,

сможет ли объект обработать сообщение при помощи собственных обработчиков событий.

В целом класс TObject может служить для создания на его основе некоторых простых классов для использования в приложениях.

Класс TPersistent

В переводе с английского «persistent» означает «устойчивый», «постоянный». «Постоянство» данного класса заключается в виртуальном

методе

procedure Assign(Source: TPersistent);

Этот важнейший метод осуществляет копирование содержимого одного объекта (source) в другой (Self, т. е. в объект, вызвавший метод Assign). При этом объект-получатель остается самим собой, чего нельзя достигнуть, используя простое присваивание переменных объектного типа:

FirstObject := SecondObject;

В этом случае указатель на одну область адресного пространства, содержащую экземпляр класса (объект), замещается указателем на другую область адресного пространства, содержащую другой объект.

Метод Assign позволяет продублировать объект, присвоить одному объекту значения всех свойств другого. При этом объекты не всегда должны быть одного и того же класса; более того они не обязательно должны находиться в отношениях «родитель потомок». Данный метод тем и хорош, что позволяет полиморфное присвоение. Например, конструкция

Clipboard.Assign(Picture);

позволяет скопировать содержимое картинки Picture в папку обмена Windows (объект Clipboard). Какова здесь логика? Известно, что в папку обмена можно поместить растровую картинку, текст, метафайл, мультимедийные данные и т.п. Метод Assign класса TClipboard переписан таким образом, чтобы обеспечить присвоение (т. е. реальное перемещение в папку обмена) всех этих данных.

33

procedure TClipboard.Assign (Source: TPersistent); begin

if Source is TPicture

then AssignPicture (TPicture (Source)) else

if Source is TGraphic

then AssignGraphic(TGraphic(Source)) else inherited Assign(Source);

end;

Для обеспечения взаимодействия потомков класса TPersistent предназначен метод

function GetNamePath: string; dynamic;

Он возвращает имя объекта для передачи его в Инспектор объектов.

Класс TPersistent никогда не используется напрямую, от него порождаются потомки, которые должны уметь передавать другим объектам значения своих свойств, но не являться при этом компонентами.

Класс TComponent

Класс TComponent является прародителем всех компонентов VCL Delphi. Он инкапсулирует наиболее общие свойства и методы компонентов, включая:

возможность добавлять компонент в палитру компонентов и работать с ним при визуальном проектировании;

способность быть владельцем других компонентов или управляться ими;

возможности обмена с потоками и файлами;

возможность служить оболочкой элементов ActiveX и других объектов.

В классе TComponent появляются первые свойства, которые отображаются в Инспекторе объектов. Это свойство

property Name: TComponentName;

Оно содержит имя экземпляра компонента, которое используется для идентификации компонента в приложении. Тип TComponentName представляет собой обычную строку.

Свойство

Tag: Longint;

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

Для компонентов существует своя иерархия, поэтому в классе введен механизм учета и управления компонентами, для которых данный компонент является владельцем. Особенность потомков класса TComponent заключается в

34

том, что объекты-компоненты могут находиться между собой в отношении

«основной вспомогательный».

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

(TApplication).

Реализация отношения «основной вспомогательный» в классе TComponent осуществляется с использованием следующих свойств:

Components [Index: integer]: TComponent; содержит индексированный список указателей всех компонентов, для которых данный компонент является владельцем (owner);

ComponentCount: Integer; число подчиненных компонентов;

Owner: TComponent; указывается, какой компонент является владельцем

данного

Componentlndex: integer; индекс данного компонента в списке

владельца

От класса TComponent наследуются все компоненты приложения, в том числе и само приложение (класс TApplication). Класс TComponent может

использоваться в качестве предка для создания собственных невизуальных компонентов.

Класс TControl

Особое место среди потомков TComponent занимает класс TControl, от которого наследуются все элементы управления, размещаемые в окне формы. Соответственно, этот класс содержит свойства, определяющие расположение элементов управления относительно формы на экране. Каждый визуальный компонент, произошедший от TControl, наделяется основными признаками элемента управления. Благодаря этому каждый визуальный компонент умеет работать с GUI (Graphic User Interface графический интерфейс пользователя ОС) и отображать себя на экране.

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

property Top: Integer; property Left: Integer;

и два опубликованных свойства для определения размеров:

property Height: Integer; property Width: Integer;

35

Значения свойств задаются в пикселях. Для определения местоположения

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

Свойство

property ClientOrigin: TPoint;

содержит координаты левого верхнего угла элемента управления в системе координат экрана. Координаты любой точки в программе определяются относительно родительского компонента, для пересчета их в экранные используется метод:

function ClientToScreen(const Point: TPoint): TPoint;

и наоборот:

function ScreenToClient(const Point: TPoint): TPoint;

Параметры рабочей области компонента определяются следующими свойствами:

property ClientHeight: Integer; – определяет высоту рабочей области в пикселях.

property ClientWidth: Integer; – определяет ширину рабочей области в пикселях.

property ClientRect: TRect; – значение которого есть не что иное,

как (0, 0, ClientWidth, ClientHeight).

Свойство

property AutoSize: Boolean;

обеспечивает изменение размеров компонента в соответствии с размерами его содержимого (текста, изображения, списка, иерархического дерева и т. д.).

Для определения цвета компонента используется свойство property Color: TColor;

Более подробно тип TColor будет рассмотрен в приложении.

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

property Cursor: TCursor;

Для текста компонента шрифт обычно задается свойством

property Font: TFont;

36

где сложный класс TFont задает все характеристики шрифта. Подробнее он будет рассмотрен позднее.

Элемент управления можно сделать видимым или невидимым. Для этого

применяется свойство

property Visible: Boolean;

Этих же результатов можно достичь методами Show (компонент видим) и Hide (компонент невидим).

Опубликованное свойство property Hint: string;

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

Для управления ярлыком используется свойство property ShowHint: Boolean;

При значении True ярлык начинает работать, при значении False ярлык выключается.

Для каждого элемента управления можно создать собственное всплывающее меню. Ссылка на экземпляр класса TPopupMenu, инкапсулирующего такое меню, хранится в свойстве

property PopupMenu: TPopupMenu;

Доступность элемента управления в целом определяется свойством property Enabled: Boolean;

При значении True элемент управления полностью работоспособен. При значении False элемент управления неактивен и отображается серым цветом.

Класс TControl определяет методы, обрабатывающие сообщения мыши и обеспечивающие генерацию соответствующих событий (обычное, двойное нажатие, движение с нажатыми клавишами и т.п.).

Класс TWinControl

Класс TWinControl оконные элементы наследуется от класса TControl. Соответственно, класс TWinControl включает методы обработки сообщений клавиатуры, которые формируют события клавиатуры.

Класс TWinControl является базовым абстрактным классом для всех оконных компонентов Delphi, то есть для компонентов, которые:

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

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

имеют дескрипторы окна.

37

Класс TWinControl устанавливает между оконными элементами управления отношение «старший младший». Это отношение определяет подчиненность изображений оконных элементов управления на экране. Например, если форма становится невидимой, то невидимыми становятся все ее младшие элементы управления (метки, кнопки и т.д.).

То же отношение позволяет управлять единообразием изображения старших и младших компонент (шрифт, цвет и т.п.). Используя отношение «старший младший», можно определить однотипное поведение оконных элементов управления.

Для определения отношения «старший младший» класс TWinControl включает следующие свойства:

Parent: TWinControl; – содержит указатель на старший элемент управления;

ControlIndex: integer; – содержит номер текущего элемента управления в массиве Controls (начиная с 0) старшего элемента управления,

определяющий порядок передачи фокуса ввода среди младших элементов управления;

Controls [Index: Integer]: TControl; - свойство-массив, содержит

указатели на все младшие элементы управления по отношению с текущему старшему;

ControlCount: Integer; содержит количество младших элементов управления для текущего старшего элемента.

Для управления единообразием изображений используются следующие свойства:

ParentColor: Boolean – определяет, будут ли использоваться цвета родительского элемента или элемент будет сам устанавливать цвет;

ParentFont: Boolean определяет, будут ли использоваться параметры

шрифта родительского элемента или должны использоваться собственные установки;

ParentShowHint: Boolean – определяет, будет ли использоваться свойство ShowHint родительского элемента или собственное.

Кроме этого, существуют специальные методы, позволяющие управлять процессом передачи фокуса ввода:

procedure SetFocus; virtual; позволяет установить фокус ввода на нужный оконный элемент управления;

Enabled: Boolean определяет, может ли данный элемент принимать фокус ввода;

TabStop: Boolean; позволяет отключить возможность объекта реагировать на нажатие клавиши Tab;

38

Класс TGraphicControl

Класс TGraphicControl предназначен для создания на его основе визуальных компонентов, не получающих фокус в процессе выполнения приложения. Так как непосредственным предком класса является класс TControl, потомки TGraphicControl умеют реагировать на управляющие воздействия мышью.

Наглядный пример элемента управления, которому не нужно получать фокус, – это компонент TLabel, предназначенный для отображения текста, или компонент TImage, предназначенный для визуализации изображений.

Для визуализации элементов управления на основе этого класса используется канва, инкапсулированная в классе TCanvas.

Доступ к канве осуществляется через свойство property Canvas: TCanvas;

Отрисовка элемента управления осуществляется методом procedure PaintWindow(DC: HDC); override;

после получения сообщения WM_PAINT.

39

Глава 3. Создание первого проекта в Delphi

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

1.Файлы проекта Delphi

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

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

Когда вы проектируете приложение, Delphi создает следующие основные файлы:

Файл проекта (.dpr) – это текстовый файл, содержащий операторы инициализации и запуска программы на выполнение;

Файл проекта (.bdsproj) – этот текстовый файл содержит служебную информацию о проекте и его версии;

Файл группы проектов (.bdsgroup) – это текстовый файл, хранящий информацию о проектах, входящих в группу;

Файл модуля (.pas) – каждой создаваемой форме и фрейму соответствует текстовый файл модуля, используемый для хранения кода. Можно создавать модули, не связанные с формами. Многие из функций и процедур Delphi хранятся в модулях;

Файл формы (.dfm или .nfm) – это текстовый файл, который создается Delphi для хранения информации о формах и фреймах. Каждому файлу формы соответствует файл модуля (.pas);

Файл ресурсов (.res) – этот бинарный файл содержит используемую проектом пиктограмму и прочие ресурсы;

Файл конфигурации проекта (.cfg) – в этом файле хранятся установки проекта, в частности, используемые директивы компилятора;

Файл кэширования (.identcache) – файл хранит информацию, необходимую для регистрации в кэше сборок;

Файлы резервных копий (~dp,.~df,.~pa) – это файлы, в которых осуществляется копирование файлов проекта, формы и модуля. Если вы что-то безнадежно испортили в своем проекте, то можно изменить расширения этих файлов и, таким образом, вернуться к предыдущему работоспособному варианту.

40

Следующая группа файлов создается компилятором:

Исполняемый файл (.ехе) это исполняемый файл приложения. Он явля- ется автономным исполняемым файлом, для которого больше ничего не требуется, если только не используются библиотеки, содержащиеся в DLL, OCX и т.д.;

Объектный файл модуля (.dcu или .dcuit) это откомпилированный файл модуля (.pas), который компонуется в окончательный исполняемый файл;

Динамически присоединяемая библиотека (.dll) этот файл создается в случае, если проектируется собственная DLL;

Файл отладочной информации (.pdb) этот бинарный файл содержит информацию для отладчика и информацию о том, какие файлы должны компилироваться.

Как видно, любой проект содержит большое количество файлов, многие из которых создаются средой Delphi автоматически.

+Обязательно сохраняйте ваши проекты в отдельных папках.

2.Правила присвоения идентификаторов в Delphi

Идентификатор (identifier) одно из самых важных понятий языка

программирования. Фактически идентификатор это уникальное имя, определяющее в программе переменную, объект и т.д. Необходимо чётко усвоить правила создания имён идентификаторов. При их несоблюдении, то есть ошибочном вводе имени, программа просто не скомпилируется.

1. Имя идентификатора может состоять из латинских букв, причём как верхнего, так и нижнего регистра (A, B, ..., Z; a, b, ..., z), цифр (0, 1, ..., 9) и знака подчёркивания ( _ ). Никакие другие символы не могут быть использованы.

2.Первый символ в имени не должен быть цифрой, то есть он может быть латинской буквой или знаком подчёркивания. Все последующие символы могут быть теми, которые указаны в п.1.

3.Максимальная длина имени 255 символов. Следует отметить, что это ограничение формально. Вы можете задать имя и из большего числа символов, но компилятор воспримет только первые 255.

4.Язык Pascal нечувствителен к регистру символов и регистру имён идентификаторов в частности, то есть и ABC, и abc, и даже aBc (это абсолютно одно и то же).

3.Зарезервированные слова и директивы

Зарезервированные слова слова языка, которые играют служебную роль. Использовать часть из этих слов в качестве имён, то есть идентификаторов, запрещено. В редакторе кода эти слова отображаются цветом, отличным от