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

лекции delphi 1часть

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

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 – выполнен двойной щелчок мышью.

При нажатии любой из указанных клавиш к параметру 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), то это будет соответствовать отмене нажатия клавиши. Обработчик события

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

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

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 отображается в виде кружка с расположенным рядом поясняющим текстом. Выбранное состояние отмечается чёрной точкой. Кнопки этого типа всегда объединяются в группу, которая образует зависимый переключатель,

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

Состояние кнопки определяется свойством 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

Панель 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]. Нумерация страниц начинается с нуля.

На рис. 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 есть заготовки форматов даты, валюты и т.п. Шаблон можно выбрать из

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

Свойство EditText содержит текст до наложения на него шаблона, то есть то, что ввёл пользователь. Свойство Text может содержать либо исходный текст, либо результат наложения на него маски. Свойство IsMasked доступно только для чтения и содержит true,

если строка шаблона задана.

Шаблон состоит из трех частей, отделенных друг от друга символами «;». Первая часть задает маску ввода, вторая – это символ 0 или 1, определяющий, записывается ли в

Text результат наложения маски или исходный текст (0 – исходный текст). В третьей части указывается символ, который в окне редактора будет стоять в полях,

предназначенных для ввода данных.

Маска состоит из описателей полей ввода, специальных символов и литералов.

Описатель указывает, какой именно символ (один!) может ввести пользователь в данное поле. Литерал вставляется в текст, показываемый в окне редактора, но при вводе курсор перескакивает через литерал и не даёт пользователю возможности изменить его.

Литералами считаются любые символы, кроме описателей полей и специальных символов, а также любой символ, которому предшествует символ «\». Специальные символы формируют дополнительные указания редактору. Если не все требуемые поля ввода заполнены и компонент лишился фокуса ввода, то на экран выводится окно с сообщением, после закрытия которого, курсор устанавливается на позицию, где закончился правильный ввод. Перечень описателей и специальных символов можно найти в литературе [2,5,6].

Редактор Memo

Компонент Memo предназначен для ввода, редактирования и отображения текста. В

отличие от редактора Edit может содержать несколько строк, которые задаются либо свойством Text, либо свойством Lines. Свойство Text используется для доступа ко всему содержимому компонента, а свойство Lines – для работы с отдельными строками.

Редактор Memo может содержать полосы прокрутки ScrollBars.

Многострочный редактор хранит информацию в массиве Lines типа TStrings. Для загрузки текста из файла используется метод LoadFromFile. Для сохранения информации в файле используется метод SaveToFile. При необходимости добавить, удалить, вставить строку используются методы Add, Delete, Insert. Для записи текста в процессе проектирования приложения надо открыть окно редактора String list editor кнопкой,

расположенной в Инспекторе объектов у свойства Lines.

В примере редактор Memo1 очищается, и в него с помощью метода Add выводятся значения из массива целых чисел x. Так как компонент Memo работает со строками, то предварительно выполняется перевод целого числа в строку функцией IntToStr:

Memo1.Lines.Clear;

for i:=0 to n-1 do Memo1.Lines.Add(inttostr(x[i]));

Списки

Простой список ListBox позволяет выбирать один или несколько элементов, может содержать изображения. Элементы списка всегда присутствуют на экране, то есть список всегда раскрыт. Список ComboBox представляет собой комбинацию компонент Edit и ListBox. Имеет несколько модификаций. В отличие от ListBox можно выбирать только один элемент.

Модификации комбинированного списка ComboBox задаются свойством Style: при значении csSimple список всегда раскрыт, значение csDropDown задаёт раскрывающийся список с полем редактирования, csDropDownList позволяет только выбрать строку.

Количество строк, которые отображаются на экране, задаётся свойством DropDownCount.

По умолчанию видно 8 строк. Если в списке больше элементов, то появляется полоса прокрутки. Свойство DroppedDown логического типа определяет, раскрыт ли список (true

– раскрыт).

Свойство ItemIndex хранит индекс выбранной строки. Если ни одна строка не выбрана, ItemIndex = -1. Это свойство задаётся только во время выполнения программы. У

компонента ComboBox дополнительно выбранное значение можно определить по свойству Text.

Работа со списками организуется через свойство Items, имеющее тип TStrings и

представляющее собой совокупность строк списка. Строки нумеруются с нуля, доступ к строке осуществляется по номеру. Например, Items[0], Items[12]. Количество строк хранится в свойстве Count, последняя строка имеет номер Count-1. При добавлении или удалении строк значение свойства Count изменяется.

Метод Add(const S:string) : integer добавляет строку S в конец списка и возвращает номер нового элемента.

Процедура Insert(Index:integer;const S:string) вставляет строку S в позицию Index.

Строки, расположенные на этой позиции и за ней – смещаются.

Процедура Delete(Index: integer) удаляет строку с номером Index. Если такой строки нет, то действие не выполняется и никаких сообщений не выводится. После удаления номера строк корректируются.

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