SNK Software
Web Studio Монополия Metaproducts Утилиты Игры
Монополию Web Studio Библиотека
Вебмастер Дельфи Работа на ПК Самоучитель
Для PHP Для Delphi
Веб-дизайн Программирование Компьютеры Девайсы Заметки
SNK Software Индустрия hardware Индустрия software
О студии Портфолио Сопровождение сайтов

Новые материалы

Девайсы:
Сравнительный обзор Nokia Lumia 920 и HTC 8X
Девайсы:
Обзор Nokia Lumia 820 – смартфона на WP8
Вебмастеру:
Настройка Apache, PHP и MySQL для Linux-VPS
Вебмастеру:
VPS на домашнем ПК: настройка сети в VM VirtualBox и Debian
Вебмастеру:
VPS на домашнем ПК: устанавливаем Linux Debian 6
Вебмастеру:
VPS на домашнем ПК: установка VM VirtualBox
Работа на компьютере:
Иные возможности текстового процессора Word
Работа на компьютере:
Вставка объектов
Работа на компьютере:
Таблицы в Word
Работа на компьютере:
Печать и сохранение документов
Работа на компьютере:
Сноски, колонтитулы, оглавление и указатели в Word

Дополнительные VCL-компоненты

Помимо уже рассмотренных компонентов, VCL включает в себя ряд иных компонент, одни из которых, например, кнопка с рисунком (BitButton), являются просто расширенными версиями стандартных элементов управления, а другие представляют собой что-то принципиально новое - например, таблицы Grid. Кроме того, библиотеку VCL можно пополнять путем установки дополнительных компонент, как разработанных третьими разработчиками, так и собственными. Наконец, Delphi поддерживает технологию ActiveX, что позволяет внедрять целые приложения непосредственно в разрабатываемую программу.

Кнопки

Помимо стандартной кнопки (Button), в VCL имеются еще 2 компонента, реализующих этот важный элемент интерфейса. Один из них, компонент BitButton, или кнопка с рисунком, является расширенным вариантом кнопки. Этот компонент находится на закладке Advanced палитры инструментов.

Основное отличие этого компонента по сравнению с Button состоит в том, что помимо текстовой надписи, BitButton может содержать изображение, задаваемое через свойство Glyph типа TBitmap. Это изображение можно разместить слева от текста, справа, снизу, или сверху, за что отвечает свойство Layout (см. рис. 16.1). Кроме того, предусмотрено 10 стандартных типов этих кнопок для всех часто встречающихся операций в модальных диалоговых окнах. Тип задается при помощи свойства Kind, и не только добавляет соответствующие надпись и рисунок, но и устанавливает в необходимое значение свойство ModalResult (рис. 16.1).

Выравнивание рисунка и типы кнопок Delphi
Рис. 16.1. Выравнивание рисунка и типы кнопок

Для более точного позиционирования картинки относительно надписи можно использовать свойство Spacing, а при помощи свойства Margin можно регулировать отступы от рисунка до края кнопки.

Еще одно дополнительное свойство компонента BitButton - NumGlyphs, позволяет использовать составные картинки. Например, если использовать рисунок размером 20 на 40 пикселей, то при NumGlyphs, установленном в 2, в обычных условиях будет отображаться его левая половина (фрагмент 20 на 20). Если же сделать кнопку недоступной (свойство Enabled), то отобразится вторая, правая часть рисунка. Таким образом можно визуально подчеркивать состояние кнопки.

Другой вариант кнопки, располагающийся по соседству с BitButton на палитре компонентов - это SpeedButton, или "быстрая кнопка". Обычно такой элемент интерфейса используют для вызова команд или установки какого-либо режима. В последнем случае довольно часто применяют триггерный эффект, для чего объединяют несколько кнопок в группу. Для этих целей у компонента SpeedButton предусмотрено свойство GroupIndex: все такие кнопки, имеющие одно и тот же значение этого свойства, отличное от 0, объединяются в общую группу. При этом узнать, какая кнопка в группе является выбранной, можно при помощи свойства Down: если оно установлено в истину, значит, данная кнопка выбрана ("нажата").

Другими собственными свойствами компонента SpeedButton являются уже знакомые нам по BitButton свойства Glyph, Layout, Margin, NumGlyphs и Spacing. Их предназначение полностью соответствует таковому у одноименных свойств у BitButton.

Важным отличием компонента SpeedButton от кнопки с рисунком, как, впрочем, и от обычной кнопки Button, является то, что он основан на классе TGraphicControl. Таким образом, несмотря на ряд общих с BitButton черт, этот компонент является совершенно другим по своей сути, и, прежде всего, не может получить фокус ввода с клавиатуры. Соответственно, SpeedButton следует использовать в тех случаях, когда получение фокуса ввода кнопкой нежелательно. Как правило, это кнопки на панелях инструментов.

Кроме того, у "быстрой кнопки" имеется еще одно свойство - Flat, которое определяет внешний вид такой кнопки. Если это свойство установлено в истину, то сама кнопка становится прозрачной, и визуально выделяется лишь во время выполнения программы - при наведении на нее указателя мышки.

Таблицы

Как известно, таблицы представляют собой удобное средство для представления данных, разбитых на строки и столбцы. На закладке дополнительных компонент вы найдете 2 компонента, являющихся реализацией таблиц в VCL. Это StringGrid и DrawGrid. Оба они позволяют выводить любые данные, включая текст и изображения в свои ячейки, однако компонент DrawGrid автоматически выводит лишь сетку, разделяющую ячейки, а вывод собственно информации следует программировать самостоятельно. Что касается компонента StringGrid, то с его помощью без лишних хлопот можно выводить в ячейки текстовую информацию.

Математически таблицу можно представить как 2-мерный массив (матрицу). Именно так и организовано хранение текстовой информации у компонента StringGrid, одним из наиболее важных свойств которого можно считать Cells. Это свойство, доступное только во время выполнения, определено как матрица строк, где 1-й индекс определяет столбец, а 2-й - ряд:

Cells[ACol, ARow: Integer]: string;

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

Objects[ACol, ARow: Integer]: TObject;

Для удобства доступа к информации определены еще 2 свойства - Cols и Rows, которые представляют собой одномерные массивы столбцов и рядов таблицы, представленных в виде объектов TStrings:

Cols[Index: Integer]: TStrings; Rows[Index: Integer]: TStrings;

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

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

Таблица 16.1. Свойства таблиц в Delphi
СвойствоТипОписание
BorderStyleTBorderStyleОпределяет, должна ли быть рамка вокруг таблицы
ColLongintУказывает на индекс столбца, в котором находится выбранная в данный момент ячейка
ColCountLongintОпределяет количество столбцов в таблице
ColWidthsмассив IntegerОпределяет ширину каждого столбца в пикселях
DefaultColWidthIntegerОпределяет ширину столбцов по умолчанию
DefaultRowHeightIntegerОпределяет высоту рядов по умолчанию
EditorModeBooleanОпределяет режим текущей ячейки: истина - режим правки, ложь - режим просмотра
FixedColorTColorОпределяет цвет фона для фиксированных (заголовочных) ячеек
FixedColsIntegerОпределяет число фиксированных столбцов
FixedRowsIntegerОпределяет число фиксированных рядов
GridLineWidthIntegerОпределяет толщину разделяющих ячейки линий
LeftColLongintОпределяет первый видимый столбец таблицы слева
OptionsTGridOptionsОпределяют параметры вида и поведения таблицы
RowLongintУказывает на индекс ряда, в котором находится выбранная в данный момент ячейка
RowCountLongintОпределяет количество рядов в таблице
RowHeightsмассив IntegerОпределяет высоту каждого ряда в пикселях
ScrollBarsTScrollStyleОпределяет наличие полос прокрутки: ssNone, ssHorizontal, ssVertical, ssBoth
TopRowLongintОпределяет первый видимый ряд таблицы сверху
VisibleColCountIntegerУказывает на количество одновременно видимых столбцов
VisibleRowCountIntegerУказывает на количество одновременно видимых рядов

Применительно к приведенным свойствам следует сделать 2 пояснения. Прежде всего, каждая таблица может содержать заголовочные ячейки, которые не прокручиваются вместе с остальными ячейками таблицы и видны всегда. Это характерно для любых электронных таблиц: например в Excel это ячейки, содержащие номера рядов и столбцов. При этом по умолчанию определено по 1 ряду и столбцу - как в Excel, однако вы можете изменить эти значения, отказавшись от заголовков вообще или наоборот, добавив дополнительные фиксированные ряды или столбцы.

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

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

Простейший табличный редактор

Чтобы лучше понять работу таблиц, рассмотрим компонент StringGrid на примере приложения, которое может редактировать таблицы, а так же сохранять их в текстовых файлах, или считывать из них. В качестве формата файла можно использовать либо текст с табуляцией, либо формат CSV (с разделителями точка с запятой). Мы реализуем поддержку обоих форматов, используя расширение файла в качестве критерия: если txt - то табуляция, а если csv - значит точка с запятой.

Для нового приложения используем 2 основных компонента - панель инструментов (ToolBar) и собственно таблицу (StringGrid). При помещении на форму компонент ToolBar - назовем его MainTb - автоматически примет выравнивание по верхнему краю. Что касается таблицы, то для нее мы установим свойство Align в alClient, чтобы она заняла все оставшееся пространство. Чтобы вид и возможности таблицы лучше соответствовали предназначению нашей программы, уменьшим высоту ряда до 20 пикселей (свойство DefaultRowHeight), а ширину колонок сделаем изменяемой, установив включенным флаг goColSizing в свойстве Options. Так же удалим фиксированную колонку, установив свойство FixedCols в 0.

Теперь вернемся к панели инструментов. Как минимум, нам понадобятся 2 кнопки: для открытия и сохранения файла. Вместе с тем, поскольку изначально отведено всего по 5 строк и рядов, то не помешает дать пользователю возможность добавлять дополнительные строки и ряды. Сделаем обе эти функции на одной кнопке, воспользовавшись ее способностью к совмещению с всплывающим меню. Для этого установим свойство Style 3-й кнопки в tbsDropDown, и разместим на форме еще один компонент, PopupMenu, назвав его, скажем, AddRowColDdm, после чего присвоим свойству DropDownMenu этой кнопки значение AddRowColDdm.

Наконец, предусмотрим еще и различные режимы работы с таблицей - только просмотр или просмотр в правкой. Для этого на панели инструментов нам понадобятся еще 2 кнопки, для которых мы реализуем триггерный эффект. Для этого у обеих кнопок следует установить свойство Grouped в истину, а свойство Style - в tbsCheck. На этом же этапе следует определиться с режимом по умолчанию. Оставим его таким, как есть, т.е. без возможности правки. Соответственно, для кнопки, включающей режим "только просмотр" установим свойство Down в истину. Еще одна кнопка, которую, при желании, можно добавить на панель инструментов - это кнопка выхода из программы.

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

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

Визуальная часть разработки табличного редактора в Delphi
Рис. 16.2. Визуальная часть разработки табличного редактора

Следующим этапом будет разработка методов загрузки и сохранения таблиц. Начнем с загрузки, тем более что тестовую таблицу можно создать и сохранить в любом табличном редакторе, скажем, в Excel или в Calc.

Для реализации функции считывания файла и размещения информации в ячейках таблицы, воспользуемся классом TStringList и предоставляемой им функциональностью. В частности, для того чтобы считать файл, достаточно использовать его метод LoadFromFile. После этого останется лишь обработать каждую строку, представив ее так же в виде объекта класса TStringList с тем, чтобы присвоить его в качестве значения свойства Rows таблицы. Для этого нам понадобится сервисная функция, которая и будет делать данную операцию. Назовем ее StringToList:

function StringToList(str: string; sep: char):TStringList; var x: integer; s: string; begin Result:=TStringList.Create; repeat x:=pos(sep,str); if x>0 then Result.Add(copy(str,1,x-1)) else begin s:=copy(str,1,length(str)); if s<>'' then Result.Add(s); end; delete(str,1,x); until x=0; end;

Данная функция принимает 2 аргумента: саму строку для преобразования, а так же символ-разделитель, по которому строка должна будет разделяться на элементы списка. Применительно к нашей программе в качестве такого символа может использоваться либо знак табуляции (#9), либо точка с запятой (#59). В самом начале создается экземпляр класса TStringList для результата функции, после чего выполняется цикл с постусловием до тех пор, пока в строке находится хоть 1 разделитель. Эта проверка выполняется первой в теле цикла, после чего нужная часть строки копируется и вставляется в список. Таким образом, на выходе мы получаем список строк, который можно будет присвоить свойству Rows. Вместе с тем, учитывая, что строк, как правило, будет больше одной, вызов функции StringToList так же следует разместить в цикле, который будет повторяться по всем строкам того списка, в который изначально был загружен файл. В результате мы получаем примерный набросок кода самой процедуры загрузки файла:

procedure TMainFrm.LoadData(fn: string); var lst, rlst: TStringList; sep: Char; i: integer; begin lst:=TStringList.Create; lst.LoadFromFile(fn); if ExtractFileExt(fn)='.csv' then sep:=#59 else sep:=#9; for i:=1 to lst.Count do begin rlst:=StringToList(lst[i-1],sep); DataSg.Rows[i]:=rlst; end; lst.Free; end;

Отметим, что поскольку данная процедура взаимодействует с элементами формы, то мы сделали ее методом класса MainFrm. Стандартная функция ExtractFileExt используется для определения того, какой разделитель следует применить, в зависимости от расширения файла, после чего функция StringToList вызывается с нужным значением. В завершение своей работы эта процедура освобождает занимаемую списком память. Таким образом, обработчик события OnClick для кнопки загрузки таблицы будет выглядеть таким образом:

if not OpenDlg.Execute then exit; LoadData(OpenDlg.FileName); Caption:=OpenDlg.FileName;

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

Вместе с тем, данная процедура не лишена недостатков. Прежде всего, она не устанавливает размеры таблицы в соответствии с реальными размерами загруженного файла. Кроме того, следует учитывать, что в процессе считывания файла могут возникать ошибки - попробуйте открыть тестовый файл сначала в Excel, а затем, не закрывая его в нем, попытаться открыть в созданной программе, и вы получите ошибку доступа к файлу. Таким образом, нам надо, во-первых, изменять размеры таблицы, а во-вторых - заключить блок обработки в оператор try…finally:

lst:=TStringList.Create; try lst.LoadFromFile(fn); if ExtractFileExt(fn)='.csv' then sep:=#59 else sep:=#9; for i:=1 to lst.Count do begin rlst:=StringToList(lst[i-1],sep); DataSg.Rows[i]:=rlst; if rlst.Count>DataSg.ColCount then DataSg.ColCount:=rlst.Count; end; DataSg.RowCount:=lst.Count+1; finally lst.Free; end;

Более того, для того, чтобы проинформировать вызывающую процедуру о результате выполнения этой подпрограммы, нам нужна не процедура, а функция с возвращаемым значением типа Boolean. При этом значение результата в истину следует разместить в последней строке, после блока try…finally: если произойдет ошибка, то до выполнения присваивания "Result:=true" дело не дойдет. Сама же вызывающая процедура (обработчик события OnClick) может реагировать на удачную загрузку файла выводом его пути в строке заголовка окна, а в случае неудачи - не делать ничего:

if LoadData(OpenDlg.FileName) then Caption:=OpenDlg.FileName;

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

function ListToString(lst: TStringList; sep: Char):string; var i: integer; begin Result:=''; for i:=0 to lst.Count-1 do begin Result:=Result+lst[i]+sep; end; end;

Соответственно, сама процедура сохранения должна будет последовательно обойти все ряды таблицы, "склеивая" ячейки в строку через разделитель. Сделать это, опять-таки, можно через свойство Rows. Единственным подводным камнем здесь является то, что свойство Rows[], на самом деле, представлено абстрактным классом TStrings. Впрочем, это ограничение легко обходится путем явного приведения класса TStrings к TStringList:

for i:=1 to DataSg.RowCount do begin lst.Add(ListToString(TStringList(DataSg.Rows[i]),sep)); end;

После этого останется лишь создать обработчики для оставшихся кнопок. В частности, для триггеров, переключающих таблицу между режимами просмотра и правки, следует написать код, который будет добавлять, или наоборот, удалять флаг goEditing из свойства Options. А для добавления столбцов или рядов достаточно увеличивать на 1 значение свойств ColCount и RowCount. Итоговый код программы приведен в листинге 16.1.

Листинг 16.1. Табличный редактор

unit main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ImgList, ComCtrls, ToolWin, Grids, Menus; type TMainFrm = class(TForm) DataSg: TStringGrid; MainTb: TToolBar; OpenBtn: TToolButton; SaveBtn: TToolButton; AddBtn: TToolButton; OpenDlg: TOpenDialog; SaveDlg: TSaveDialog; MainTbIl: TImageList; AddRowColDdm: TPopupMenu; AddRowM: TMenuItem; AddColM: TMenuItem; ToolButton1: TToolButton; ViewBtn: TToolButton; EditBtn: TToolButton; ToolButton2: TToolButton; CloseBtn: TToolButton; ToolButton3: TToolButton; procedure OpenBtnClick(Sender: TObject); procedure SaveBtnClick(Sender: TObject); procedure AddRowMClick(Sender: TObject); procedure AddColMClick(Sender: TObject); procedure ViewBtnClick(Sender: TObject); procedure EditBtnClick(Sender: TObject); procedure CloseBtnClick(Sender: TObject); public function LoadData(fn: string):boolean; function SaveData(fn: string):boolean; end; var MainFrm: TMainFrm; implementation {$R *.dfm} function StringToList(str: string; sep: char):TStringList; var x: integer; s: string; begin Result:=TStringList.Create; repeat x:=pos(sep,str); if x>0 then Result.Add(copy(str,1,x-1)) else begin s:=copy(str,1,length(str)); if s<>'' then Result.Add(s); end; delete(str,1,x); until x=0; end; function ListToString(lst: TStringList; sep: Char):string; var i: integer; begin Result:=''; for i:=0 to lst.Count-1 do begin Result:=Result+lst[i]+sep; end; end; function TMainFrm.LoadData(fn: string):boolean; var lst, rlst: TStringList; sep: Char; i: integer; begin lst:=TStringList.Create; try lst.LoadFromFile(fn); if ExtractFileExt(fn)='.csv' then sep:=#59 else sep:=#9; for i:=1 to lst.Count do begin rlst:=StringToList(lst[i-1],sep); DataSg.Rows[i]:=rlst; if rlst.Count>DataSg.ColCount then DataSg.ColCount:=rlst.Count; end; DataSg.RowCount:=lst.Count+1; finally lst.Free; end; Result:=true; end; function TMainFrm.SaveData(fn: string):boolean; var lst: TStringList; sep: Char; i: integer; begin lst:=TStringList.Create; if ExtractFileExt(fn)='.csv' then sep:=#59 else sep:=#9; for i:=1 to DataSg.RowCount do begin lst.Add(ListToString(TStringList(DataSg.Rows[i]),sep)); end; try lst.SaveToFile(fn); finally lst.Free; end; Result:=true; end; procedure TMainFrm.OpenBtnClick(Sender: TObject); begin if not OpenDlg.Execute then exit; if LoadData(OpenDlg.FileName) then Caption:=OpenDlg.FileName; end; procedure TMainFrm.SaveBtnClick(Sender: TObject); begin if not SaveDlg.Execute then exit; if SaveData(SaveDlg.FileName) then Caption:=SaveDlg.FileName; end; procedure TMainFrm.AddRowMClick(Sender: TObject); begin DataSg.RowCount:=DataSg.RowCount+1; end; procedure TMainFrm.AddColMClick(Sender: TObject); begin DataSg.ColCount:=DataSg.ColCount+1; end; procedure TMainFrm.ViewBtnClick(Sender: TObject); begin DataSg.Options:=DataSg.Options-[goEditing]; end; procedure TMainFrm.EditBtnClick(Sender: TObject); begin DataSg.Options:=DataSg.Options+[goEditing]; end; procedure TMainFrm.CloseBtnClick(Sender: TObject); begin close; end; end.

Исходный код так же можно найти в каталоге Demo\Part3\Grid.

Другие дополнительные компоненты

На закладке Additional можно обнаружить еще целый ряд компонентов. Например, ValueListEditor, является частным случаем таблицы, предназначенной для правки пар типа "имя-значение". Основными его свойствами можно считать Keys и Values. Первое представляет собой массив значений левого столбца ("имён"), а второе позволяет по имени найти соответствующее ему значение во втором столбце. Например, если в левом столбце будут следующие значения: цвет, размер и цена, а во втором - красный, 100 и $250, то выражение "Values['цвет']" даст результат "красный".

Расположенный рядом с ValueListEditor компонент LabeledEdit представляет собой "2 компонента в 1" - метку (Label) и однострочный редактор (Edit). В результате он обладает набором свойств, характерных для обоих этих компонентов. А за расположение надписи относительно текстового поля отвечает свойство LabelPosition, которое может принимать значения lpAbove, lpBelow, lpLeft и lpRigth для расположения подписи сверху, снизу, слева или справа от редактора.

Еще одним компонентом, совмещающим в себе несколько, является CheckListBox, или список опций. Он основан на обычном списке (ListBox), однако каждый его элемент, фактически, представляет собой компонент типа CheckBox. Заполняется значениями такой список опций точно так же как обычный список, а проверить состояние того или иного переключателя можно при помощи специального свойства Checked, являющегося массивом, хранящим данные типа Boolean. При этом каждый элемент этого массива соответствует строке списка, а его значение (ложь или истина) указывает на то, отмечена опция или нет.

Компонент ColorBox является элементом интерфейса, предназначенным специально для выбора цвета. Цвет, установленный по умолчанию назначается через свойство DefaultColorColor, а выбранный пользователем цвет доступен во время выполнения через свойство Selected. За доступные цвета и формат вывода названий цветов отвечает свойство Style, имеющее следующий набор флагов:

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

Еще один, довольно интересный компонент, который находится на закладке дополнительных компонент - это Chart. С его помощью можно создавать графики и диаграммы самого разнообразного вида. Для этого достаточно поместить компонент на форму и дважды щелкнуть по нему, чтобы открылось окно редактирования диаграммы (рис. 16.3).

Редактор диаграмм в Delphi
Рис. 16.3. Редактор диаграмм Delphi

Чтобы создать диаграмму, следует нажать на кнопку Add, после чего в открывшемся окне галереи выбрать нужный тип диаграммы. Сразу после этого на панели отобразится пример выбранной диаграммы, заполненной произвольными значениями. Однако если сразу же запустить программу на выполнение, панель окажется пустой, поскольку примеры видны только на этапе проектирования. Поэтому следует прибегнуть к программному коду, чтобы заполнить диаграмму значениями. Наиболее простой и наглядный метод - это использование метода Add для свойства Series. Например, чтобы заполнить круговую диаграмму, отображающую доли 6 различных значений, можно использовать следующий код:

Chart1.Series[0].Add(135,'Домашние сети'); Chart1.Series[0].Add(123,'ADSL'); Chart1.Series[0].Add(99,'Коммутируемые'); Chart1.Series[0].Add(52,'Кабельные сети'); Chart1.Series[0].Add(19,'GPRS'); Chart1.Series[0].Add(17,'Другие типы');

Для выбора заголовка диаграммы используется свойство Text.Title, являющееся списком строк. В типичном случае следует лишь изменить 0-й элемент этого списка, который по умолчанию имеет значение "TCart":

Chart1.Title.Text[0]:='Типы подключения к Интернету в Москве';

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

Построенная диаграмма
Рис. 16.4. Построенная диаграмма

Так же возможна печать диаграммы, для чего у компонента Chart имеется метод Print, так что выводить построенные диаграммы на печать чрезвычайно просто:

Chart1.Print;

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

Компоненты ActiveX

Помимо компонентов VCL, Delphi может работать с инородными компонентами, созданными на основе любых иных программ, используя технологию ActiveX. На закладке ActiveX присутствует насколько таких компонент:

На самом деле, использовать все эти компоненты вряд ли имеет смысл, поскольку, например, вместо тех же ChartFx и VtChart можно использовать "родной" VCL-компонент Chart, а для двух оставшихся так же можно найти замену, обратившись к каталогам VCL-компонент в Интернете.

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

Вместе с тем, существует, по крайней мере, одно ActiveX-приложение, для которого, с одной стороны, вряд ли удастся найти подходящую замену, написанную на Delphi, а с другой, которое не требуется устанавливать, поскольку оно и так уже имеется практически у 100% пользователей Windows. Это компонент WebBrowser, расположенный на закладке Internet. Он представляет собой интерфейс к MS Internet Explorer, и позволяет использовать все основные возможности браузера в создаваемом приложении.

ПРИМЕЧАНИЕ
На самом деле, здесь тоже не все гладко, поскольку у разных пользователей будут разные версии MSIE. И хотя данный компонент может работать с любой версией, начиная с 5.0, отличия в самом "движке" MSIE иногда могут служить причиной непредсказуемого результата при отображении выводимой через этот компонент информации.

Чтобы дополнить любое приложение средствами просмотра HTML-документов и даже навигации в Интернете, достаточно поместить компонент WebBrowser на форму. Основным методом WebBrowser можно считать Navigate - именно он загружает указанную ссылку. Для примера создадим новое приложение, поместим на его главную форму панель, на которой, в свою очередь, должны будут разместиться адресная строка (назовем ее AddressEd) и кнопка перехода (NavBtn). Для панели установим выравнивание в alTop, после чего поместим на форму компонент WebBrowser и установим для него выравнивание в alClient, а имя - в IEWb. Теперь для события OnClick кнопки напишем единственную строку кода:

IEWb.Navigate(AddressEd.Text);

Вот, собственно, и все, мы получили практически полноценный браузер минималиста (рис. 16.5).

Программа-браузер на Delphi из 1 строки набранного кода
Рис. 16.5. Программа-браузер на Delphi из 1 строки набранного кода

Для удобства использования можно установить свойство Default кнопки NavBtn в истину, чтобы переход на набранную в адресной строке страницу осуществлялся непосредственно при нажатии на клавишу Enter (см. пример в Demo\Part3\Megabrws).

Установка компонентов

Как ни широка имеющаяся в Delphi коллекция VCL, иногда может возникать необходимость в использовании дополнительных компонентов. Главным условием является поддержка компонентом той же версии Delphi, что вы используете. В принципе, если компонента поставляется вместе с исходными кодами (а другие, честно говоря, лучше вообще не использовать), то есть большая вероятность того, что она заработает и в другой, версии Delphi, особенно если эта версия - более новая. Такая совместимость "сверху вниз" характерна для любого программного обеспечения, впрочем, для Delphi 5-7, как правило, подходят компоненты, написанные для Delphi 4, особенно если они являются самодостаточными, т.е. не интегрируются в VCL, а работают сами по себе (например, тот же Chart). Несколько сложнее дело обстоит с наборами (коллекциями) компонент, поскольку они используют специальные установочные файлы, формат которых может подвергаться некоторым изменениям от версии к версии Delphi.

Так или иначе, попробуем расширить VCL путем установки одного простого компонента. Для примера обратимся к компоненту WebLabel, который находится в каталоге Demo\Part3\WebLabel. Данный компонент представляет собой специальную метку, которая отличается от стандартного компонента Label тем, что имеет дополнительное свойство URL, в котором задается web-адрес. Указанный в URL адрес должен будет открыться браузером при щелчке пользователя по метке. Для установки компонента рекомендуется сначала закрыть проект в Delphi (File ' Close All), после чего открыть диалоговое окно установки компонента (Component ' Install Component).

При помощи диалога Install Component можно устанавливать единичные компоненты как в существующие пакеты (Packages), так и в новые. Чтобы не нарушать без надобности имеющиеся стандартные пакеты, воспользуемся возможностью создания нового пакета, для чего выберем закладку "Into new package". В ней заполним пустые поля, а именно Unit file name - имя файла компонента, Package file name - имя файла пакета и Package Description - описание пакета (рис. 16.6).

Диалог установки компонента в новый пакет
Рис. 16.6. Диалог установки компонента в новый пакет

При этом полезно предварительно создать отдельный каталог, в котором можно будет размещать все компоненты данного пакета. А для того, чтобы компилятор мог найти нужные файлы, этот каталог следует добавить к пути поиска (Search path), через точку с запятой после последнего указанного в нем каталога.

После того, как вы нажмете на кнопку ОК, Delphi запросит подтверждение на создание и установку пакета, с чем надо будет согласиться. После этого пакет будет собран, а компонент - добавлен на одну из закладок палитры, в данном случае - на Samples, он там будет последним. После этого следует сохранить проект пакета и можно приступать к использованию компонента, для чего достаточно создать новое приложение, поместить компонент на форму. Затем можно изменить значения свойств Caption и URL, после чего остается запустить программу и щелкнуть по надписи. В результате откроется программа просмотра Интернета и загрузит указанный адрес.

Если же устанавливать компонент в уже существующий пакет, то после диалога Install Component откроется окно пакета, в котором вам будет надо сначала нажать на кнопку компиляции (Compile), а затем - установки (Install). Конечный результат будет тем же: новый компонент добавится на палитру компонентов.

В том же случае, если устанавливается сразу несколько компонентов, то они, как правило, уже объединены в пакет. В этом случае пакет и устанавливают - для этого в диалоге открытbя файла (File ' Open) из списка типов файлов надо будет выбрать Delphi Package, после чего найти и выбрать нужный файл пакета. После этого откроется окно проекта пакета, в котором, как и в случае установки единичного компонента, надо будет выполнить компиляцию и установку.

СОВЕТ
В некоторых случаях важен порядок установки пакетов или иные особенности их интеграции с VCL. Поэтому прежде, чем устанавливать компоненты, всегда внимательно читайте поставляемые вместе с ними файлы read me и иную документацию.

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

Избранное

SNK GSCP
SNK GSCP - новая библиотека для PHP 5!
Web Studio
Web Studio и Visual Workshop
Библиотека:
Стандарты на web-технологии
Монополия
Монополия Android
Загрузки:
скачать программы
Продукция:
программы и книги
Техподдержка / Связаться с нами
Copyright © 1999-2020 SNK. Все права защищены.
При использовании материалов с сайта ссылка на источник обязательна.
Рейтинг@Mail.ru