Добавил:
ikot.chulakov@gmail.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по Delphi с готовыми программами / Лабораторная работа №15 Иерархия классов, компоненты.pdf
Скачиваний:
21
Добавлен:
12.07.2020
Размер:
666.72 Кб
Скачать

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Лабораторная работа № 15 Базовые классы библиотеки VCL

Введение

В лабораторной работе рассмотрены базовые классы TControl, TWinControl, TgraphicControl? Также рассмотрены некоторые простейшие элементы управления (TLabel, TEdit, TButton). Перед изучением материала данной лабораторной работы рекомендуется повторить материал 11 лабораторной работы.

Иерархия классов VCL

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

Для реализации компонентного подхода удобно применять идеи объектноориентированного программирования. Библиотека компонентов реализованная в Delphi построена на принципах ООП с применением технологий объектно-ориентированного программирования. В основе библиотеки классов лежит класс TObject – родительский класс для всех классов Object Pascal. В основе библиотеки компонентов лежит класс TComponent – родительский класс для всех компонентов. Таким образом компонент – это класс, наследник класса TComponent. Библиотека компонентов Delphi называется Visual Component Library (VCL) – Визуальная библиотека компонентов.

Все компоненты можно разделить на две группы:

невизуальные компоненты. При разработке такие компоненты выглядят как пиктограмма, при работе программы компонент не виден. Обычно такие компоненты являются наследниками класса TComponent или его потомков. Примерами таких компонентов могут служить компоненты TImageList, TMainMenu, TActionList и др.

визуальные компоненты, обычно это так называемые элементы управления. С помощью элементов управления осуществляется ввод-вывод данных. При разработке интерфейса они выглядят также, как будут выглядеть при работе программы. Все элементы управления являются потомками класса TControl. Примерами таких компонентов могут служить кнопки(TButton), строки ввода(TEdit), и т.п.

Рассмотрим иерархию базовых классов библиотеки VCL

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

TObject

TPersistent

TComponent

TControl

TWinControl TGraphicControl

Рисунок 1

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

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

Класс TPersistent также был рассмотрен ранее, отметим лишь что этот класс обеспечивает взаимодействие класса с файлом формы (dfm) и инспектором объектов. Любой класс являющийся наследником этого класса может записывать свои данные в файл формы.

Класс TComponent

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

Свойство Name определяет имя компонента: property Name: TComponentName;

type TComponentName = String;

Имя компонента строится по тем же правилам, что и имена любых других объектов программирования – констант, переменных, подпрограмм и т. д. Оно представляет собой правильный идентификатор и должно быть уникальным в области своей видимости в программе. Так как компоненты помещаются на форму средой Delphi, каждый компонент автоматически получает создаваемое средой имя, совпадающее с именем своего класса (без начальной буквы T) и дополненное числовым суффиксом: Form1, Label1, Edit2 и т. д.

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

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

Совет: При разработке собственных имен полезно выработать свою систему двухили трехбуквенных префиксов, кодирующих тип компонента. Например, frm – для формы TForm, lb – для метки TLabel, edt – для поля TEdit и т. п. Комбинируя префикс с мнемоническим именем, можно существенно улучшить читабельность программы и усилить контроль за правильным использованием свойств и методов компонента..

Следующее свойство определяет произвольный целочисленный параметр, который не используется Delphi и которым программист может распоряжаться по своему усмотрению:

property Tag: Integer;

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

property Owner: TComponent;

Положение компонента в массиве Сomponents своего владельца определяет свойство: property ComponentIndex: Integer;

Сам массив содержит список всех компонентов, которыми владеет данный компонент, и определяется следующим свойством:

property Components[Index: Integer]: TComponent;

Количество зарегистрированных в списке компонентов возвращает свойство: property ComponentCount: Integer;

Конструктор TComponent.Create имеет единственный параметр обращения в котором компоненту передается ссылка на его владельца:

constructor Create(AOwner: TComponent);

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

Ниже приведены некоторые свойства класса TComponent

Таблица 1 – Некоторые свойства класса TComponent

Свойство

property Name:TComponentName

property Tag:Integer

property Owner:TComponent;

property ComponentIndex:Integer;

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Свойство

property Components[index:Integer]:TComponent

property ComponentCount:Integer

В таблице 2 приведены некоторые наиболее важные методы класса TComponent.

Таблица 2 – Некоторые методы класса TComponent

Метод

Описание

 

 

procedure DestroyComponents;

Вызывает поочередно деструкторы всех

function FindComponent(const Aname: String):

компонентов из списка Components и

Отыскивает в списке компонент с именем

TComponent;

AName и возвращает ссылку на него

procedure InsertComponent (AComponent:

Вставляет компонент AComponent в конец

TComponent);

списка Components

procedure RemoveComponent (AComponent:

Удаляет компонент AComponent из списка

TComponent);

 

constructor Create(AOwner: TComponent)

Создает компонент, вставляет ссылку на

 

вновь созданный компонент в список

 

Components компонента AOwner.

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

Класс TControl

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

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

Положение и размеры компонента определяются четырьмя его свойствами (в пикселах):

Высота

property Height: Integer;

Положение левой кромки property Left: Integer;

Положение верхней кромки property Top: Integer;

Ширина

property Width: Integer;

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Для всех компонентов, кроме форм, эти свойства задаются в координатах клиентской части родительского компонента. Для формы – в координатах экрана. Клиентская часть компонента — это внутренняя его область за исключением заголовка, рамки и меню (рисунок 2). Свойства обычно определяются на стадии конструирования формы, но они доступны также и на этапе выполнения программы.

Заголовок окна

Рамка

 

Клиентская область

 

 

 

Рисунок 3 –

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

Top

 

 

Left

 

 

 

 

 

 

 

 

Height

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Y

 

Width

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 2

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

type TPoint = record

X:Longlnt;

Y:Longlnt; end;

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

property BoundsRect: TRect;

TRect = record case Integer of

0:(Left, Top, Right, Bottom: Integer);

1:(TopLeft, BottomRight: TPoint); end;

Внекоторых случаях бывает необходимо пересчитать относительные координаты точки внутри клиентской части в абсолютные координаты экрана и наоборот. Эта задача решается двумя методами TControl:

function ClientToScreen(const Point: TPoint): TPoint; function ScreenToClient (const Point: TPoint): TPoint;

Важную роль играет свойство Align, определяющее положение компонента относительно границ своего родителя:

type TAlign = (alNone, alTop, alBottom, alLeft, alRight, alClient); property Align: TAlign;

Если это свойство не равно alNone, компонент прижимается к верхней (alTop), нижней (alBottom), левой (alLeft) или правой (alRight) границе своего родителя. При этом размеры компонента по соседним с границей измерениям игнорируются, и компонент "растекается" по границе. Например, если Align=alTop, значения свойств Left и Width компонента игнорируются, и его прямоугольник будет занимать всю верхнюю часть клиентской области родителя высотой Height пикселов; если Align=alLeft, свойства Тор и Height игнорируются и прямоугольник занимает левую часть родителя шириной Width пикселов и т. д. Если несколько компонентов имеют одинаковое выравнивание, они последовательно прижимаются друг к другу в порядке их перечисления в свойстве Controls: первый прижимается к границе родителя, второй – к границе первого и т. д. Вся не заполненная другими компонентами клиентская область родителя заполняется компонентами со свойствами Align=alClient, которые в этом случае (т.е. если их несколько) накладываются друг на друга. Замечательной особенностью свойства является его постоянство при изменении размеров клиентской части родителя. Если, например, компонент прижат к верхней границе формы, он будет неизменно занимать верхнюю часть клиентской области при любых изменениях размеров окна. Таким способом можно легко создать панели инструментов, строки состояния и т. п. Временное отключение и затем включение эффекта от свойства Align обеспечивается методами

procedure DisableAlign; procedure EnableAlign;

Любой видимый компонент можно скрыть или показать с помощью свойства visible или методами Hide и Show:

property Visible: Boolean; // True — показывает procedure Hide; // Скрывает компонент procedure Show; // Показывает компонент

Скрытый компонент не реагирует на события мыши и клавиатуры, он не участвует в "дележе" клиентской области родителя, ему нельзя передать фокус ввода клавишей <Таb>.

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

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

procedure BringToFront; // Сделать верхним procedure SendToBack; // Сделать нижним

Свойство Enabled определяет возможность активизации компонента: property Enabled: Boolean;

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

Некоторые компоненты имеют плоское представление (например, метка TLabel), другие – всегда объемное (например, кнопка TButton). Для остальных элементов объемность представления регулируется свойством Ctrl3D:

property Ctl3D: Boolean;

С каждым управляющим компонентом связывается текстовая строка, которая становится доступна либо через свойство Caption, либо через свойство Text. Текст будет выводится шрифтом определенным в свойстве Font.

property Font: TFont;

В этом случае свойство TAlignment регулирует расположение текста относительно границ компонента:

type TAlignment = (taLeftJustify, taRightJustify, taCenter); property Alignment: TAlignment;

Допустимые значения свойства:

taLeftJustify – прижать к левой границе; taRightJustify – прижать к правой границе; taCenter – расположить по центру.

Рассмотрим следующее свойство: property DesktopFont: Boolean;

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

Видимая часть элемента заливается цветом color: property Color: TColor;

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

function RGB(r, g, b: Byte): TColor;

здесь r, g, b – это количество красной, зеленой и синей составляющей цвета.

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

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

property ParentColor: Boolean;

property ParentCtl3d: Boolean; property ParentFont: Boolean; property ParentHint: Boolean;

Если, например, цвет компонента не задан явно свойством Color, и его свойство ParentColor имеет значение True, компонент будет использовать при прорисовке цвет своего родителя, а изменение цвета родителя приведет к немедленному изменению цвета дочернего компонента. Явная установка значений свойств Color, Ctrl3D, Font или Hint приводит к автоматической установке значений False в соответствующие свойства

ParentXXX.

Класс TControl содержит свойство1, определяющее способ фиксирования дочернего компонента относительно границ контейнера, в котором он размещен:

property Anchors: TAnchors;

type TAnchors = set of TAnchorKind;

type TAnchorKind = (akTop, akLeft, akRight, akBottom);

По умолчанию это свойство имеет значение [аkTор, akLeft], что означает фиксацию компонента относительно левого верхнего угла контейнера. В результате возможные изменения размеров контейнера никак не скажутся на изменении положения и/или размеров компонента. Если установить значение [akRight, akBottom], правая и нижняя кромки компонента всегда будут располагаться на одном и том же расстоянии от соответствующих кромок контейнера. Так как положение левого верхнего угла компонента при этом не фиксируется, он будет "плавать" внутри контейнера, всегда располагаясь на одном и том же расстоянии от его правой и нижней кромки.

Однако если установлено значение [akTop, akLeft, akRight, akBottom], то левый верхний угол фиксируется, и компонент будет пытаться отслеживать расстояние до правого нижнего угла контейнера с помощью изменения своих размеров.

Свойство2 Constraints используется для ограничения максимальных и минимальных размеров элементов управления по высоте и ширине.

property Constraints: TSizeConstraints;

Объект клад

TSizeConstraints имеет четыре свойства: MaxHeight, MaxWidth, MinHeight, MinWidth

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

Свойство3 AutoSize разрешает (True) или запрещает (False) оконному компоненту автоматически изменять свои размеры в зависимости от количества и размеров содержащихся в нем неоконных компонентов будут располагаться на одном и том же расстоянии от соответствующих кромок контейнера.

property AutoSize: Boolean;

1В версиях Delphi начиная с Delphi 4

2В версиях Delphi начиная с Delphi 4

3В версиях Delphi начиная с Delphi 4