Назад.           Содержание.        Вперед.

 

КОМПОНЕНТЫ

ПОНЯТИЕ КОМПОНЕНТА

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

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

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

• Существует еще и взгляд изнутри, т. е. взгляд из программы на языке Object Pascal. С этой точки зрения компоненты — это классы, порожденные прямо или косвенно от класса TComponent и имеющие опубликованные (published) свойства. Экземпляры компонентов — это объекты этих классов, существующие в качестве полей формы. Среди опубликованных свойств компонентов обязательно присутствует имя (Name), под которым экземпляр компонента представляется в Инспекторе Объектов.

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

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

Компонент =состояние (свойства)+ действия (методы)+ обратные связи (события).

Состояние компонента описывается его свойствами. Свойства — это атрибуты компонента, которые определяют, как компонент отображается на экране и как функционирует. Свойства бывают изменяемые (для чтения и записи) и неизменяемые (только для чтения). В зависимости от времени установки свойства подразделяются на свойства времени проектирования (design time) и свойства времени выполнения (run-time). Первые устанавливаются для каждого компонента в Инспекторе Объектов и определяют начальное состояние компонента. Во время выполнения приложения эти свойства могут быть изменены операторами программы, соответственно изменится вид и поведение компонента. Вторая группа — это свойства, которые не отражены в окне Инспектора Объектов и управлять которыми можно только из программы. С точки зрения языка Object Pascal суть различия между свойствами времени проектирования и свойствами времени выполнения совсем проста — первые объявлены в своем классе в секции published, а вторые — в секции public.

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

Обратные связи компонента — это его события. События обеспечивают интерактивность компонентов, благодаря им приложение на Delphi строится как программный автомат. В Object Pascal нет специальных языковых средств для представления событий, да они и не нужны, поскольку события реализуются с помощью свойств, содержащих указатели на методы (см. гл. 3).

ВИЗУАЛЬНЫЕ И НЕВИЗУАЛЬНЫЕ КОМПОНЕНТЫ

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

Визуальные компоненты (visual components) — это управляющие элементы пользовательского интерфейса (controls), т. е. кнопки, метки, блоки списков и др. Они видны на экране и выглядят одинаково на стадии проектирования и во время работы приложения. В этом их главное достоинство.

Невизуальные компоненты (nonvisual components) — это, так сказать, бойцы невидимого фронта, они работают, но сами на экране не видны. К невизуаль-ным компонентам относятся таймер, компоненты доступа к базам данным и др. На стадии проектирования невизуальный компонент представляется на форме небольшим значком. Его свойства устанавливаются в Инспекторе Объектов. Некоторые компоненты хотя и являются невизуальными, могут что-нибудь отображать на экране. Например, невизуальный компонент MainMenu отображает на форме строку главного меню, а невизуальный компонент OpenDialog — стандартное диалоговое окно выбора файла (рис. 5. 29).

УПРАВЛЯЮЩИЕ ЭЛЕМЕНТЫ-ОКНА И РИСУЕМЫЕ УПРАВЛЯЮЩИЕ ЭЛЕМЕНТЫ

Управляющие элементы пользовательского интерфейса подразделяются на управляющие элементы-окна и рисуемые управляющие элементы.

Управляющие элементы-окна (windowed controls) являются специализированными окнами внутри окна формы. Их самое главное качество — способность получать фокус ввода. К числу управляющих элементов-окон относятся, например, компоненты Button, RadioButton, Checkbox, GroupBox и т. д. Некоторые управляющие элементы такого типа (например, GroupBox, TabControl, PageControl) способны содержать другое управляющие элементы пользовательского интерфейса и называются владельцами (container controls). Отрисовку управляющих элементов-окон выполняет операционная система Windows.

Для профессионалов, имевших дело с Windows API, заметим, что управляющие элементы-окна имеют целочисленное свойство Handle. Благодаря ему обеспечивается связь компонента Delphi с соответствующей структурой данных Windows.

Рисуемые управляющие элементы (graphical controls) не являются окнами, поэтому не могут получать фокус ввода и содержать другие управляющие элементы. Их отрисовку полностью выполняет Delphi. К числу рисуемых управляющих элементов относятся, например, компоненты Label, SpeedButton, Image, Bevel и т. д. (рис. 5. 30).

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

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

ОБЩИЕ СВОЙСТВА УПРАВЛЯЮЩИХ ЭЛЕМЕНТОВ

Местоположение управляющего элемента внутри формы или управляющего элемента владельца определяется значениями свойств Left и Тор. Горизонтальный и вертикальный размеры управляющего элемента хранятся в свойствах Width и Height соответственно.

Свойство Caption содержит заголовок управляющего элемента. Установленная в свойстве текстовая строка может содержать управляющий символ амперсанд (&). Если в строке встречается амперсанд, то следующий за ним символ отображается подчеркнутым (амперсанд при этом не отображается) и называется символом-сокращением. Нажимая клавишу с изображением символа в сочетании с клавишей Alt, пользователь может активизировать управляющий элемент с помощью клавиатуры.

Свойство Color определяет цвет управляющего элемента. Управляющий элемент может иметь независимый цвет, а может брать его у своего владельца (формы или другого компонента). Это определяется значением свойства ParentColor. Если свойство ParentColor имеет значение True, то изменение цвета владельца, например формы, автоматически приводит к изменению значения свойства Color управляющего элемента, например кнопки. Однако, если вы сами установите свойство Color, то свойство ParentColor автоматически получит значение False и цвет управляющего элемента станет независимым.

Свойство Ctl3D определяет, какой внешний вид имеет управляющий элемент: рельефный (говоря на жаргоне — 3-мерный) или плоский. Если свойство имеет значение True, то управляющий элемент имеет рельефный вид, а если False, — то плоский. Свойство рельефности управляющего элемента может зависеть от рельефности его владельца (формы или другого компонента), что определяется значением свойства ParentCtl3D. Если свойство ParentCtl3D имеет значение True, то изменение рельефности владельца, например формы, автоматически приводит к изменению значения свойства C113D управляющего элемента, например кнопки. Однако, если вы сами установите свойство C113D, то свойство ParentCtl3D автоматически получит значение False и рельефность управляющего элемента станет независимой. Заметим, что в Windows 95 и Windows NT 4. 0 значение свойства Ctl3D не играет роли, так как управляющие элементы сразу имеют рельефный вид.

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

          crAppStart,crArrow,crCross,crDefault,crDrag,crHelp,crHourGlass,crHSpilt,crlBeam,

crMultiDrag,crNo,crNoDrop,crSizeNESW,crSizeNS,crSizeNWSE,crSizeWE,crSQLWait,crUpArrow,

crVSpilt.

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

Свойство Drag Mode определяет режим буксировки управляющего элемента. Если в свойстве установлено значение dmManual (принято по умолчанию), то буксировка должна инициироваться программно. Если же в свойстве установлено значение dmAutomatic, то управляющий элемент уже готов к буксировке, пользователю достаточно просто нажать кнопку мыши в момент, когда курсор находится над элементом и отбуксировать его в нужное место.

Свойство Enabled определяет, доступен ли управляющий элемент для пользователя. Если свойство имеет значение True, то управляющий элемент доступен, а если False, то недоступен. Недоступный управляющий элемент обычно имеет блеклый вид.

Свойство Font является сложным и определяет шрифт надписи на управляющем элементе. Параметры шрифта задаются с помощью вложенных свойств Color, Name, Size, Style, Height. Шрифт управляющего элемента может быть независимым, а может копироваться у владельца (формы или другого компонента). Это определяется значением свойства ParentFont. Если свойство ParentFont имеет значение True, то изменение шрифта владельца, например формы, автоматически приводит к изменению значения свойства Font управляющего элемента, например кнопки. Однако, если вы сами установите свойство Font, то свойство ParentFont автоматически получит значение False и шрифт управляющего элемента станет независимым.

Свойство HelpContext содержит номер темы в файле справочника, которая контекстно связана с управляющим элементом (см. гл. 17). Когда управляющий элемент обладает фокусом ввода, пользователь может нажать клавишу F1, чтобы получить по нему оперативную справку. Если свойство HelpContext имеет значение 0, то управляющий элемент берет номер темы у своего владельца.

Свойство Hint содержит строку подсказки, которая всплывает под управляющим элементом, если пользователь временно задерживает над ним курсор мыши. Всплытие подсказки может быть разрешено или запрещено с помощью другого свойства — ShowHint. Значение свойства ShowHint может зависеть от запрета подсказки для владельца (формы или другого компонента). Это определяется значением свойства ParentShowHint. Если свойство ParentShowHint имеет значение True, то запрет подсказки для владельца, например формы, автоматически приводит к запрету подсказки для управляющего элемента, например кнопки. Однако, если вы сами установите свойство ShowHint, то свойство ParentShowHint автоматически получит значение False и запрет подсказки для управляющего элемента станет независимым.

Свойство PopupMenu используется для привязки к управляющему элементу локального всплывающего меню. Это меню всплывает по щелчку правой кнопки мыши, когда курсор находится над управляющим элементом (меню обсуждаются в гл. 6).

Свойство TabOrder содержит порядковый номер управляющего элемента в пределах своего владельца. Это номер очереди, в которой управляющий элемент получает фокус ввода при нажатии клавиши Tab.

Свойство TabStop определяет, может ли управляющий элемент получать фокус ввода. Если свойство имеет значение True, то управляющий элемент находится в очереди на фокус ввода, а если False, — то нет.

Свойство Visible управляет видимостью управляющего элемента на экране. Если свойство имеет значение True, то управляющий элемент виден, а если False, — то скрыт.

ОБЩИЕ СОБЫТИЯ УПРАВЛЯЮЩИХ ЭЛЕМЕНТОВ

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

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

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

Событие OnKeyDown происходит при нажатии пользователем любой клавиши, когда управляющий элемент находится в фокусе ввода. При отпускании нажатой клавиши возникает событие On Key Up. Если пользователь нажал символьную клавишу, то вслед за событием OnKeyDown и до события OnKeyUp возникает событие OnKeyPress.

Событие OnMouseDown происходит при нажатии пользователем кнопки мыши, когда курсор находится над управляющим элементом. При отпускании кнопки в управляющем элементе происходит событие OnMouseUp. При перемещении курсора мыши над управляющим элементом, в последнем периодически возникает событие OnMouseMove, что позволяет реагировать на простое изменение положения курсора.

Для реализации техники буксировки в управляющих элементах существует еще четыре общих события — OnStartDrag, OnDragOver, OnDragDrop, OnEndDrag, но они обсуждаются в гл. 8.

УПРАВЛЕНИЕ КОМПОНЕНТАМИ ПРИ ПРОЕКТИРОВАНИИ

ПОМЕЩЕНИЕ КОМПОНЕНТОВ НА ФОРМУ И ИХ УДАЛЕНИЕ

Чтобы поместить на форму нужный компонент из Палитры Компонентов, выполнив следующие действия:

1. Установите курсор мыши на нужный значок компонента в Палитре Компонентов и щелкните левой кнопкой мыши;

2. Переместите курсор в нужное место формы и еще раз щелкните мышью;

3. Выбранный компонент окажется в форме и готов к установке свойств.

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

1. Нажмите клавишу Shift и, не отпуская ее, щелкните левой кнопкой мыши на нужном значке компонента в Палитре Компонентов. Отпустите клавишу Shift.

2. Переместите курсор в то место формы, где будет находиться первый компонент, и щелкните левой кнопкой мыши.

3. Переместите курсор в точку, где будет размещен второй компонент и щелкните левой кнопкой мыши. Повторите это действие столько раз, сколько компонентов будете размещать.

4. Разместив последний компонент, переместите курсор на кнопку с изображением стрелки курсора (она расположена в левой части Палитры Компонентов), и щелкните кнопкой мыши. Это будет сигнал визуальной среде, что выбор однотипных компонентов закончен.

Если вы по каким-либо причинам решили убрать компонент с формы, просто выберите его с помощью мыши и нажмите клавишу Del.

ВЫБОР РАБОЧЕГО КОМПОНЕНТА НА ФОРМЕ

На стадии проектирования любой компонент формы может быть в двух состояниях:

активном или пассивном. Когда он активен (другими словами — выбран для работы), его свойства можно изменять в Инспекторе Объектов. Когда компонент пассивен, на него можно только смотреть. Чтобы выбрать рабочий компонент, достаточно установить на него курсор и щелкнуть кнопкой мыши. Вокруг компонента тут же появятся так называемые «точки растяжки» (sizing handles) для изменения размеров компонента по ширине и высоте (рис. 5. 30).

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

При проектировании сложных форм вы столкнетесь с ситуацией, когда в нескольких компонентах нужно установить некоторое свойство в одно и то же значение, например, в нескольких кнопках установить свойство Enabled в значение False. Быстрее всего это можно сделать, если выделить несколько компонентов и выполнить установку общего свойства в окне Инспектора Объектов за один раз. Выделить несколько компонентов можно двумя способами:

• Нажать клавишу Shift и, удерживая ее, отметить щелчками мыши все требуемые компоненты, после чего клавишу Shift отпустить. В углах каждого выделенного компонента появятся небольшие квадратики-маркеры.

• Нажать кнопку мыши, когда курсор находится вне компонентов. Затем, удерживая кнопку нажатой, протянуть курсор над выделяемыми компонентами, включив их в пунктирный прямоугольник. Когда в пунктирный прямоугольник попадут все требуемые компоненты, кнопку мыши следует отпустить. (Если выделяемые компоненты находятся внутри компонента Panel или GroupBox, то эту операцию нужно выполнять с нажатой клавишей Ctrl.) В результате перечисленных действий в углах всех компонентов, хотя бы частично попавших в пунктирный прямоугольник, появятся небольшие квадратики-маркеры, свидетельствующие о том, что компоненты выделены.

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

Когда на форме выделено несколько компонентов, в окне Инспектора Объектов отображаются лишь их общие свойства. Активизируйте нужное свойство и установите в нем свое значение. Вы увидите, что эта установка отразится на всех выделенных компонентах (рис. 5. 31).

Компоненты страницы Standard.

1.      TMainMenu.

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

После установки компонента на форму надо создать его опции. Для этого кликните дважды на нем левой кнопкой мыши или, щелкнув правой кнопкой, выбрать пункт меню Menu Designer. Появится окно конструктора меню. Перейдите в окно Инспектора Объектов и введите название пункта меню в строке Caption, после чего нажмите ВВОД и пункт готов. Каждый пункт меню может содержать подменю или исполнять команду. Для создания подменю щелкните на строке под пунктом меню и введите ее название. Создав подменю, щелкните на пустой строке справа и создавайте следующий пункт меню.

В названиях пунктов главного меню можно указать символ "&" перед тем символом, который определит клавишу быстрого выбора опции. Например "&Файл" обозначит пункт меню Файл и клавиши Alt-Ф. При создании подменю можно разделять пункты меню горизонтальной чертой. Для этого при создании меню очередной элемент назовите "-" (Пункт Caption).

Для создания разветвленных подменю щелкните на пункте подменю, у которого должно быть свое подменю и нажмите комбинацию Ctrl+Вправо (стрелка курсора).

Свойства этого компонента (TMainMenu.) описаны в таблице.

Property BitMap: TBitMap

Содержит ссылку на связанное с пунктом меню изображение. Это изображение (если оно есть) появляется слева от названия пункта меню Свойство игнорируется если установлено свойство ImageIndex

Property Break: TmenuBreak

Позволяет создать многоколоночное подменю

Property Checked: Boolean

Если True, рядом с опцией появляется галочка

Property Command: Word

Используется при разработке приложений, работающих с API-функциями Windows

Property Count: Integer

Содержит количество опций в подчиненном подменю

Property Default: Integer

Определяет, является ли эта опция "по умолчанию"

Property GroupIndex: Byte

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

Property ImageIndex: Integer

Содержит индекс связанных с меню изображений (по умолчанию –1)

Property Items(Index: Integer):TMenuItem

Позволяет обратиться к любому пункту меню по его индексу

Property MenuIndex: Integer

Определяет индекс опции в списке Items родительского пункта

Property RadioItem: Boolean

Определяет, зависит ли данная опция от выбора других пунктов меню

Property ShortCut: TshortCut

Задает клавиши быстрого выбора для данного пункта меню

2. TpopupMenu.

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

            Создание меню аналогично предыдущему.

3. Tlabel.

Метки предназначены для размещения на форме различных надписей. Свойства компонента:

Property AutoSize:Boolean

Указывает, будет ли метка изменять размеры в зависимости от длины текста. Если True то будет

Property FocusControl: TwinControl

Содержит имя оконного компонента, связанного с меткой акселератором

Property Transparent:Boolean

Определяет прозрачность фона метки. Если False то закрашивается своим цветом Color

Property WordWrap: Boolean

Разрешает/запрещает разрыв строки на границе слова.

Если нужна многострочная метка, то задайте Autosize=false & WordWrap=true

Property Layout: TtextLayout

Определяет выравнивание текста по вертикали:

TlTop-текст вверху

TlCenter-текст по центру

TlBottom – текст внизу

 

4.      Tedit.

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

            Свойства компонента:

Property AutoSelect:Boolean

Указывает, будет ли выделяться текст при получении фокуса ввода

Property AutoSize: Boolean

Высота компонента автоматически изменяется при изменении свойства компонента FontSize

Property BorderStyle:TborderStyle;

Определяет стиль обрамления компонента

Property CanUndo: Boolean

Содержит True, если сделанные пользователем изменения можно убрать методом Undo

Property CharCase: Teditcharcase

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

Property HideSelection:Boolean

Если False выделение текста сохраняется при потере фокуса

Property MaxLength:Integer

Определяет максимальную длину строки. Если 0 — длина не ограничена

Property modified:Boolean

Содержит True если текст был изменен

Property onChange : Tnotifyevent

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

Property PasswordChar:char

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

Property readOnly:Boolean

Если True – текст нельзя изменять

Property SelLength:Integer

Содержит длину выделенной части текста

Property selstart: Integer

Начало выделения

Property seltext: string

Сам выделенный текст

Методы компонента:

Procedure Clear

Удаляет весь текст

Procedure ClearSelection

Удаляет выделенный текст

Procedure ClearUndo

Очищает буфер метода Undo

Procedure CopyToClipboard

Копирует выделенный текст в буфер

Procedure CutToClipboard

Копирует выделенный текст в буфер, и удаляет сам текст

Procedure PasteFromClipboard

Заменяет выделенный текст содержимым буфера или вставляет из буфера с текущей позиции

Procedure SelectAll

Выделяет весь текст

Procedure Undo

Восстанавливает текст в виде до изменений

5. Tmemo.

Компоненты этого класса предназначены для ввода, редактирования и отображения длинных текстов. Текст хранится в поле класса Tstring и представляет собой набор строк (не предложений!!!). Многие свойства аналогичны одноименным свойствам класса Tedit. Специфические свойства:

Property CaretPos: Tpoint

Содержит координаты текстового курсора относительно границ клиентской области компонента

Property Lines: Tstrings

Содержит редактируемый текст

Property ScrollBars: TScrollStyle

Определяет наличие полос прокрутки

Property WantReturns: Boolean

Если True то нажатие ВВОДа вызывает переход на новую строку иначе обрабатывается системой

Property WantTabs: Boolean

Если True то всталяет в текст символ табуляции иначе обрабатывается систеой

Специфичные методы аналогичны методам классы TEdit.

6.      TButton.

Кнопки широко используются программами в качестве средства реализации диалога с пользователем.

Свойства компонента:

Property Cancel:Boolean

Если True, то реагирует на нажатие кнопки Esc

Property Default: Boolean

Если True то реагирует на ВВОД

Property ModalResult: TmodalResult

Определяет результат закрытия модального окна

 

MrNone

Окно не закрыто

MrIgnore

Кнопка Ignore

MrOk

Нажата кнопка ОК

MrYes

Кнопка Yes

MrCancel

Кнопка Cancel

MrNo

Кнопка No

MrAbort

Кнопка Abort

mrAll

Кнопка All

MrRetry

Кнопка Retry

 

 

 Назад.          Содержание.       Вперед.