От Delphi 4 к Delphi 5 часть 40

От Delphi 4 к Delphi 5 Компонент PageControl
Этот компонент в отличие от компонента TabControl может содержать несколько перекрывающих друг друга панелей класса TTabSet. Каждая панель может выбираться со связанной с ней закладкой. Для добавления новой панели необходимо щелкнуть по компоненту правой кнопкой мыши и выбрать команду New Page (следующая панель или следующая страница). Переход на предыдущую страницу производится с использованием команды Previous Page. Смена панелей происходит последовательно и циклически, т.е. после достижения последней страницы идет переход к первой и наоборот.
Свойства этого компонента в основном аналогичны свойствам компонента TabControl, но имеются и свои специфические, рассмотрим их.
Свойство ActivePage содержит ссылку на активную панель. Установка нового значения ActivePage размещает соответствующую панель поверх остальных. Для выбора новой панели следует использовать методы SelectNextPage и FindNextPage.
Рассмотрим пример.
1. Запустите Delphi.
2. Сохраните файл модуля под именем Page1_.pas, а файл проекта под именем Page1.dpr.
3. Поместите на форму компонент PageControl и компонент ComboBox.
4. Произведите щелчок правой кнопкой мыши на компоненте PageControl, используя команду New Page, сформируйте четыре страницы.
5. Используя инспектор объекта для активизированной формы на странице Events, выберите событие OnCreate и запишите программный код. Для компонента ComboBox используйте событие OnChange.
implementation

{$R *.DFM}

procedure TForm1.ComboBox1Change (Sender: TObject);
begin
if (Sender is TComboBox) then
with (Sender as TComboBox) do
PageControl1.ActivePage := TTabSheet(Items.Objects[ItemIndex]);
end;

procedure TForm1.FormCreate (Sender: TObject);
var
I: Integer;
begin
for I := 0 to PageControl1.PageCount — 1 do
ComboBox1.Items.AddObject(PageControl1.Pages[I].Name,
PageControl1.Pages[I]);
ComboBox1.ItemIndex := 0;
end;

end.
Теперь вы можете использовать свойство Active Page для активизации той страницы, которая будет открыта после компиляции приложения первой.
Свойство MultiLine позволяет разместить закладки компонента PageControl в несколько рядов.
Поместите на форму компонент CheckBox и компонент PageControl.
Используя события OnCreate для формы и OnClick для компонента CheckBox, запишите следующий программный код:
implementation

{$R *.DFM}

procedure TForm1.FormCreate (Sender: TObject);
var
I: Integer;
begin
Checkbox1.Caption := 'Добавить страницы?';
for I := 0 to 10 do
with TTabSheet.Create(Self) do
begin
PageControl := PageControl1;
Caption := 'Страница №' + IntToStr(I);
end;

end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
PageControl1.MultiLine := CheckBox1.Checked;
end;

end.
Таким образом, вы добавляете новые страницы и располагаете их несколькими рядами.
Свойство property PageCount: Integer; — определяет число панелей (это свойство только для чтения).
Свойство Pages возвращает ссылку на панель по ее индексу (только для чтения).
implementation

{$R *.DFM}

procedure TForm1.FormCreate (Sender: TObject);
var
I: Integer;
begin
with PageControl1 do
begin
for I := 0 to PageCount — 1 do
begin
if (Canvas.TextWidth(Pages[I].Caption) * 2) > TabWidth then
TabWidth := Canvas.TextWidth(Pages[I].Caption) * 2;
if (Canvas.TextHeight(Pages[I].Caption) * 2) > TabHeight then
TabHeight := Canvas.TextHeight(Pages[I].Caption) * 2;
end;

end;
end;
end.
Метод FindNextPage ищет следующую панель:
CurPage — текущая панель; GoForward — содержит True, если поиск идет от первой панели к последней; CheckTabVisible — содержит True, если из поиска исключаются панели с признаком TabVisible = False.
Если CurPage не принадлежит компоненту, возвращает ссылку на первую или последнюю панель в зависимости от параметра GoForward.
function FindNextPage(CurPage: TTabSheet; GoForward, CheckTabVisible: Boolean): TTabSheet;
Рассмотрим пример. Поместите на форму компонент PageControl и, используя события OnCreate для формы и OnChange для PageControl, запишите следующий программный код.
implementation

{$R *.DFM}

procedure TForm1.FormCreate (Sender: TObject);
var
I: Integer;
begin
for I:= 0 to 9 do
with TTabSheet.Create(Self) do
begin
PageControl := PageControl1;
Caption := 'TabSheet #' + IntToStr(I);
end;
end;

procedure TForm1.PageControl1 Change(Sender: TObject);

var
PrevCaption, NextCaption: ShortString;
begin
with (Sender as TPageControl) do
begin
PrevCaption := FindNextPage(ActivePage, True, False).Caption;
NextCaption := FindNextPage(ActivePage, False, False).Caption;
end;
ShowMessage('Previous tab caption: "' + PrevCaption +
'" Next tab Caption: "' + NextCaption + '"');
end;

end.
Процедура procedure SelectNextPage(GoForward: Boolean); делает активной следующую панель, если GoForward = True, в противном случае предыдущая страница будет активной.
Рассмотрим пример, использующий это свойство. Поместите на форму компонент UpDown и запишите следующий программный код:
implementation

{$R *.DFM}

procedure TForm1.FormCreate (Sender: TObject);
var
i: Integer;
begin
for I := 0 to 9 do
with TTabSheet.Create(Self) do
begin
PageControl := PageControl1;
Caption := 'TabSheet #' + IntToStr(I);
end;
end;
procedure TForm1.UpDown1Click (Sender: TObject; Button: TUDBtnType);
begin
PageControl1.SelectNextPage(Button = btNext);
end;

end.
Использование двойной кнопки позволяет переключаться между страницами.
Изменение размеров закладок в пикселях осуществляется с использованием свойств TabHeight и TabWidth.
procedure TForm1.FormCreate (Sender: TObject);
var
i: Integer;
begin
with PageControl1 do
begin
for I := 0 to PageCount — 1 do
begin
if (Canvas.TextWidth(Pages[I].Caption) * 2) > TabWidth then
TabWidth := Canvas.TextWidth(Pages[I].Caption) * 2;
if (Canvas.TextHeight(Pages[I].Caption) * 2) > TabHeight then
TabHeight := Canvas.TextHeight(Pages[I].Caption) * 2;
end;

end;
end;

end.

Построение блокнотов с помощью компонента PageControl
Рассмотрим пример с использованием компонента PageControl.
Существует способ построения блокнота с ярлычком для переключения текущей страницы. Компонент PageControl основывается на управляющем элементе-табуляторе плюс некоторых дополнительных панелях и обеспечивает больше возможностей для построения блокнотов, чем другие компоненты.
Если вам нужен только ярлычок без блокнота или страниц, вы можете использовать компоненты TabControl или TabSet.
Если же вам нужны страницы без ярлычков, можете использовать компоненты PageControl (скрыв ярлычки) или компонент Notebook.
В системе Delphi существуют три компонента, используемые для обработки страниц и ярлычков, — это TabControl, PageControl и TabSheets. Последний из перечисленных компонентов используется внутри компонента PageControl. С помощью компонента PageControl можно построить приложение или диалоговую панель, используя понятие многостраничного элемента или блокнота.
1. Запустите Delphi.
2. Сохраните файл модуля под именем Page_.pas, а файл проекта под именем Page.dpr.
3. Поместите на форму компонент PageControl с тремя страницами. Чтобы его построить, вы можете просто поместить управляющий элемент на новую форму, затем выбрать его и использовать всплывающее меню для добавления новых страниц. Каждый объект TabSheet имеет собственный заголовок, который выводится на экран как ярлычок. Переход от страницы к странице осуществляется при помощи всплывающего меню командой Next Page. Но можете делать это же, щелкая прямо на ярлычке (и затем, обратно щелкая на поверхности формы, чтобы выбрать TabSheet).
4. Если вы поместите компоненты на страницу PageControl, например Button1 и Button2, они будут доступны только на этой странице. Для того чтобы компоненты были доступны на всех страницах, просто поместите компоненты на форму вне компонента PageControl и затем переместите его на передний план перед страницами, вызвав команду Bring to Front из всплывающего меню формы.
Кнопки Button1, Button2 могут быть использованы для перемещения назад и вперед между страницами и представляют альтернативу использованию ярлычков. Применяя свойство Caption, запишите для них заголовки: "Вперед", "Назад". Ниже приведен код, связанный с одной из кнопок:
procedure TFormI.Button2Click(Sender: TObject);
begin
PageControll.SelectNextPage (True);
end;
Другая кнопка вызывает ту же процедуру, передавая значение False в качестве параметра для выбора предыдущей страницы. Нет необходимости проверять, находитесь вы на первой или последней странице, потому что SelectNextPage рассматривает последнюю страницу как единственную перед первой и будет перемещать вас непосредственно между этими двумя страницами.
Теперь, когда вы определили использование общего компонента, можете снова сконцентрировать внимание на первой странице. На нее поместите компонент список ListBox, в котором на этапе выполнения будут содержаться названия ярлычков. Если вы щелкните на элементе этого списка, текущая страница изменится. Список заполняется с помощью метода FormCreate и копирования заголовка каждой страницы (свойство Page хранит список объектов TabSheet):
for I := 0 to PageControll.PageCount -1 do
ListBox1.Items.Add ( PageControll.Page [I].Caption);
Когда вы щелкаете на странице, то просматриваете список, чтобы найти искомое значение. В действительности не существует прямого способа выбрать страницу без знания специального объекта TabSheet, который вам нужен:
procedure TFormI,ListBox1Click (Sender: TObject);
var
I: Integer;
begin
for I := 0 to PageGontroli.PageCount -1 do
if PageControll.Page [I].Caption =ListBoxl.Items [ListBoxl.Itemlndex] then
PageControll.ActivePage :=PageControll.Pages [I],
end;
На вторую страницу поместите две строки редактирования Edit (связанные с двумя компонентами UpDown) и два чекбокса. Вам необходимо в инспекторе объекта найти свойство Associate и в предложенном списке выбрать компонент Edit1 или Edit2. Вы можете ввести значение ширины и высоты ярлычка (или выбрать его с помощью мыши, нажав на сдвоенных кнопках указатели "вверх" или "вниз" в соответствующей активизированной строке редактирования) и ввести галочки в чекбоксы, затем нажать кнопку Button3 "Изменить", чтобы внести изменения:
procedure TFormI.Button3Click(Sender: TObject);
begin
{установите ширину, высоту ярлычков и строки}
PageControll.TabWidth := StrToInt (EditWidth.Text);
PageControll.TabHeight := StrToInt (EditHeight.Text);
PageControll.MultiLine := CheckBoxMultiLine.Checked;
{показать или скрыть последний ярлычок}
TabSheet3.TabVisible := CheckBoxVisible.Checked;
end;
С помощью этого кода вы можете изменить ширину и высоту каждого ярлычка (не забудьте, что 0 означает автоматическое вычисление размера из пространства, занимаемого каждой строкой). Вы можете также скрыть последний ярлычок в компоненте PageControl, который соответствует компоненту TabSheet3.
Когда вы изменяете высоту ярлычков компонента PageControl или устанавливаете множественные строки на этапе выполнения, каждый компонент на странице перемещается вниз и может даже незаметно уйти из видимой области.
В то же время, если у вас есть компоненты, которые не являются наследниками компонента PageControl, хотя и расположены перед ним, они не будут перемещаться и могут скрываться другими компонентами той или иной страницы.
На последнюю страницу поместите компонент Memo, который будет связан с названиями страниц. Вы можете ввести в компонент новые названия страниц и нажать кнопку Button4 "Изменить". Это приведет к изменению названия текста ярлычков, но только число строк должно соответствовать числу ярлычков:
if Meiriol. Lines. Count <> PageControll. PageCount then
MessageDIg ('Число введенных страниц не соответствует числу ярлычков', mtError, [mbOK], 0) else
for I := 0 to PageControll.PageCount -1 do PageControll.Pages [I].Caption := Memo1.Lines [I];
В случае несоответствия числа введенных страниц числу ярлычков выдается сообщение.
Ниже представлен полный программный код:
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
{Заполнение компонента Listbox и Memo именами страниц}
for I := 0 to PageControl1.PageCount -1 do
begin
ListBox1.Items.Add (PageControl1.Pages [I].Caption);
Memo1.Lines.Add (PageControl1.Pages [I].Caption);
end;
{Определение ширины и высоты ярлыка}
Edit1.Text := IntToStr (PageControl1.TabWidth);
Edit2.Text := IntToStr (PageControl1.TabHeight);
{Установление начальной ширину и высоту ярлыка}
PageControl1.ActivePage := TabSheet1;
end;
procedure TForm1.ListBox1Click(Sender: TObject);
var
I: Integer;
begin
{просмотрите страницы, найдите нужную, перейдите на нее}
for I := 0 to PageControl1.PageCount -1 do
if PageControl1.Pages [I].Caption =
ListBox1.Items [ListBox1.ItemIndex] then
PageControl1.ActivePage :=
PageControl1.Pages [I];
end;
procedure TForm1.Button1Click (Sender: TObject);
begin
PageControl1.ActivePage :=
PageControl1.FindNextPage (
PageControl1.ActivePage, True, False);
end;
procedure TForm1.Button2Click (Sender: TObject);
begin
{выбор предыдущей страницы}
PageControl1.SelectNextPage (False);
end;
procedure TForm1.Button4Click (Sender: TObject);
var
I: Integer;
begin
if Memo1.Lines.Count <> PageControl1.PageCount then
MessageDlg ('Число введенных страниц не соответствует числу ярлычков', mtError, [mbOK], 0)
else
for I := 0 to PageControl1.PageCount -1 do
PageControl1.Pages [I].Caption := Memo1.Lines [I];
end;
procedure TForm1.Memo1Change (Sender: TObject);
begin
Button4.Enabled := True;
end;
procedure TForm1.Button3Click (Sender: TObject);
begin
{ширина, высота}
PageControl1.TabWidth := StrToInt (Edit1.Text);
PageControl1.TabHeight := StrToInt (Edit2.Text);
PageControl1.MultiLine := CheckBox1.Checked;
{Скрытие последней страницы}
TabSheet3.TabVisible := CheckBox2.Checked;
end;
end.

Литература:
1. Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО "Малип". 1997 г.
2. Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
3. Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996 г.
4. К. Сурков, Д. Сурков, А. Вальвачев. Программирование в среде Delphi 2.0 Минск. Попурри. 1997 г.
5. В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
6. А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО Издательство "Бином". 2000 г.

Владимир Скуратов



Компьютерная газета. Статья была опубликована в номере 09 за 2002 год в рубрике программирование :: delphi

©1997-2024 Компьютерная газета