Лекция № 4

Тема: «Счетчики, списки, флажки, переключатели, закладки»

 

План

1. Ввод и отображение целых чисел

2. Компоненты выбора со списков

3. Переключатели

4. Флажки

5. Компонент Imagelist

6. Закладки

 

1. Ввод и отображение целых чисел

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

В Delphi есть специализированные компоненты, обеспечивающие ввод целых чисел – Updown (Win32) и SpinEdit (Samples).

Компонент Updown превращает окно редактирования Edit в компонент, в котором пользователь может выбирать целое число, изменяя его кнопками со стрелками. Если к тому же установить в true свойство окна ReadOnly, то пользователь просто не сможет ввести в окно какой-нибудь свой текст, и вынужден ограничиться выбором числа. Компонент SpinEdit представляет собой комбинацию Edit и Updown, оформленную как отдельный компонента.

Компонент Updown обладает свойствами:

 

Свойство

Описание

AlignButton

Положение кнопок счетчика относительно поля (правее или левее)

ArrowKeys

Если равно true, то счетчик можно переключать стрелками вверх и вниз

Associate

Задает текстовое поле, с которым связан компонент счетчика

Cursor

Задает указатель мыши при наведении на счетчик

Enabled

Если равно true, то компонент доступный

Height

Высота компонента в пикселях

Hint

Текст всплывающей подсказки

Increment

Задает шаг изменения счетчика

Left

Задает отступ компонента от левого края формы в пикселях

Max

Задает максимальное значение счетчика

Min

Задает минимальное значение счетчика

Name

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

Position

Текущее значение счетчика

ShowHint

Если равно true, то отображается текст всплывающей подсказки

TabOrder

Задает порядок перехода на компонент по клавише TAB

TabStop

Если равно false, то перейти на компонент клавишей TAB будет невозможно

Top

Задает отступ компонента от верхнего края формы в пикселях

Visible

Если равно true, то компонент видимый на форме

Width

Задает ширину компонента в пикселях

Wrap

Если равно true, то счетчик меняет значение по кругу.

 

Свойства компонента SpinEdit похожи на рассмотренные, только имеют другие имена: свойства Min, Max, Position называются соответственно MinValue, MaxValue, Value. В целом компонент SpinEdit во многих случаях удобнее простой комбинации Updown и Edit. Так что, если не нужны какие-то из описанных выше дополнительных возможностей Updown (нестандартное расположение кнопок, изменений значений по "кольцу"), то можно пользоваться компонентом Spinedit. 

 

2. Компоненты выбора из списка

Компоненты Listbox (Standard) и CheckListbox (Additional) отображают списки значений и позволяют пользователю выбрать в них нужную строку. Компоненты позволяют защитить программу от ошибок ввода и ускорить заполнение текстовой информацией путем выбора готовых значений из заданного списка.

Компонент Listbox обладает свойствами:

 

Свойство

Описание

AutoComplite

Если равно true, то можно перейти на строку списка введя первые буквы его текста

Color

Задает цвет фона списка

Columns

Задает количество столбцов для отображения элементов списка

Cursor

Задает указатель мыши при наведении на счетчик

Enabled

Если равно true, то компонент доступный

Height

Высота компонента в пикселях

Hint

Текст всплывающей подсказки

Items

Задает перечень значений списка

Left

Задает отступ компонента от левого края формы в пикселях

Name

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

ShowHint

Если равно true, то отображается текст всплывающей подсказки

Sorted

Если равно true, то элементы списка сортируются по возрастанию

Taborder

Задает порядок перехода на компонент по клавише TAB

Tabstop

Если равно false, то перейти на компонент клавишей TAB будет невозможно

Top

Задает отступ компонента от верхнего края формы в пикселях

Visible

Если равно true, то компонент видимый на форме

Width

Задает ширину компонента в пикселях

 

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

- ItemIndex - номер выбранного строки в списке (нумерация с 0). Если ни одна строка не выбрана, свойство равняется -1;

- Items.Count - общее число строк в списке;

- Items.Strings - массив всех значений списка.

 

С помощью свойства ItemIndex можно узнать индекс выбранной строки в списке. По умолчанию Itemindex = -1. Это означает, что ни один элемент в списке не выбран. Если вы хотите задать этому свойству какое-то другое значение, то есть установить выбор по умолчанию, который будет показан в момент начала работы приложения, то сделать это можно, например, в обработчике события OnCreate формы, введя в него оператор вида:

 

Listbox1.ItemIndex:=0;

 

Все строки списка хранятся в виде массива в свойстве Items.Strings. Чтобы прочитать нужное значение можно использовать запись вида:

 

Listbox1.Items.Strings[i] - где i - номер строки (нумерация с 0).

 

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

 

Listbox1.Items.Strings[Listbox.ItemIndex]

 

Для работы со списком используют следующие методы:

 

Listbox1.Clear; – очищает списка от значений;

Listbox1.Items.Add('текст'); – добавляет в список новую строку;

Listbox1.Items.Delete(listbox.itemindex); – удаляет со списка выделенную строку

Listbox1.SetFocus; – передает фокус списку.

 

Основным событием компонента Listbox есть событие OnClick, которое наступает при нажатии мышкой на строке списка.

Для работы со списками рассмотрим пример.

Пусть имеется форма вида:

 

 

Для того, чтобы в левом списке по умолчанию была выбрана первая строка, необходимо в событии формы OnСreate написать код:

 

procedure TForm1.FormCreate(Sender: Tobject);

begin

//делает активной первую строку

Listbox1.ItemIndex:=0;

end;

 

Кнопка «+» добавляет в левый список содержимое текстового поля. При этом нужно проверить, чтобы текстовое поле не было пустым. Для кнопки напишем код:

 

procedure TForm1.Button1Click(Sender: Tobject);

begin

//если поле не пустое

if Edit1.Text<>''then

begin

//добавляем в список содержание поля

Listbox1.Items.Add(Edit1.Text);

//очищаем поле

Edit1.Text:='';

end

else

begin

//если поле пустое, выдаем сообщение об ошибке

Application.MessageBox('Нет данных,'Ошибка',mb_ok+mb_iconstop);

//ставим курсор в текстовое поле

Edit1.SetFocus;

end;

end;

 

Кнопка "-" удаляет с левого списка выбранную строку. При этом нужно выдать запрос на выполнение операции и проверить, есть ли для удаления выбранная строка. Для кнопки напишем код:

 

procedure TForm1.Button2Click(Sender: Tobject);

begin

//проверим, есть ли выбранная строка для удаления

if Listbox1.ItemIndex<>-1 then

begin

//выдаем запрос на удаление

if Application.MessageBox('Удалить?','Запрос',mb_yesno+ mb_iconquestion)=idyes then

//удаляем строку

Listbox1.Items.Delete(Listbox1.ItemIndex);

end

//если строка для удаления не выбрана

else

//выдаем сообщение об ошибке

Application.MessageBox ('Нет данных для удаления','Ошибка',mb_ok+ mb_iconstop)

end;

 

Кнопка «>» переносит строку с левого списка в правый. При этом нужно проверить, есть ли в левом списке выбранная строка для перемещения. Для кнопки напишем код:

 

procedure TForm1.Button4Click(Sender: Tobject);

begin

//проверим, есть ли в списке выбранная строка для переноса

if Listbox1.ItemIndex<>-1 then

begin

//копируем строку с левого списка в правый

Listbox2.Items.Add(Listbox1.Items.Strings[Listbox1.ItemIndex]);

//удаляем с левого списка скопированную строку

Listbox1.Items.Delete(Listbox1.ItemIndex);

end

//если строка для переноса не выбрана

else

//удаляем сообщение

Application.MessageBox ('Нет данных для переноса','Ошибка',mb_ok+ mb_iconstop)

end;

 

Кнопка «<» идентична кнопке «>», но имена списков нужно поменять.

Кнопка «>>» переносит все элементы с левого списка в правый. Для кнопки напишем код:

 

procedure TForm1.Button3Click(Sender: Tobject);

//опишем переменную-счетчик для цикла

var i:integer;

begin

//организуем цикл по всем строчкам списка

for i:=0 to Listbox1.Items.Count-1 do

begin

//ставим курсор на первую строку списка

Listbox1.ItemIndex:=0;

//копируем строку с левого списка в правый

Listbox2.Items.Add(Listbox1.Items.Strings[Listbox1.ItemIndex]);

//удалим с левого списка скопированную строку

Listbox1.Items.Delete(Listbox1.ItemIndex);

end;

end;

 

Кнопка «<<» идентична кнопке «>>», но имена списков нужно поменять.

Рассмотрим теперь компонент выпадающего списка Combobox. Данный компонент представляет собой комбинацию компонента Listbox и текстового поля Edit. Этот компонент в основном имеет те же свойства и методы, что и Listbox. Однако он имеет и некоторые отличия.

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

 

csDropDown

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

csSimple

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

csDropDownList

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

 

Выбор пользователя или введенный им текст можно определить по значению свойства Text. Все сказанное выше о ItemIndex и о задании его значения по умолчанию справедливо и для компонента Combobox. Причем для Combobox задание начального значения ItemIndex еще актуальнее, чем для Listbox. Если начальное значение не задано, то в момент запуска приложения пользователь не увидит в поле компонента одно из возможных значений списка и, скорее всего, не поймет, что с этим полем надо делать.

Свойство MaxLength определяет максимальное число символов, которые пользователь может ввести в поле редактирования. Если MaxLength = 0, то число вводимых символов не ограничено.

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

Как и в компоненте Listbox, свойство Sorted позволяет упорядочить список по алфавиту. При Sorted = true новые строки в список добавляются не в конец, а по алфавиту.

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

 

3. Переключатели

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

Начнем рассмотрение радиокнопок с компонента RadioGroup (Standard) – панели группы радиокнопок. Это панель, которая может содержать расположенные в столбцах и строках радиокнопки. Компонент имеет свойства:

 

Свойство

Описание

Caption

Заголовок группы, отображаемый в левом верхнем углу рамки

Color

Цвет фона

Columns

Задает количество столбцов для отображения переключателей на панели

Cursor

Задает указатель мыши при наведении на компонент

Enabled

Если равно true, то компонент доступный

Font

Параметры шрифта

Height

Высота компонента в пикселях

Hint

Текст всплывающей подсказки

ItemIndex

Задает номер переключателя, выбранного по умолчанию. Нумерация с 0

Items

Задает перечень названий переключателей

Left

Задает отступ компонента от левого края формы в пикселях

Name

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

ShowHint

Если равно true, то отображается текст всплывающей подсказки

TabOrder

Задает порядок перехода на компонент по клавише TAB

TabStop

Если равно false, то перейти на компонент клавишей TAB будет невозможно

Top

Задает отступ компонента от верхнего края формы в пикселях

Visible

Если равно true, то компонент видимый на форме

Width

Задает ширину компонента в пикселях

 

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

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

В подобных случаях желательно пользовательское расположение кнопок. Такую возможность дают компоненты Radiobutton (Standard), сгруппированные панелью Groupbox (Standard). Панель Groupbox выглядит на форме так же, как RadioGroup, и надпись в ее верхнем левом углу также определяется свойством Caption. Эта панель сама по себе пуста. Ее назначение – служить контейнером для других управляющих элементов, в частности, для радиокнопок Radiobutton.

Рассмотрим свойства радиокнопки Radiobutton.

 

Свойство

Описание

Alignment

Задает размещение подписи переключателя (левее или правее)

Caption

Подпись переключателя

Checked

Если равно true, то переключатель выбран

Color

Задает цвет фона

Cursor

Задает указатель мыши при наведении на компонент

Enabled

Если равно true, то компонент доступный

Font

Параметры шрифта

Height

Высота компонента в пикселях

Hint

Текст всплывающей подсказки

Left

Задает отступ компонента от левого края формы в пикселях

Name

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

ShowHint

Если равно true, то отображается текст всплывающей подсказки

TabOrder

Задает порядок переходу на компонент по клавише TAB

TabStop

Если равно false, то перейти на компонент клавише TAB будет невозможно

Top

Задает отступ компонента от верхнего края формы в пикселях

Visible

Если равно true, то компонент видимый на форме

Width

Задает ширину компонента в пикселях

WordWrap

Если равно true, то надпись может переносится на новую строку

 

Рассмотрим на примере использования переключателей. Пусть имеется форма вида:

 

 

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

Пусть группа переключателей создана с помощью компонента RadioGroup. Код для кнопки будет иметь вид:

 

procedure TForm1.Button1Click(Sender: Tobject);

//опишем дополнительные переменные

var a,b,c:real;

begin

//конвертируем содержимое двух полей в числа

a:=StrToFloat(Edit1.Text);

b:=StrToFloat(Edit2.Text);

//анализируем выбор переключателя

case RadioGroup1.ItemIndex of

//если выбран первый переключатель, считаем сумму

0: c:=a+b;

// если выбран второй переключатель, считаем разницу

1: c:=a-b;

end;

//отображаем ответ в третьем поле

Edit3.Text:=FloatToStr(c);

end;

 

Рассмотрим этот же пример при условии, что переключатели созданы с помощью компонентов Radiobutton. Код для кнопки будет иметь вид:

 

procedureTForm1.Button1Click(Sender: Tobject);

//опишем дополнительные переменные

var a,b,c:real;

begin

//конвертируем содержимое двух полей в числа

a:=StrToFloat(Edit1.Text);

b:=StrToFloat(Edit2.Text);

// если выбран первый переключатель, считаем сумму

if RadioButton1.Checked=true then

c:=a+b

// если выбран первый переключатель, считаем разницу

else

c:=a-b;

//отображаем ответ в третьем поле

Edit3.Text:=FloatToStr(c);

end;

 

4. Флажки

 

Флажки Checkbox (Standard) используются в приложениях в основном для того, чтобы пользователь мог включать и выключать какие-то опции, или для индикации состояния. Флажок имеет свойства:

 

Свойство

Описание

Alignment

Задает расположение подписи переключателя (левее или правее)

Caption

Подпись флажка

Checked

Если равно true, то переключатель выбран

Color

Задает цвет фона

Cursor

Задает указатель мыши при наведении на компонент

Enabled

Если равно true, то компонент доступный

Font

Параметры шрифта

Height

Высота компонента в пикселях

Hint

Текст всплывающей подсказки

Left

Задает отступ компонента от левого края формы в пикселях

Name

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

ShowHint

Если равно true, то отображается текст всплывающей подсказки

TabOrder

Задает порядок перехода на компонент по клавише TAB

TabStop

Если равно false, то перейти на компонент клавишей TAB будет невозможно

Top

Задает отступ компонента от верхнего края формы в пикселях

Visible

Если равно true, то компонент видимый на форме

Width

Задает ширину компонента в пикселях

WordWrap

Если равно true, то надпись может переносится на новую строку

 

Для демонстрации работы с флажками рассмотрим пример. Пусть есть форма вида:

 

 

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

 

procedure TForm1.Button1Click(Sender: Tobject);

//опишем дополнительные переменные

var a,b,c:real;

begin

//конвертируем содержимое полей в числа

a:=StrToFloat(Edit1.Text);

b:=StrToFloat(Edit2.Text);

c:=a+b;

//если выбран первый флажок

if Checkbox1.Checked then

//отображает результат в сообщении

ShowMessage(FloatToStr(c));

 

//если выбран второй флажок

if Checkbox2.Checked then

begin

//отображаем вторую форму

Form2.Show;

//на форме в метке отображаем результат

Form2.Label1.Caption:=FloatToStr(c);

end;

end;

 

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

• создать новую форму Form2 и разместить на ней метку Label1;

• в модуле формы Form1 подключить модуль формы Form2. Это позволит вызвать форму Form2 в коде формы Form1. Для подключения перейдите на форму Form1 и выполните команду File – Use Unit и выберите модуль Unit2. 

 

5. Компонент Imagelist

 

Компонент Imagelist (Win32) используется и как компонент, и как свойство других компонентов – меню, панелей, кнопок, диспетчеров действий. Представляет собой набор изображений одинаковых размеров, на которые можно ссылаться по индексам, начинающиеся с 0. Используется для эффективного управления множеством пиктограмм и битовых матриц.

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

В окне редактора списков изображений вы можете добавить в список изображения, пользуясь кнопкой Add, изъять изображение из списка кнопкой Delete, очистить весь список кнопкой Clear.

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

 

6. Закладки

 

Многостраничные панели позволяют экономить пространство окна приложения, размещая на форме страницы разного содержания. Самым распространенным является компонент PageControl (Win32).

Компонент Pagecontrol имеет свои свойства:

 

Свойство

Описание

Cursor

Задает указатель мыши при наведении на компонент

Enabled

Если равно true, то компонент доступный

Font

Параметры шрифту

Height

Высота компонента в пикселях

Hint

Текст всплывающей подсказки

Images

Задает компонент Imagelist, который содержит перечень изображений для отображения на ярлыках страниц

Left

Задает отступ компонента от левого края формы в пикселях

МultiLine

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

Name

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

Pages[Index]

Доступ к странице по индексу (первая страница имеет индекс 0). Свойство только для чтения.

PageCount

Количество страниц. Свойство только для чтения.

ScrollOpposite

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

ShowHint

Если равно true, то отображается текст всплывающей подсказки

Style

Определяет стиль отображения компонента: tstabs – закладки, tsbuttons – кнопки, tsflatbuttons – плоские кнопки.

TabHeight
и
TabWidth

Высота и ширина ярлыков закладок в пикселях. Если значения этих параметров равны 0, то размеры ярлыков определяется автоматически по размерам надписей на них.

TabPosition

Определяет место расположения ярлыков закладок: tpbottom - внизу, tpleft - слева, tpright - справа и tptop - вверху компонента

TabOrder

Задает порядок перехода на компонент по клавише TAB

TabStop

Если равно false, то перейти на компонент клавишей TAB буде невозможно

Top

Задает отступ компонента от верхнего края формы в пикселях

Visible

Если равно true, то компонент видимый на форме

Width

Задает ширину компонента в пикселях

 

Чтобы задавать и редактировать страницы этого компонента, надо щелкнуть на нем правой кнопкой мыши. В всплывающем меню, вы можете видеть команды: New Page – создать, Delete Page – изъять страницу.

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

Каждая страница имеет следующие основные свойства:

 

Свойство

Описание

Caption

Надпись, которая отображается на ярлыке странице

Cursor

Задает указатель мыши при наведении на компонент

Enabled

Если равно true, то компонент доступный

Font

Параметры шрифта

Height

Высота компонента в пикселях

Hint

Текст всплывающей подсказки

ImageIndex

Индекс изображения, которое может появиться на ярлыке страницы. Нумерация с 0

Left

Задает отступ компонента от левого края формы в пикселях

Name

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

PageIndex

Индекс страницы, по которому можно ссылаться на страницу.

ShowHint

Если равно true, то отображается текст всплывающей подсказки

TabVisible

Если равно true, то страница отображается на форме

Top

Задает отступ компонента от верхнего края формы в пикселях

  

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

 

PageControl1.Pages[i].Show;

 

где i – номер страницы. Нумерация начинается с 0.

Например, чтобы перейти на третью страницу нужно ввести команду:

 

PageControl1.Pages[2].Show;

 

Указанна страница под номером 2, т.к. нумерация страниц начинается с 0. 

 

Вопросы для самоконтроля

1. Опишите компоненты ввода целых чисел. Как называются эти компоненты и какие свойства они имеют?

2. Опишите свойства компонента Listbox. Какие методы для работы со списками вы знаете? Примеры.

3. Опишите компоненты Checkbox и Radiobutton. Какие основные свойства имеют данные компоненты? Как создать различные группы переключателей на одной форме?

4. Опишите компонент Radiogroup. Какие свойства он имеет? Как обратиться к нужному переключателю в группе? Для чего нужен Imagelist и как с ним работать?

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