Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delfi, лекции / Зан Св компонентов.doc
Скачиваний:
17
Добавлен:
28.03.2016
Размер:
1.1 Mб
Скачать

20

Общие свойства компонентов

Иерархия компонентов

Компонентами в Delphi называются потомки класса TComponent.

Все компоненты Delphi порождены от класса TComponent, в котором инкапсулированы самые общие свойства и методы компонентов. Предком TComponent является класс TPersistent, который произошел непосредственно от базового класса TObject (рис.1.1).

Класс TPersistent передает своим потомкам важный виртуальный метод:

С помощью этого метода поля и свойства объекта Source копируются в объект, вызвавший метод Assign. Обмениваться данными могут все наследники класса TPersistent независимо от того, находятся они в непосредственном родстве по отношению друг к другу или имеют единственного общего предка - класс TPersistent.

Класс TComponent служит базой для создания как видимых, так и невидимых компонентов.

Большая часть видимых компонентов происходит от класса TControl. Два наследника этого класса - TWinControl и TGraphicControl - определяют две группы компонентов: имеющие оконный ресурс (класс TWinControl и его потомки) и не имеющие этого ресурса (класс TGraphicControl и его потомки).

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

Рис.1.1

Оконный компонент в момент своего создания обращается к Windows с требованием выделения оконного ресурса и, если требование удовлетворено, получает так называемый дескриптор окна.

Класс TWinControl и его потомки хранят дескриптор окна в свойстве Handle. Программист может использовать этот дескриптор для непосредственного обращения к API-функциям Windows.

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

Имена и владельцы компонентов

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

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

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

При разработке собственных имен полезно выработать свою систему двух- или трехбуквенных префиксов, кодирующих тип компонента. Например, fm для формы TForm, lb - для метки TLabel, ed – для поля TEdit и т.п.

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

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

Указывает на владельца компонента следующее свойство (это свойство доступно только для чтения):

Положение компонента в массиве Components своего владельца определяет свойство Component Index:

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

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

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

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

Для управления списком Components предназначены методы, перечисленные в табл. 1.1.

Таблица 1.1

Родительские и дочерние компоненты

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

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

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

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

Класс TControl определяет свойство Parent, которое содержит ссылку на родительский компонент:

Это свойство не следует путать со свойством владения (Owner): владелец создает компонент (не обязательно видимый), а родитель (Parent) управляет видимым компонентом.

Поскольку конструктор TComponent.Create не изменяет свойства Parent (в родительском классе TComponent такого свойства нет), при создании видимых компонентов на этапе прогона программы это свойство необходимо изменять программно.

Например, следующий обработчик события OnCreate формы Form1 вставит надпись Дочерний элемент в левый верхний угол формы:

Обратите внимание на следующий оператор:

Если убрать этот оператор из приведенного выше фрагмента, метка никогда не «узнает» о том, что пришла пора прорисовать себя на экране, и ее текст не появится.

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

Помимо свойства Components каждый оконный компонент получает от своего родителя TWinControl свойство Controls, содержащее список дочерних элементов:

Свойство ControlCount возвращает количество дочерних элементов (длину массива Controls):

Работать со списком Controls можно с помощью следующих методов (табл. 1.2).

Таблица 1.2

Положение, размеры и оформление компонентов

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

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

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

Как показано ниже, все четыре числовые величины содержатся также в единственном свойстве:

Это свойство удобно использовать при прорисовке компонента методом TCavas.FrameRect.

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

Эта задача решается двумя методами TControl:

Таблица 1.2(продолжение)

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

Если это свойство не равно alNone, компонент прижимается к верхней (alTop), нижней (alBottom), левой (alLeft) или правой (alRight) границе своего родителя. При этом размеры компонента по соседним с границей измерениям игнорируются, и компонент «растекается» по границе.

Если Align=alTop, значения свойств Left и Width компонента игнорируются, и его прямоугольник будет занимать всю верхнюю часть клиентской области родителя высотой Height пикселов;

Если Align=alLeft, свойства Тор и Height игнорируются и прямоугольник занимает левую часть родителя шириной Width пикселов и т.д.

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

Вся не заполненная другими компонентами клиентская область родителя заполняется компонентами со свойствами Align=alClient, которые в этом случае (то есть если их несколько) накладываются друг на друга.

Временное отключение и затем включение эффекта от свойства Align обеспечивается методами

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

Скрытый компонент не реагирует на события мыши и клавиатуры, он не участвует в «дележе» клиентской области родителя, ему нельзя передать фокус ввода клавишей Tab.

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

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

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

Некоторые компоненты имеют плоское представление (например, метка TLabel), другие - всегда объемное (например, кнопка TButton).

Для остальных элементов объемность представления регулируется свойством Ctl3D:

Все потомки класса TWinControl получают от своего родителя 4 свойства, которые позволяют очерчивать оконные компоненты внутренней и внешней рамками:

Очерчиваются только те стороны компонента, которые содержатся в свойстве

BevelEdges.

Свойство BevelKind определяет стиль рамок:

bkNone - рамок нет;

bkTile - рамки контрастные (черные);

bkSoft - рамки пониженной контрастности (серые);

bkFlat - рамки неконтрастные (белые).

Тип TBevelCut определяет эффект объемности для соответствующей рамки:

bvNone - нет объемности;

bvLowered - вдавленная рамка;

bvRaised - выпуклая рамка;

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

Наличие описанных свойств у класса TWinControl еще не означает, что они будут у каждого его потомка. Например, свойства BevelEdges и BevelKind при объявлении класса TPanel не переобъявляются, и потому у панели отсутствуют, зато объявляется дополнительное свойство BevelWidth, определяющее толщину рамок.

С каждым управляющим компонентом связывается текстовая строка, которая становится доступна либо через свойство Caption, либо через свойство Text (альтернативой свойству Text, которое имеет тип String, является свойство WindowsText типа PChar класса TControl). Независимо от того, какое свойство хранит эту строку, ее можно установить и получить соответственно методами SetTextBuf и GetTextBuf, при этом метод GetTextLen возвращает длину строки:

Если эта строка прорисовывается в компоненте, используется шрифт, задаваемый свойством Font:

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

Допустимые значения свойства: taLeftJustify - прижать к левой границе; taRightJustify - прижать к правой границе; taCenter - расположить по центру.

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

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

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

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

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

Таких свойств четыре:

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

Явная установка значений свойств Color, Ctl3D, Font или Hint приводит к автоматической установке значений False в соответствующие свойства ParentXXX.

В версиях Delphi 4-7 в класс TControl введено свойство, определяющее способ фиксирования дочернего компонента относительно границ контейнера, в котором он размещен:

По умолчанию это свойство имеет значение [akTop, akLeft], что означает фиксацию компонента относительно левого верхнего угла контейнера. В результате возможные изменения размеров контейнера никак не скажутся на изменении положения и/или размеров компонента.

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

Так как положение левого верхнего угла компонента при этом не фиксируется, он будет «плавать» внутри контейнера, всегда располагаясь на одном и том же расстоянии от его правой и нижней кромок.

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

Поместите на пустую форму поле TEdit и поэкспериментируйте с его свойством Anchors, каждый раз изменяя мышью размеры формы (не обязательно запускать программу - свойство Anchors работает и на этапе конструирования).

В Delphi 4-7 в класс TControl введено свойство Constraints:

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

Объект класса TSizeConstraints имеет четыре свойства: MaxHeight, MaxWidth, MinHeight, MinWidth типа 0..MaxInt, которые и определяют предельные значения указанных параметров.

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

Свойство AutoSize также впервые введено в Delphi 4:

Это свойство связано в основном с интерфейсом «причаливания» (Drag&Dock) и разрешает (True) или запрещает (False) оконному компоненту автоматически изменять свои размеры в зависимости от количества и размеров содержащихся в нем неоконных компонентов.

Соседние файлы в папке Delfi, лекции