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

Программирование Часть 2 - Delphi

.pdf
Скачиваний:
24
Добавлен:
16.03.2015
Размер:
734 Кб
Скачать

31

• установить этот регион для окна функцией SetWindowRgn.

Например, создадим форму в виде окружности. procedure TfmCircle.FormCreate(Sender: TObject);

Var Region:HRgn;

begin

Region:=CreateEllipticRgn(30,30,400,400);

SetWindowRgn(fmCircle.Handle,Region,true)

end;

3.4. Компоненты

3.4.1.Общие свойства управляющих элементов

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

(для чтения и записи) и неизменяемые (только для чтения). В зависимости от времени установки разделяются на свойства времени проектирования и времени выполнения.

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

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

BitBtn, Edit, CheckBox, GroupBox и др.). Некоторые из этих окон могут содержать другие управляющие элементы (например, GroupBox, PageControl) и называются владельцами

(контейнерами). Изображает управляющие элементы-окна операционная система

Windows.

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

Местоположение на форме или внутри контейнера задаѐтся координатами левого верхнего угла Top и Left. Горизонтальные в вертикальные размеры определяют свойства

Width, Height.

Заголовок Caption представляет собой текстовую строку, которая может содержать управляющий символ & (амперсанд). Следующий за амперсандом символ отображается

32

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

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

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

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

Font – сложное свойство, определяющее шрифт. Параметры шрифта задаются вложенными свойствами Color, Name, Size, Style, Height. Шрифт может быть независимым или определяться шрифтом владельца, в зависимости от свойства ParentFont логического типа.

HelpContext содержит номер темы в файле справочной системы. Для получения контекстной справки следует сфокусировать компонент и нажать на клавишу F1. Если

HelpContext имеет значение 0, то справка выводится по номеру темы владельца.

Свойство Hint определяет строку подсказки. Если задержать на компоненте курсор мыши, может появиться всплывающая подсказка. Разрешение или запрет на вывод всплывающей подсказки задаѐтся свойством логического типа ShowHint. В свою очередь,

ShowHint может зависеть от разрешения на вывод подсказки у владельца. Это определяется значением свойства ParentShowHint. Если ParentShowHint равно true, то запрет подсказки для владельца автоматически приводит к запрету для рассматриваемого компонента.

Свойство PopupMenu позволяет привязать к управляющему элементу контекстное

(всплывающее меню), которое выводится на экран щелчком по компоненту правой кнопкой мыши.

TabOrder – порядковый номер компонента в пределах владельца. Задаѐт номер очереди для получения фокуса ввода.

TabStop – определяет возможность получения компонентом фокуса ввода. Если значение TabStop равно true, то компонент находится в очереди.

Свойство Visible управляет видимостью компонента. Если значение Visible равно true, то компонент виден, иначе – скрыт.

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

33

3.4.2.Общие события управляющих элементов

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

выбор элемента управления;

перемещение указателя мыши;

вращение колеса мыши;

нажатие клавиш клавиатуры;

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

перемещение объектов методом перетаскивания.

Событие OnClick – выбор элемента управления; возникает при щелчке по управляющему элементу левой кнопкой мыши. Для некоторых компонентов это событие может возникнуть и при других способах нажатия элемента управления. Например, для кнопки Button, находящейся в фокусе ввода, событие OnClick можно задать с помощью клавиш «пробел» или Enter. При разработке приложений это событие используется чаще других.

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

Событие OnDbClick – двойной щелчок по компоненте левой кнопкой мыши.

При перемещении указателя мыши над компонентом периодически генерируется событие OnMouseMove, что позволяет реагировать на перемещение указателя. Это событие имеет тип TMouseMoveEvent, который описан следующим образом:

type TMouseMoveEvent=procedure(Sender:TObject;Shift:TShiftState; x,y:Integer);

Параметр Sender указывает, над каким элементом управления находится указатель мыши, а параметры х и y определяют координаты указателя относительно этого элемента управления. Параметр Shift в зависимости от использования клавиш Alt, Ctrl, Shift и

кнопок мыши может принимать значения: ssShift – нажата клавиша Shift;

ssAlt – нажата клавиша Alt; ssCtrl – нажата клавиша Ctrl;

ssLeft –- нажата левая кнопка мыши; ssMiddle – нажата средняя кнопка мыши;

ssDouble – выполнен двойной щелчок мышью.

34

При нажатии любой из указанных клавиш к параметру Shift добавляется соответствующее значение. Например, если нажата комбинация клавиш Shift+Ctrl, то значением параметра Shift является [ssShift, ssCtrl]. Если не нажата ни одна клавиша, то

Shift принимает пустое значение [].

События OnMouseWheel, OnMouseWheelDown, OnMouseWheelUp связаны с вращением колеса мыши. При вращении колеса мыши вперед и назад генерируются соответственно события OnMouseWheelDown и OnMouseWheelUp. В процессе вращения колѐсика при расположении указателя мыши над визуальным компонентом непрерывно вырабатывается событие OnMouseWheel.

Событие OnEnter – получение компонентом фокуса ввода. При потере фокуса ввода генерируется событие OnExit. Эти события не возникают при переключении между формами и приложениями. Поместим на форму редактор Edit и метку Label, для которой в свойстве Visible установим значение False. При получении компонентой Edit фокуса ввода будем выводить метку на экран, а при потере фокуса – делать еѐ невидимой.

procedure TForm1.Edit1Enter(Sender: TObject);

begin

Label2.Visible:=true;

end;

procedure TForm1.Edit1Exit(Sender: TObject);

begin

Label2.Visible:=false;

end;

При использовании клавиатуры генерируются события OnKeyDown, OnKeyPress,

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

OnKeyUp. Если была нажата символьная клавиша, то вслед за событием OnKeyDown до события OnKeyUp генерируется событие OnKeyPress. При удерживании клавиши нажатой, непрерывно генерируется событие OnKeyDown, событие OnKeyUp возникает однократно после отпускания клавиши.

Обработка события OnKeyPress выполняется для формирования реакции на нажатую клавишу. Это событие имеет тип TKeyPressEvent:

type TKeyPressEvent = procedure (Sender: TObject; var Key: Char);

Параметр Key содержит код ASCII нажатой клавиши, который может быть проанализирован и при необходимости изменен. Если параметру Key задать значение ноль

(#0), то это будет соответствовать отмене нажатия клавиши. Обработчик события

35

OnKeyPress не реагирует на нажатие управляющих клавиш, однако параметр Key

содержит код символа с учетом регистра, который определяется состоянием клавиш Caps Lock и Shift.

В качестве примера создадим обработчик события OnKeyPress редактора Edit,

запрещающий ввод знака минус:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if Key = '-' then Key:=#0; end;

Для обработки управляющих клавиш, не имеющих ASCII-кодов (Shift, Ctrl, Alt и др.),

можно программно использовать события OnKeyDown и OnKeyUp типа TKeyEvents [6].

События OnStartDrag, OnDragOver, OnDragDrop, OnEndDrag используются для осуществления перетаскивания компонентов. Реализованная в Delphi технология drag- and-drop позволяет перемещать различные объекты, например, элементы одного списка в другой. При этом используются два элемента управления: источник и приемник.

Источник содержит перемещаемый объект, а приемник – элемент управления, на который помещается элемент-источник. Разные варианты выполнения перетаскивания мышью хорошо изложены в книге [6].

3.4.3. Кнопки Стандартная кнопка Button

Кнопки Button очень широко используются в качестве управляющих элементов.

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

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

(если она задана в свойстве Caption), клавишами Enter или пробел, клавишей Esc. На нажатие клавиш Enter и пробел находящаяся в фокусе ввода кнопка реагирует по умолчанию. Чтобы задействовать клавишу Esc, надо в свойстве кнопки Cancel установить true. Это целесообразно делать только для кнопок, используемых для отмены каких-либо действий.

Для кнопки определѐн метод Click, выполнение которого эквивалентно щелчку по кнопке. Метод Click можно использовать, чтобы продублировать какими-либо действиями щелчок по кнопке. Предположим, что обработчик кнопки «Заменить» (Button1) должен вызываться клавишами R и r. Тогда необходимо сформировать обработчик события формы OnKeyPress.

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin

36 if (Key='R') or (Key='r') then Button1.Click; end;

Дополнительно следует свойство формы KeyPreview установить в true.

Кнопка с рисунком BitBtn

Кнопка BitBtn является разновидностью обычной кнопки Button. Помимо текста может содержать графическое изображение.

В Delphi имеется ряд предопределѐнных кнопок, задаваемых свойством Kind (рис.1.).

Для каждой такой кнопки подготовлена картинка и предусмотрены соответствующие названию действия. При этом текст на кнопке можно изменить. Например, присвоить свойству Caption эквивалентное русское название. Расположение надписи и рисунка на кнопке определяется свойствами Margin, Layout, Spacing. По умолчанию свойство Margin

равно -1 (картинка и надпись размещаются в центре кнопки). При этом расположение картинки по отношению к тексту задаѐтся свойством Layout (слева, справа, сверху, снизу).

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

Рис.1. Кнопки BitBtn

По умолчанию свойство Kind имеет значение bkCustom, для которого первоначально изображение отсутствует и его надо загрузить. Растровое изображение на кнопке задаѐтся с помощью свойства Glyph. По умолчанию свойство Glyph имеет значение None. Чтобы задать изображение, надо в Инспекторе объектов щѐлкнуть по кнопке в области значений свойства Glyph, в открывшемся окне Picture Editor выбрать файл с растровым изображением. Можно использовать поставляемые с Delphi рисунки, разработанные специально для размещения на кнопках BitBtn (папка \Program Files\Common Files\Borland

37

Shared\Images\Buttons). При необходимости, можно создать файл с изображением самостоятельно. Рисунок для кнопки может содержать до трѐх изображений (кнопка не нажата, кнопка не активна, кнопка нажата), подготовленных по специальным правилам и сохранѐнных в одном файле формата BMP.

Кнопка с независимой фиксацией CheckBox

Кнопка CheckBox (флажок) позволяет выбирать или отменять некоторые действия или значения. При включении или выключении кнопки происходит событие OnClick.

Кнопка может находиться во включѐнном, выключенном и неактивном состоянии. С

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

поэтому такие переключатели называют независимыми.

Свойство Alignment определяет положение сопровождающего текста относительно кнопки (справа или слева).

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

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

В приведѐнном ниже примере переключатель CheckBox1 управляет выводом названия графика на экран, CheckBox2 отвечает за вывод легенды, а CheckBox3

используется для изменения цвета фона.

if CheckBox1.Checked then Chart1.Title.Visible:=true

else Chart1.Title.Visible:=false;

if CheckBox2.Checked then Chart1.Legend.Visible:=true

else Chart1.Legend.Visible:=false;

if CheckBox3.Checked then Chart1.BackColor:=rgb(177,142,179)

else Chart1.BackColor:=rgb(255,255,255);

При использовании группы кнопок с независимой фиксацией их часто размещают внутри контейнеров Panel, GroupBox или ScrollBox.

Кнопка с зависимой фиксацией RadioButton

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

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

38

Состояние кнопки определяется свойством Checked. Если у одного из компонентов группы это свойство равно true, то у всех других компонентов группы свойство Checked

принимает значение false. При включении или отключении кнопки происходит событие

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

3.4.4. Контейнеры Контейнер GroupBox

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

Контейнер RadioGroup

RadioGroup – это специальный контейнер для размещения зависимых переключателей. Каждый включѐнный в группу переключатель заносится в список Items и

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

Свойство Columns определяет количество столбцов переключателей. Свойство

ItemIndex задаѐт индекс выбранного переключателя. Свойство Items – это список строк с заголовками переключателей. Добавление и удаление элементов достигается добавлением и удалением строк списка Items.

Чтобы создать группу зависимых переключателей необходимо:

присвоить группе название (свойство Caption);

задать количество столбцов (cвойство Columns);

сформировать список Items из названий переключателей. Список создаѐтся в String list editor, окно которого открывается при нажатии на кнопку, расположенную в строке свойства Items;

выбрать один из переключателей, указав в свойстве ItemIndex нужный индекс. Этот переключатель при запуске приложения будет включѐн. Переключатели в группе нумеруются, начиная с нуля.

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

оператор case:

case RadioGroup1.ItemIndex of

0:d:=3;

1:d:=5;

2:d:=7;

end;

Панель Panel

39

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

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

Панель имеет развитые средства для создания эффектов трѐхмерности за счѐт использующихся в ней двух рамок – внешней и внутренней. Любая из рамок может отсутствовать (bvNone), быть выпуклой (bvRaised) или вдавленной (bvLowered). Ширина рамок в пикселах задаѐтся свойством BevelWidth.

Свойство Align удобно использовать, чтобы задать положение панели относительно границ формы, не зависящее от изменения размеров последней: у верхней границы alTop,

у нижней – alBottom, у левой – alLeft, у правой – alRight, на всем рабочем пространстве – alClient.

Панели с вкладками

Для создания элементов с вкладками рекомендуется использовать компоненты

PageControl и TabControl. Эти компоненты позволяют экономить пространство окна,

размещая на одном и том же месте страницы с разным содержанием. Переход к нужной вкладке выполняется щелчком мыши по ярлычку. Компоненты PageControl и TabControl

имеют много общих свойств (MultyLine, TabHeight, HotTrack, ScrollOpposite, TabPosition,

TabWidth и др.), но отличаются по сути.

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

Компонент PageControl содержит перекрывающие друг друга панели класса

TTabSheet. Каждая панель может содержать свой набор компонентов. Первоначально

PageControl не содержит страниц. Для создания страницы надо открыть контекстное меню и выбрать команду New Page. Появится страница, для которой можно задать надпись на ярлычке (свойство Caption), индекс изображения, которое может появиться на ярлычке (свойство ImageIndex) и др. Количество страниц хранится в свойстве для чтения

PageCount. Доступ к странице осуществляется по еѐ номеру PageIndex или программно через свойство Pages[Index:Integer]. Нумерация страниц начинается с нуля.

40

На рис. 2 приведѐн пример использования компонента PageControl с тремя страницами. Ярлычки оформлены в виде закладок (свойство Style равно tsTabs) в верхней части компонента (свойство TabPosition равно tpTop).

Рис. 2. Пример использования компонента PageControl

3.4.5. Компоненты для работы со строками Строка редактирования Edit

Компонент Edit используется для ввода, вывода и редактирования строк.

Отображается строка, записанная в свойстве Text. Строки могут быть достаточно длинные. Однако этот компонент не распознаѐт символов конца строки и не может быть использован для работы с несколькими строками. С помощью компонента Edit можно отобразить нередактируемый текст, если свойству ReadOnly присвоить значение true.

Для изменения шрифта, используемого при записи текста, необходимо изменить значение свойства Font. Свойство CharCase используется для задания регистра символов,

а свойство MaxLength позволяет ограничить длину строки.

Метод Clear применяется для удаления всего текста, а метод ClearSelection – для удаления выделенной части строки. По умолчанию введѐнный текст выделяется при получении компонентом фокуса ввода – это определяется значением свойства AutoSelect

(если true – то выделяется).

Компонент Edit можно использовать для ввода пароля. Для этого свойству

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

Компонент MaskEdit

Компонент MaskEdit – аналог Edit, но с возможностью ввода текста по некоторому шаблону. Шаблон задаѐтся свойством EditMask, имеет вид текстовой строки и управляет тем, что, сколько и в каком порядке вводит пользователь. В редакторе свойств для

EditMask есть заготовки форматов даты, валюты и т.п. Шаблон можно выбрать из