Дополнительные визуальные компоненты
Компоненты, расположенные на странице Additional (рис. 30) являются дополнением к стандартным визуальным интерфейсным элементам Windows.
Рис. 30. Панель Additional
TBitBtn
Этот компонент является разновидностью стандартной кнопки TВutton. Отличительная особенность – свойство Glyph, с помощью которого определяется растровое изображение, рисуемое на поверхности кнопки. В состав поставки Delphi входит множество рисунков, разработанных для размещения в этих кнопках (каталог Images/Buttons).
Часть свойств кнопка TВitBtn унаследовала у своего родительского класса TВutton.
Свойства:
Glyph – определяет от одного до четырех связанных с кнопкой растровых изображений.
Kind – определяет разновидность кнопки.
Layout – определяет край кнопки, к которой прижимается пиктограмма.
NumGlyphs – определяет количество растровых изображений.
Style – определяет стиль оформления кнопки, зависящий от ОС. Стиль bsNew соответствует Windows 95/NT.
Кнопки BitBtn являются развитием концепции, впервые реализованной в библиотеке Borland Windows Custom Controls (BWCC). Возможен выбор из восьми предопределенных типов кнопок (рис. 31), определяемых значением свойства Kind, и создание собственных путем указания соответствующего набора графических изображений (свойство Glyph).
Рис. 31. Разновидности кнопки BitBtn
Нажатие любой из представленных на рис. 31 кнопок, кроме bkCustom и bkHelp, закрывает модальное окно и возвращает в программу результат mrXXX: bkOk – mrOk, bkCancel – mrCancel и т.д. Кнопка bkClose для модального окна возвращает mrCancel, а для главного окна программы – закрывает его и завершает работу программы. Кнопка bkHelp автоматически вызывает раздел справочной службы, связанной с HelpContext формы, на которую она помещена.
TSpeedButton
Компонент SpeedButton – специализированная кнопка для использования с компонентом Panel. Применяется для создания линеек инструментов и специальных наборов, включающих в себя постоянно нажатые кнопки. Быстрые кнопки позволяют реализовать функции, которые с другими кнопками получить не удается. Например, можно создавать кнопки, которые остаются нажатыми, можно группировать кнопки, можно делать кнопки, меняющие свою гравировку при изменении состояния. SpeedButton может находиться в состояниях Up (верхнее), Disabled (отключено), Down (нижнее) и StayDown (прижатое). Для каждого состояния отображается соответствующий фрагмент гравировки.
Для фиксации кнопка должна быть отнесена к какой-либо группе кнопок (эта группа может состоять из нее одной – вариант одиночной фиксируемой кнопки). Для этого используется свойство GroupIndex:Integer, которое не должно быть равно 0. Поведение кнопки определяется логическим свойством AllowAllUp: если это свойство имеет значение True, утопленная кнопка отпускается только при нажатии любой другой кнопки, входящей в ту же группу; если AllowAllUp=False, кнопку можно освободить повторным щелчком. Индикатором состояния кнопки служит логическое свойство Down, которое имеет значение True, если кнопка утоплена. Свойство доступно для записи, что позволяет изменять состояние программно.
TMaskEdit
Компонент предназначен для ввода текста, соответствующего некоторому шаблону, задаваемому в свойстве String. Если это свойство не задано, то работает как Edit. Свойство EditText содержит текст до наложения на него маски шаблона, а свойство Text – может содержать либо исходный текст, либо результат наложения на него маски шаблона.
Для удобства ввода шаблонов в Delphi есть специальный редактор, содержащий несколько наборов наиболее распространенных шаблонов. Он запускается при нажатии кнопки в поле свойства EditMask в Инспекторе объектов.
TStringGrid
Компонент предназначен для представления данных в табличном виде. Он организует представление фрагментов текста в прямоугольных ячейках по строкам и столбцам, добавляет и удаляет строки и столбцы, организует их прокрутку. В верхней и левой части таблицы имеется фиксированная область, предназначенная для размещения заголовков. Эта область не участвует в прокрутке. Каждая отдельная ячейка таблицы представляет собой строку текста типа String.
Класс TStringGrid является потомком класса TCustomGrid и наследует от него большинство свойств и методов.
Свойства компонента:
BorderStyle определяет наличие или отсутствие внешней рамки таблицы.
ColWidths[Index] – ширина столбца с индексом Index.
DefaultColWidth – ширина столбца по умолчанию.
DefaultRowHeight содержит умалчиваемую высоту рядов.
EditorMode разрешает/запрещает редактирование ячеек. Игнорируется, если свойство Options включает goAlwaysShowEditor или не включает goEditing.
FixedColor определяет цвет фиксированной зоны.
FixedCols определяет количество столбцов фиксированной зоны.
FixedRows определяет количество рядов фиксированной зоны.
GridHeight – высота таблицы.
GridLineWidth – толщина линий, расчерчивающих таблицу.
GridWidth – ширина таблицы.
LeftCol – самый левый столбец, видимый в зоне прокрутки
Options содержит параметры таблицы.
RowCount – количество рядов таблицы.
RowHeights[Index] – высота ряда с индексом Index.
Selection определяет группу выделенных ячеек.
TabStops[Index] разрешает/запрещает выбирать столбец с индексом Index при обходе ячеек клавишей Tab. Игнорируется, если Options не содержит goTabs.
TopRow – номер самого верхнего ряда, видимого в прокручиваемой зоне ячеек.
VisibleColCount – количество столбцов, полностью видимых в зоне прокрутки
VisibleRowCount – количество рядов, полностью видимых в зоне прокрутки.
Содержимое таблицы задается двухмерным массивом строк Cells. Содержимое отдельной ячейки доступно при указании номера колонки и номера ряда, например: Cells[0,0] := ‘Имя’.
Число колонок задается свойством ColCount, число рядов – свойством RowCount. Изменением значения этих свойств можно добавлять или удалять ряды и колонки таблицы. Свойства Col и Row позволяют определить текущую ячейку.
Objects[AСol, ARow : Integer] обеспечивает доступ к списку объектов, связанных с ячейками (ACol, ARow).
Методы:
CellRect(ACol, ARow) – возвращает прямоугольник ячейки по номерам столбца ACol и ряда ARow.
MouseToCell(X, Y, ACol, ARow) – возвращает табличные координаты ячейки ACol и ARow по экранным координатам (X, Y) точки.
Cобытия:
OnColumnMoved и OnRowMoved возникают при перемещении столбца или ряда.
OnDrawCell возникает при необходимости перерисовать ячейку с табличными координатами (Col, Row).
OnGetEditMask и OnGetEditText возникают при редактировании текста. В параметре Value обработчик должен вернуть шаблон или текст для редактора TЕditMask.
OnSelectCell возникает при выделении ячейки.
OnSetEditText возникает при завершении редактирования.
OnTopLeftChanged возникает после изменения значения TopRow или LeftCol в результате прокрутки рабочей зоны.
Создадим приложение с использованием компонента ТStringGrid (рис. 32). Исходная информация вводится в табличном виде.
При нажатии клавиши “Итоги” программа рассчитывает количество медалей, завоеванных спортсменами каждой страны, количество набранных баллов и упорядочивает список команд в соответствии с количеством набранных баллов.
Обработчики событий:
procedure TForm1.FormActivate(Sender: TObject);
// Заполняется шапка таблицы
Const Medal : array [0..4] of String [20] =
(‘Cтрана’, ‘Золотых’, ’Серебряных’, ’Бронзовых’, ’Всего’, ‘Баллов’);
Country : array [0..11] of String [20] =
(‘Австрия’, ‘Германия’, ‘Италия’, ‘Канада’, ‘Нидерланды’,
‘Норвегия’, ‘Россия’, ‘США’, ‘Финляндия’, ‘Швейцария’, ‘Япония’);
Var i : Integer;
begin
For i := 0 To 5 Do
Tabl.Cells [i,0] := Medal [i];
For i := 0 To 11 Do
Tabl.Cells [0,i] := Country [i];
end;
procedure TForm1.Button1Click(Sender: TObject);
var
c,r:integer; { номер колонки и строки таблицы }
s:integer; { всего медалей у команды }
p:integer; { очков у команды }
m:integer; { номер строки с максимальным количеством очков }
buf:array[0..6] of string; { буфер для обмена строк }
i:integer; { номер строки. используется во время сортировки }
begin
for r:=1 to tabl.rowcount do { обработать все строки }
begin
s:=0;
{ вычисляем общее кол-во медалей }
for c:=1 to 3 do
if tabl.cells[c,r] <> ‘’
then s:=s+StrToInt(tabl.cells[c,r])
else tabl.cells[c,r]:=’0';
{ вычисляем количество очков }
p:=7*StrToInt(tabl.cells[1,r])+6*StrToInt(tabl.cells[2,r])+5*StrToInt(tabl.cells[3,r]);
{ вывод результата }
tabl.cells[4,r]:=IntToStr(s);
tabl.cells[5,r]:=IntToStr(p);
end;
{ сортировка таблицы }
for r:=1 to tabl.rowcount-1 do
begin
m:=r; { максимальный элемент - в r-ой строке }
for i:=r to tabl.rowcount-1 do
if StrToInt(tabl.cells[5,i])>StrToInt(tabl.cells[5,m])
then m:=i;
if r <> m then
begin { обменяем r-ую и m-ую строки таблицы }
for c:=0 to 5 do
begin
buf[c]:=tabl.Cells[c,r];
tabl.Cells[c,r]:=tabl.Cells[c,m];
tabl.Cells[c,m]:=buf[c];
end;
end;
end;
end;
TDrawGrid
Компонент создает и обслуживает табличные структуры. В отличие от TSringGrid может содержать графические изображения. Свойства аналогичны свойствам TStringGrid.
TImage
Служит для размещения на форме одного из трех поддерживаемых Delphi типов изображений: растровой картинки, пиктограммы или метафайла. В свойстве Canvas компонента содержится канва, с помощью которой при необходимости программа может отредактировать растровое изображение.
Возможно задание файла, изображение которого будет отображаться в форме как во время создания программы, так и во время ее выполнения. Для задания файла во время создания программы используется свойство Picture. При выборе этого свойства появляется графический редактор, с помощью которого загружается графическое изображение из файла.
Для задания имени файла во время выполнения программы также необходимо присвоить свойству Picture новое значение. Свойство Picture имеет тип TРicture. Вспомогательный объект TРicture обладает методом LoadFromFile, который используется для загрузки графического изображения из указанного файла.
При необходимости вывода каких-либо графических примитивов следует использовать свойство Canvas графического изображения, находящегося в компоненте Image.
Событие:
OnProgress – позволяет получать обратную связь во время выполнения длительной операции загрузки изображения. Параметр Stage содержит состояние процесса загрузки (psStarting – начало, psRunning – идет загрузка, psEnding – процесс завершен). Параметр PercentDone приблизительно указывает процент выполненной работы. Обычно в обработчике события по сигналу psStarting создается индикатор процесса типа TProgressBar, по сигналам psRunning изменяется позиция индикатора, а в момент psEnding индикатор уничтожается.
TShape
Компонент рисует одну из простейших геометрических фигур (рис. 33), определяемых следующим множеством:
stRectangle, stSquare, stRoundRect, stRoundSquare, stEllipse, stCircle – прямоугольник, квадрат, скругленный прямоугольник, скругленный квадрат, эллипс, окружность. Фигура полностью занимает все пространство компонента. Вид геометрической фигуры определяется свойством Shape.
Рис. 33. Компонент TShape
Можно управлять свойствами геометрических фигур через свойство Brush – Color и Style. Свойство Color позволяет задавать цвет геометрической фигуры, а свойство Style – стиль ее заполнения. Например, для того чтобы отобразить прямоугольник, заполненный желтым цветом, необходимо выполнить следующие действия:
Procedure TForm1.FormCreate(Sender : TObject);
Begin
With Shape1 Do
Begin
Shape := stRectangle; //Прямоугольник
Brush.Color := clYellow; // Цвет – желтый
Brush.Style := bsSolid; // Тип заполнения – полное заполнение
End;
End;
TBevel
Предназначен для оформления, например для выделения группы элементов. Свойство Shape определяет вид компонента: прямоугольник, рамка, верхняя линия, нижняя линия, левая линия, правая линия. Style задает стиль компонента.
TScrollBox
Служит контейнером для размещения других компонентов. Его отличительная особенность – возможность прокрутки и, следовательно, экономия пространства формы при необходимости размещения на ней большого количества управляющих элементов.
TCheckListBox
Группирует независимые переключатели, позволяя обратиться к любому из них по индексу.
Свойство Checked[Index] cодержит выбор пользователя типа Да/Нет для переключателя с индексом Index. State[Index] – состояние переключателя с индексом Index:cbUnchecked – нет; cbCheked – да; cbGrayed – не знаю
Событие OnClickCheck наступает при изменении состояния любого переключателя.
TSplitter
Компонент TSplitter используется для разделения клиентской области формы на панели, размер которой можно изменять.
Рассмотрим пример. Расположим в форме два компонента Panel и компонент Splitter между ними (рис. 34). Изменим значение свойства Cursor компонента Splitter на crVSplit, а свойству Align второй панели присвоим значение alClient. Свойству Align компонентов Splitter и первой панели присвоим значение alTop.
Рис. 34. Компонент Splitter1 связан с компонентом Panel1
Для компонента определено событие OnMoved, которое вызывается при любом перемещении компонента мышью.
При попадании курсора мыши в область компонента Splitter курсор изменяет свою форму. Можно изменять размер панелей, передвигая компонент Splitter. Splitter связан с одним из компонентов, расположенных в форме (панелью в нашем примере), правилом – оба имеют одинаковое значение свойства Align (alTop в нашем примере). Так как вторая панель занимает всю клиентскую область, не занятую первой панелью, при изменении размера первой панели изменяется и размер второй панели.
TStaticText
Компонент StaticText имеет ту же функциональность, что и компонент Label. В отличие от Label компонент StaticText является наследником класса TWinControl и благодаря этому имеет ссылку на окно.
TChart
Этот компонент предназначен для графического представления числовых данных. Компонент содержит большое количество специфических свойств. Общая схема его использования такова.
Компонент помещается на форму. Двойным щелчком мыши по компоненту вызывается многолистное окно редактора компонента. Закладка Series этого окна открывает доступ к так называемым сериям – объектам класса TСhartSeries, которые отображают наборы чисел в графическом виде. Чтобы отобразить данные, нужно создать как минимум одну серию – для этого следует в окне редактора нажать кнопку Add и выбрать подходящий тип графика.
После закрытия редактора компонент будет содержать примерный вид графика. Его реальный вид зависит от фактических данных, которые создаются в работающей программе и добавляются к серии с помощью методов AddX, AddY, AddXY объекта TСhartSeries. Например, такой обработчик события OnActivate формы создал график, показанный на рис. 35:
procedure TForm1.FormActivate(Sender: TObject);
Var y : array [1..10] Of Integer; x: integer;
begin
For x := 1 To 10 Do
y[x] := sqr(x);
For x := 1 To 10 Do
Chart1.Series[0].addxy(x,y[x],’’,clRed);
end;