Палитра компонентов Delphi содержит большое число визуальных компонентов, предназначенных для конструирования пользовательского интерфейса. Библиотеки компонентов для разных версий Delphi строятся по принципу расширения: в первой версии было около 70 компонентов, в третьей более 150, а в состав Delphi 4 входит почти 170 компонентов. Библиотека VCL в Delphi 3 разбита на тринадцать сгруппированных по логическому признаку страниц. Выбрав соответствующую закладку, получаем доступ к компонентам страницы. Для определения назначения отдельных компонентов широко используется оперативная справка.
Стандартные элементы управления располагаются на страницах Standard и Additional. Новые элементы управления в стиле Windows 95/98 на странице Win32. Для совместимости со старыми приложениями на странице Win 3.1 имеются соответствующие компоненты.
Стандартные визуальные компоненты
На странице Standard палитры компонентов Delphi расположены стандартные компоненты, соответствующие интерфейсным элементам Windоws.
TMainMenu
Интерфейсный элемент, называемый меню, предусмотрен стандартными соглашениями по требованию к интерфейсным прикладным программам и используется практически во всех Windows-приложениях. TМainMenu определяет главное меню формы (см. рис. 20). На форму можно поместить сколько угодно объектов этого класса, но отображаться в полосе меню в верхней части формы будет тот из них, который указан в свойстве Menu формы.
Основные возможности, обеспечивающие функционирование меню, реализованы в базовом классе TМenu. В основе данного класса лежит свойство, представляющее собой коллекцию элементов меню. Каждый элемент представляет собой отдельную команду, которая может быть конечной (вызывать функцию приложения) или раскрывать меню более низкого уровня.
К отдельному элементу меню можно обратиться следующим образом:
SomeMenu.Items[1].Caption:= ‘Edit’;
Каждому элементу меню можно придать собственное изображение. Для этого используется свойство Images: TImageList. Картинки должны содержаться в компоненте TImageList.
Для создания опций меню необходимо щелкнуть в правой половине строки Items инспектора объектов. В строке Caption вводится текст опции (рис. 21). Enter – опция готова и можно переходить к следующей.
Для создания подопций нужно щелкнуть мышью по строке ниже опции и ввести первую подопцию (рис. 22). Ввод продолжается, пока не будет создан весь список подопций. Щелкнув по пустому прямоугольнику справа от первой опции, можно ввести вторую опцию.
В названиях опций можно указать символ “&” перед тем символом, который определит клавиши быстрого выбора опции.
Для создания разветвленных меню, то есть таких, у которых подопции вызывают новые списки подопций, необходимо щелкнуть по подопции и нажать Ctrl + .
Свойство Break позволяет создать многоколончатый список подменю. По умолчанию имеет значение mbNone. Два других возможных значения этого свойства используются для создания многоколончатых списков подменю.
Count – количество опций в подчиненном меню.
Default определяет, является ли данная опция подменю умалчиваемой. Если в свойстве Default указано значение True, такая опция выделяется цветом и выбирается двойным щелчком мыши на родительской опции.
Строка Hint для опций меню задает только расширенное сообщение, которое отображается на панели статуса.
Если Checked = True, рядом с опцией появляется галочка.
RadioItem – определяет, зависит ли данная опция от выбора других опций в той же группе GroupIndex. Только одна опция группы может иметь True в свойстве Checked. Рядом с такой опцией вместо галочки изображается круг.
С активизацией элементов меню связано событие OnClick. Код, расположенный в обработчике этого события, будет выполняться, когда пользователь выбирает элемент меню либо с помощью мыши, либо с помощью клавиши. В последнем случае доступ к строчному меню осуществляется по нажатию клавиши F10 (стандартная клавиша среды Windows).
Изменять содержимое пунктов меню можно программным способом. Создадим процедуру, в которой будет добавляться элемент в существующее меню. Это может происходить, например, при нажатии кнопки:
Procedure TForm1.Button1Click(Sender: TObject);
Begin
NewMenuItem:= TМenuItem.Create(File1);
NewMenuItem.Caption:= ‘Новый элемент меню’;
File1.Insert(0, NewMenuItem);
End;
При вызове конструктора Create указывается тот элемент меню (File1), который будет являться владельцем нового элемента. Далее задается название элемента. Метод Insert добавляет новый элемент в указанной позиции меню. При необходимости добавить элемент в конец меню, можно использовать метод Add.
Переменная NewMenuItem должна иметь тип TMenuItem:
Var
NewMenuItem: TMenuItem;
TPopupMenu
Локальное меню – это меню, которое становится доступным, когда пользователь нажимает правую кнопку мыши в рабочей области формы или компонента. Может быть создано для любого оконного компонента. Чтобы связать щелчок правой клавиши мыши на компоненте с раскрытием вспомогательного меню, в свойство PopupMenu компонента необходимо поместить имя компонента-меню. Свойство AutoPopup: Boolean обеспечивает разворачивание меню при щелчке правой кнопкой мыши на элементе управления.
Процессы создания и свойства аналогичны TMainMenu.
На рис. 23 реализовано локальное меню для компонента метка. Содержащиеся в этом меню команды позволяют указать способ выравнивания текста метки – по центру, по левой или по правой границе.
Рис. 23. Пример локального меню для компонента TLabel
Алгоритм действий следующий:
Поместим в форму компонент типа TLabel. Установим значение свойства AutoSize в False. Это дает возможность позиционировать текст метки. Поместим на форму компонент TPopupMenu и в нем создадим три пункта меню: N1, N2, N3. Названия N1, N2, N3 создаются по умолчанию в свойстве Name редактора меню. Для каждой команды меню необходимо определить действия при ее выборе. Это будут изменения значения поля Alignment элемента Label1:
// Выбрана команда “По центру”
Procedure TForm1.N1Click(Sender: TObject);
Begin
Label1.Aligment:= taCenter;
End;
// Выбрана команда “Слева”
Procedure TForm1.N2Click(Sender: TObject);
Begin
Label1.Aligment:= taLeftJustify;
End;
// Выбрана команда “Справа”
Procedure TForm1.N3Click(Sender: TObject);
Begin
Label1.Aligment:= taRightJustify;
End;
TLabel
С помощью статического интерфейсного элемента создаются заголовки для других интерфейсных элементов. Элемент этого типа обычно используется, когда необходимо отобразить текст, который не может быть отредактирован пользователем, например заголовки компонентов, которые не имеют собственного свойства Caption. Для отображения текста, который можно изменять, используются компоненты TEdit или TMemo.
Свойство Autosize указывает, будет ли метка изменять свои размеры в зависимости от помещенного в ее свойство Caption текста: True – будет.
Layout определяет выравнивание текста по вертикали относительно границ метки (tlTop, tlCenter, tlBottom).
Transparent определяет прозрачность фона метки.
WordWrap – разрешает/запрещает разрыв строки на границе слова. Для вывода многострочных надписей: AutoSize=False, WordWrap=True.
TEdit
Строка редактирования – это прямоугольное окно, в котором возможен ввод и редактирование текста. С помощью компонента TEdit можно отображать и нередактируемый текст. Для этого необходимо присвоить свойству ReadOnly значение True.
Свойства:
AutoSelect указывает, будет ли выделяться весь текст в момент получения компонентом фокуса ввода.
AutoSize = True и Border Style = bsSingle, высота компонента автоматически меняется при изменении свойства Font.Size.
BorderStyle определяет стиль обрамления компонента.
MaxLength определяет максимальную длину текстовой строки. Если 0, длина строки не ограничена.
OEMConvert содержит True, если необходимо перекодировать текст из кодировки MS-DOS в кодировку Windows и обратно.
PasswordChar определяет символ, который заменяет собой любой символ текста при отображении в окне. Используется для ввода паролей.
ReadOnly = True, текст не может изменяться.
Событие OnChange возникает после любого изменения текста.
Для компонента TЕdit определены следующие методы:
Clear – удаляет весь текст.
ClearSelection – удаляет выделенный текст.
CopyToClipboard – копирует выделенный текст в Clipboard.
CutToClipboard – копирует выделенный текст в Clipboard, после чего удаляет выделенный текст из компонента.
PasteFromClipboard – заменяет выделенный текст содержимым Clipboard, а если нет выделенного текста, копирует содержимое Clipboard в позицию текстового курсора.
SelectAll – выделяет весь текст.
Информация, вводимая пользователем, может подразделяться на обязательную и дополнительную. Обязательная информация должна вводиться всегда, и поле редактирования не должно оставаться пустым. В этом случае необходимо предусмотреть защиту. Здесь возможны варианты. Например, можно перед использованием содержимого окна сделать проверку
If Edit1.Text = ‘’ Then Begin Edit1.SetFocus; Exit End;
Если окно редактора Edit1 пусто, то в это окно устанавливается фокус ввода и осуществляется выход из процедуры, в которой расположен данный оператор.
В ряде случаев бывает удобно задать тип символов, которые могут быть введены в строке редактирования. Для этого можно использовать обработчик события OnKeyPress. Событие OnKeyPress происходит при каждом нажатии клавиши. Можно разрешить ввод только цифр таким способом:
Procedure Tform1.Edit1KeyPress (Sender: TОbject; Var Key:Char);
Begin
If Not (Key in [‘0’.. ‘9’]) Then Key #27;
End;
Если введенный символ не входит в заданное множество, то значение клавиши обнуляется.
TMemo
Компонент TМemo предназначен для ввода, редактирования и/или отображения достаточно длинного текста. Текст хранится в поле класса TStrings и, таким образом, представляет собой набор строк. К содержимому компонента обращаются, используя свойства Text или Lines. Свойство Text используется для доступа ко всему содержимому компонента, а свойство Lines – для построчного доступа.
Многие свойства аналогичны соответствующим свойствам класса TЕdit. Свойство WordWrap, как у TLabel.
Специфичные свойства: ScrollBars – полосы прокрутки; если WantReturns = True, то нажатие Enter вызывает переход на новую строку, в противном случае – обрабатывается системой; аналогично WantTabs для клавиши Tab
Методы Add, Delete и Insert используются для добавления, удаления и вставки строк. Для работы с областью обмена используются методы CopyToClipboard, CutToClipboard и PasteFromClipboard. Для того чтобы выделить весь текст, используется метод SelectAll, выделенный текст доступен через свойство SelText. Для того чтобы заполнить Memo содержимым текстового файла, можно воспользоваться методом LoadFromFile:
If FileExists(‘c:\autoexec.bat’) Then
Memo1.Lines.LoadFromFile(‘c:\autoexec.bat’);
Написав специальную процедуру, можно организовать ввод информации из компонента Memo.
Создадим приложение, демонстрирующее ввод информации из многострочного редактора.
На форму поместим: компонент TLabel для вывода комментариев; TMemo для ввода информации; TButton для фиксации окончания ввода (рис. 24).
Вспомогательная функция:
{ Функция возвращает подстроку с указанным номером }
Function GetLine(st:string; { строка }
n:integer) { номер подстроки }
:string; { подстрока или ‘’ }
var p:integer;
begin
{ если в начале строки есть пробелы, то удалим их }
while (pos(‘ ‘,st)=1)and (length(st)>0) do
delete(st,1,1);
if n>1 then
repeat
p:=pos(#13,st);
if p <> 0 then
begin
st:=copy(st,p+2,Length(st)-p); // разделитель - два символа: с кодом
//13 и 10; если в начале оставшейся части строки есть пробелы, то удалим их}
while (pos(‘ ‘,st)=1)and (length(st)>0) do
delete(st,1,1); n:=n-1;
end;
until (n=1)or(p=0);
{ здесь st начинается с нужной подстроки }
if n>1 then result:=’’
else
begin
p:=pos(#13,st);
if p <> 0 then result:=copy(st,1,p-1) else result:=st;
end;
end;
Обработчик события:
procedure TForm1.Button1Click(Sender: TObject);
const
SIZE=5; { размер массива }
Var a:array[1..SIZE]of string[30]; i:integer; st:string;
begin
{ ввод элементов массива из поля редактирования формы }
for i:=1 to SIZE do
a[i]:=GetLine(Memo1.Text,i);
{ вывод введенного массива в окно сообщения }
st:=’’;
for i:=1 to SIZE do
st:=st+IntToStr(i)+’ ‘+ a[i]+#13;
ShowMessage(st);
end;
TButton
Компонент TButton представляет собой стандартную кнопку. Кнопка может содержать текст, описывающий выполняемое при ее нажатии действие. Обычно кнопки используются в качестве управляющих элементов в диалоговых панелях.
Кнопкой по умолчанию считается кнопка, которая посылает событие OnClick при нажатии клавиши Enter. Чтобы создать кнопку по умочанию, необходимо присвоить свойству кнопки Default значение True. Кнопкой “Cancel” считается кнопка, которая посылает событие OnClick при нажатии клавиши Esc. Для того чтобы кнопка стала кнопкой “Cancel”, необходимо присвоить свойству Cancel значение True.
Модальными окнами называются такие специальные окна, которые, раз появившись на экране, блокируют работу пользователя с другими окнами вплоть до своего закрытия. Обычно с их помощью реализуется диалог, требующий от пользователя принятия некоторого решения. Для этого в состав модального окна включается несколько кнопок. Если у кнопки определено свойство ModalResult, нажатие на нее приводит к закрытию модального окна и возвращает в программу значение ModalResult как результат диалога с пользователем. В Delphi определены следующие стандартные значения ModalResult:
mrNone – модальное окно не закрывается; mrOk – была нажата кнопка OK;
mrCancel – была нажата кнопка Cancel; mrAbort – –”–”– Abort;
mrRetry – –”–”– Retry; mrIgnore – –”–”– Ignore;
mrYes – –”–”– Yes; mrNo – –”–”– No;
mrAll – –”–”– All;
TCheckBox
Кнопка с независимой фиксацией TСheckBox используется для того, чтобы пользователь мог указать свое решение типа Да/Нет или Да/Нет/Не знаю. Это решение отражается в свойстве State компонента (содержит состояние компонента: cbUnchecked – нет; cbСhecked – да; cbGrayed – не знаю), доступном как для чтения, так и для записи. Переключатели не зависят друг от друга. Checked – содержит выбор пользователя типа Да/Нет.
Следующий пример демонстрирует применение этого компонента. Кнопки с независимой фиксацией позволяют изменить цвет и стиль шрифта в компоненте Memo (рис. 25).
Рис. 25. Применение кнопки с независимой фиксацией
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
If CheckBox1.State = cbChecked Then // Если кнопка выбрана,
Memo1.Font.Style:= [fsItalic] // то стиль – курсив,
Else Memo1.Font.Style:= [ ]; // иначе по умолчанию.
end;
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
If CheckBox2.State = cbChecked Then
Memo1.Font.Color:= clBlue
Else Memo1.Font.Color:= clBlack;
end;
TRadioButton
В отличие от TCheckBox компоненты TRadioButton представляют собой зависимые переключатели, предназначенные для выбора одного из нескольких взаимоисключающих решений. На форму помещается, по меньшей мере, два таких компонента. Если в одном компоненте свойство Checked принимает значение True, во всех других компонентах, расположенных в том же контейнере, это свойство автоматически принимает значение False.
TListBox
Интерфейсный элемент этого типа содержит список элементов, которые могут быть выбраны при помощи клавиатуры или мыши.
В компоненте предусмотрена возможность программной прорисовки элементов, поэтому список может содержать не только строки, но и произвольные изображения.
Определены события:
OnDrawItem – возникает в момент, когда программа должна нарисовать очередной элемент. Обработчик получает ссылку на список выбора Control, индекс изображаемого элемента Index, границы элемента Rect и его состояние State. Прорисовка ведется с помощью свойства Canvas.
OnMeasureItem – возникает только для Style=lbOwnerDrawVariable. Оно предшествует событию OnDrawItem и в ходе его обработки программа должна установить нужную высоту очередного элемента.
Список элементов задается свойством Items. Методы Add, Delete и Insert используются для добавления и вставки строк. Эти методы манипулируют объектом Items (класс TString), который хранит строки, находящиеся в списке. Для того чтобы определить, какой элемент списка выбран, используется значение свойства ItemIndex, а чтобы определить, выбран ли какой-либо элемент – свойство Selected. Сортировка элементов списка производится, если значение свойства Sorted равно True. Вертикальный размер элементов задается значением свойства ItemHeight. Для того чтобы все элементы списка отображались полностью, свойство IntegralHeight должно быть равно True. Свойство MultiSelect позволяет задать возможность одновременного выбора нескольких элементов. Значение SelCount позволяет узнать, сколько элементов выбрано. Число колонок в списке задается значением свойства Columns.
Canvas – канва для программной прорисовки элементов.
Style – определяет способ прорисовки элементов: lbStandart – элементы рисует Windows; для остальных программная прорисовка. (Fixed – элементы имеют одинаковую высоту).
При выборе элемента в списке происходит событие OnClick. Следующий пример демонстрирует выбор элемента списка (рис. 26).
procedure TForm1.ListBox1Click (Sender: TObject);
Var F: String;
begin
F:= ListBox1.Items[ListBox1.ItemIndex];
Label1.caption:= F;
end;
Рис. 26. Пример использования TListBox
TComboBox
Комбинированный список – это интерфейсный элемент, включающий в себя список, статический текст или строку редактирования. Представляет собой комбинацию списка TListBox и редактора TЕdit. Большинство его свойств и методов заимствованы у этих компонентов.
Существует пять модификаций компонента (см. рис. 27), определяемые его свойством Style: csSimple, csDropDown, csDropDownList, csOwnerDrawFixed и csOwnerDrawVariable. В первом случае список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора. В модификации csDropDownList редактор работает в режиме отображения выбора и его нельзя использовать для ввода новой строки (в других модификациях это возможно). csOwnerDrawFixed и csOwnerDrawVariable – для программной прорисовки элементов.
DropDownCount – количество элементов списка, появление которых еще не приводит к необходимости прокрутки списка.
DroppedDown определяет, раскрыт ли в данный момент список. Это свойство доступно также для записи, что позволяет программно управлять состоянием списка.
Событие OnDropDown происходит при изменении состояния списка.
TScrollBar
Управляющий элемент, похожий на полосу прокрутки окна. Используется для визуального управления значением числовой величины.
Свойства:
Kind – ориентация компонента.
LargeChange – “большой” сдвиг бегунка.
Max – максимальное значение диапазона изменения числовой величины.
Min – минимальное значение диапазона изменения числовой величины.
Position – текущее значение числовой величины.
SmallChange – “малый” сдвиг бегунка.
С помощью метода SetParams (Aposition, Amax, Amin:integer) можно сразу установить свойства Position, Max и Min.
Событие OnScroll возникает при любом изменении свойства Position.
Событие OnChange – при изменении параметров методом SetParams.
Пример использования компонента (рис. 28):
procedure TForm1.ScrollBar1Change(Sender: TObject);
Var x: integer;
begin
x:=ScrollBar1.Position;
Label1.Caption:= IntToStr(x);
end;
Рис. 28. Компонент TScrollBar
TGroupBox
Компонент представляет собой стандартную группу элементов. Группа элементов – это прямоугольник, который обрамляет несколько интерфейсных элементов (обычно кнопок с зависимой или независимой фиксацией). Заголовок группы (который отображается в левом верхнем углу прямоугольника) задается с помощью свойства Caption.
TRadioGroup
Этот компонент представляет собой комбинацию GroupBox с набором RadioButton. TRadioGroup – специальный контейнер для размещения зависимых переключателей класса TRadioButton. Каждый размещаемый в нем переключатель помещается в специальный список Items и доступен по индексу, что упрощает обслуживание группы.
В приведенном ниже примере (рис. 29) в зависимости от выбранного переключателя изменяется состояние метки Label1, расположенной на панели Panel1. Свойство Align у панели равняется alTop, у RadioGroup1 это свойство равно alClient.
Рис. 29. Использование TRadioGroup
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
With RadioGroup1 Do
Begin
If Itemindex = 0 then Label1.Caption:= ‘Голубой’;
If Itemindex = 1 then Label1.Caption:= ‘Желтый’;
If Itemindex = 2 then Label1.Caption:= ‘Красный’;
End;
end;
Свойства:
Columns – количество столбцов переключателей;
ItemIndex – индекс выбранного переключателя;
Items – список строк с заголовками элементов.
TPanel
Панель служит для группирования элементов управления и меньших контейнеров. С помощью свойства панели Align можно добиваться пропорционального расположения компонентов при изменении размеров окна.
Свойства:
BevelInner – стиль внутренней кромки.
BevelOuter – стиль внешней кромки.
BevelWidth – ширина кромок в пикселях.
BorderStyle – стиль рамки.
BorderWidth – расстояние в пикселях от внешней кромки до внутренней.
FullRepaint – разрешает/запрещает перерисовку панели и всех ее дочерних элементов при изменении ее размеров.
Cобытие OnResize возникает при изменении размеров компонента.