Рассмотрим задачу, когда нужно сделать программу, окно которой состоит из нескольких зон, на которых находятся компоненты. Размер зон нужно уметь менять во время работы программы с помощью мыши. Пример задачи приведен на рис. 2.
Рис. 2. Форма с несколькими зонами и компонентами
В рассматриваемой задачи имеется три зоны: зона выбора пункта из компонента-дерева (верхняя левая), зона информации (верхняя правая) и зона управления (внизу). Мышью можно менять размеры «зона выбора – зона информации» и «зоны выбора и информации – зона управления».
Разработка примера происходит в три приема:
создание на форме зон из панелей и полос разделения
установка на зоны нужных компонент
написание процедур обработки компонент
3.1. Создание на форме зон
Для создания окна с несколькими областями, с изменяющимися размерами, нужно использовать компоненты «Panel» (вкладка «Standard»), «Splitter» (вкладка «Additional») и Инспектор объектов для их связывания. Рассмотрим алгоритм создания окна с тремя областями (см. рис.3):
наносим на пустую форму компонент «Panel1»;
устанавливаем у компонента «Panel1» выравнивание по правому краю (через Инспектор объектов): Panel1.Align:=alRight;
наносим на пустую часть формы слева компонент «Splitter1»;
устанавливаем у компонента «Splitter1» выравнивание по правому краю: Splitter1.Align:=alRight;
наносим на левую (пустую) часть формы компонент «Panel2»;
устанавливаем у компонента «Panel2» выравнивание по нижнему краю: Panel2.Align:=alBottom;
наносим на пустую часть формы слева компонент «Splitter2»;
устанавливаем у компонента «Splitter2» выравнивание по нижнему краю: Splitter2.Align: =alBottom;
наносим на левую верхнюю (пустую) часть формы компонент «Panel3»;
устанавливаем у компонента «Panel3» выравнивание по всему объему:Panel3.Align: =alClient.
Рис. 3. Форма с несколькими областями
3.2. Установка на зоны нужных компонент
После создания формы с несколькими зонами наносят на каждую панель компоненты и устанавливают у них свойство «Align» в значение «alClient» (выравнивание по всей области). На «Panel1» нанесем компонент «Memo1», на «Panel3» компонент-дерево «TreeView1» (вкладка «Win32»), на «Panel2» семь кнопок и компонент статусной строки «StatusBar1» (вкладка «Win32»).
Компонент-дерево «TreeView1» содержит в свойстве «Items» набор узлов и под узлов дерева. Содержимое дерева может задаваться через Инспектор объектов (и свойство «Items»), загружаться из файла или генерироваться программно.
Компонент статусной строки «StatusBar1» содержит «Panels» набор секций статусной строки. По-умолчанию в этом компоненте нет секций, поэтому их нужно создавать либо программно, либо через Инспектор объектов и свойство «Panels». В данном примере нужно сделать через Инспектор объектов три секции статусной строки.
3.3. Процедуры многозонной программы
private
{ Private declarations }
td: TTime; nf: string;
…
procedure TForm1.FormCreate(Sender: TObject);
{ Создание формы }
begin
Form1.Position:=poScreenCenter;
TreeView1.ReadOnly:=true; Memo1.ReadOnly:=true;
Memo1.Clear;
td:=now; nf:=ExtractFilePath(Application.ExeName)+'tree.txt';
button7.Click;
end;
procedure TForm1.Button7Click(Sender: TObject);
{ Создаем программно дерево }
var tr, tr2: TTreeNode;
begin
with TreeView1.Items do begin
Clear; memo1.Clear;
tr:=Add(nil, 'Принтеры');
AddChild(tr,'матричные');
tr2:=AddChild(tr,'струйные');
AddChild(tr2,'цветные');
AddChild(tr2,'черно-белые');
AddChild(tr2,'фото-принтер');
tr:=Add(nil, 'Мониторы');
AddChild(tr,'LCD');
AddChild(tr,'аналоговые с ЭЛТ');
TreeView1.FullExpand;
end;
end;
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
{ Обработка выбора пункта в дереве }
var k: integer;
begin
{ Проверяем, выбран ли пункт, или это раскрытие/скрытие узлов дерева }
if (htOnItem in TreeView1.GetHitTestInfoAt(X,Y)) then begin
{ Очищаем дерево }
memo1.Clear;
k:=TreeView1.Selections[0].AbsoluteIndex+1;
memo1.Lines.Add('Выбран пункт № '+inttostr(k));
memo1.Lines.Add('Содержимое пункта: '+TreeView1.Selections[0].Text);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
{ Сохранение дерева в файл }
begin
TreeView1.SaveToFile(nf);
end;
procedure TForm1.Button2Click(Sender: TObject);
{ Чтение дерева из файла }
begin
TreeView1.LoadFromFile(nf);
{ Раскрываем все узлы дерева }
TreeView1.FullExpand;
end;
procedure TForm1.Button3Click(Sender: TObject);
{ Сворачиваем все узлы дерева }
begin
TreeView1.FullCollapse;
end;
procedure TForm1.Button4Click(Sender: TObject);
{ Раскрываем все узлы дерева }
begin
TreeView1.FullExpand;
end;
procedure TForm1.Button6Click(Sender: TObject);
{ Очищаем дерево }
begin
TreeView1.Items.Clear; memo1.Clear;
end;
procedure TForm1.Button5Click(Sender: TObject);
{ Закрытие программы }
begin
close;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
{ Процедура таймера }
begin
StatusBar1.Panels[0].Text:='Вы работаете с программой: '+timetostr(now-td);
StatusBar1.Panels[1].Text:='Время: '+timetostr(now);
StatusBar1.Panels[2].Text:='Дата: '+datetostr(now);
end;
1) ImageList – контейнер с картинками формата «bmp»
Height – высота картинок
Width – ширина картинок
2) CoolBar – контейнер плавающих панелей
Bands – набор плавающих панелей
Bitmap – фоновый рисунок контейнера
BandBorderStyle – вкл/выкл разграничительных линий между панелями
3) ToolBar – инструментальная панель с кнопками и компонентами
ButtonHeight – высота кнопок
ButtonWidth – ширина кнопок
ShowCaptions – вкл/выкл показывать надписи на кнопках
Images – ссылка на компонент с набором картинок ImageList для отображения кнопок
HotImages – ссылка на компонент с набором картинок ImageList для наведения на кнопку
DisabledImages – ссылка на компонент с набором картинок ImageList для отображения неактивных кнопок
List – вкл/выкл режима, при котором надпись на кнопке и картинка располагаются в одной строке
ToolButton – кнопка в инструментальная панели ToolBar. Создается через контекстное меню ToolBar «New Button» и «New Separator»
ImageIndex – номер картинки на кнопки из ImageList
Style – обычная кнопка (tbsButton), кнопка с выпадающим списком (tbsDropDown), кнопка с залипанием (tbsCheck), сепаратор (tbsDivider)
Width – ширина кнопки (для сепаратора)
Dropdownmenu – ссылка на выпадающее меню кнопки Popupmenu
4) StatusBar – статусная строка
Panels – набор панелей
Text – текст панели
Width – ширина панели
Aligment – выравнивание текста по горизонтали
«Additional»
1) ButtonGroup – контейнер с кнопками
ButtonHeight – высота кнопок
ButtonWidth – ширина кнопок
Images – ссылка на компонент с набором картинок ImageList для отображения кнопок
Items – набор кнопок
Caption – надпись на кнопке
ImageIndex – номер картинки кнопки
ButtonOptions
gboFullSize – кнопки располагаются в столбик вертикально
gboShowCaptions – показывать надписи на кнопках
Событие «ButtonClicked» передает в свою процедуру номер «Index» нажатой кнопки
2) CategoryButtons – контейнер с вкладками кнопок
ButtonHeight – высота кнопок
ButtonWidth – ширина кнопок
Images – ссылка на компонент с набором картинок ImageList для отображения кнопок
ButtonOptions – опции вкладок (категорий)
boFullSize – кнопки располагаются в полную ширину компонента (true)
boShowCaptions – показывать надписи на кнопках (true)
boVerticalCategoryCaptions – вкладки располагаются вертикально (false)
boBoldCaptions – надписи вкладок жирным цветом
boUsePlusMinus – использование «+» и «-» для раскрытия вкладок
Categories – Категории (вкладки)
Caption – название вкладки
Collapsed – вкладка закрыта (false)
Items – кнопки вкладки
Caption – надпись на кнопке
ImageIndex – номер картинки кнопки
Button.Category.Index – номер выбранной вкладки
Button.Index – номер выбранной кнопки в текущей вкладке
Событие «ButtonClicked» передает в свою процедуру номер «Index» нажатой кнопки
with CategoryButtons1 do begin
SelectedItem:=Categories[0].Items[0];
CategoryButtons1ButtonClicked(Sender, SelectedItem);
end;
3) ActionManager – менеджер акций (пунктов меню)
Images – ссылка на компонент с набором картинок ImageList для отображения кнопок
Двойной щелчок мыши по компоненту раскрывает редактор акций. В нем правой кнопкой мыши выбираем пункт «New Action». Свойства акции:
Caption – название подпункта меню («Открыть»)
Category – название пункта (основного раздела) меню («Файл»)
ImageIndex – – номер картинки акции
ActionToolBar – панель акций. На данную панель из ActionManager наносятся акции (кнопки), аналог ToolBar.
ActionMainMenuBar – меню акций. В данное меню из ActionManager наносятся акции (пункты меню), аналог MainMenu.