Файл: Учебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 1.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.05.2024
Просмотров: 147
Скачиваний: 4
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Image и уменьшения размеров компонента до нуля, чтобы в отсутствие рисунка компонент не занимал места на форме:
procedure TPictureForm.CloseMenuItemClick(Sender: TObject);
begin
with Image do
begin
Picture := nil;
Width := 0;
Height := 0;
end;
NormalSizeMenuItem.Click;
EnableCommands(False);
end;
Шаг 40. Еще остались незавершенными обработчики команд меню Half Size, Normal Size и Double Size, которые тоже нужно доработать. С ними вы легко разберетесь:
procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject);
begin
HalfSizeMenuItem.Checked := True;
HalfSizePopupItem.Checked := True;
with Image do
begin
AutoSize := False;
Width := Picture.Width div 2;
Height := Picture.Height div 2;
Stretch := True;
end;
end;
procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject);
begin
NormalSizeMenuItem.Checked := True;
NormalSizePopupItem.Checked := True;
Image.AutoSize := True; // восстановить нормальные размеры компонента
end;
procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject);
begin
DoubleSizeMenuItem.Checked := True;
DoubleSizePopupItem.Checked := True;
with Image do
begin
AutoSize := False;
Width := Picture.Width * 2;
Height := Picture.Height * 2;
Stretch := True;
end;
end;
В первом приближении программа для просмотра графических файлов готова. Выполните компиляцию программы и проверьте ее работоспособность. Например, откройте файл Chemical.bmp из стандартной коллекции изображений среды Delphi (C:\Program Files\Common Files\Borland Shared\Images\Splash\256Color). Вашему взору предстанет следующая картина (рисунок 8.35):
Рисунок 8.35. Программа для просмотра графических файлов в работе
Внимание! В каталоге C:\Program Files\Common Files\Borland Shared\Images вы найдете для своих приложений много полезных и красивых точечных рисунков, значков, курсоров. Если вы еще не исследовали этот каталог, то сделайте это с помощью своей программы.
Экспериментируя с приложением, обратите внимание на способность формы прокручивать рисунки, которые в ней не умещаются. Это явление называется автоматической прокруткой. Автоматическая прокрутка не требует никаких забот со стороны программиста и очень хорошо выручает в тех случаях, когда изображение превышает размеры рабочей области формы.
8.3. Строка состояния
8.3.1. Создание строки состояния
Строка состояния (status bar) — это панель в нижней части окна, предназначенная для вывода вспомогательной информации: параметров документа, с которым работает пользователь, подсказок к пунктам меню и др. В среде Delphi она организуется с помощью компонента StatusBar, расположенного в палитре компонентов на вкладке Win32 (рисунок 8.36).
Шаг 41. Поместите компонент на форму и дайте ему имя
StatusBar.
Рисунок 8.36. Компонент StatusBar
Таблица 8.9 знакомит вас с основными свойствами компонента StatusBar. Когда вы изучите компонент, она пригодится вам в качестве справочника, а сейчас просто окиньте ее взглядом и двигайтесь дальше.
Таблица 8.9. Важнейшие свойства и события компонента StatusBar
Как только вы добавили на форму строку состояния, она тут же прижалась к нижнему краю формы и растянулась по всей ее ширине (см. рис. ниже). Какая сообразительная! А ну-ка изменим ширину формы. Ба! Строка состояния тоже корректирует свою ширину и всегда занимает всю нижнюю часть формы (рисунок 8.37).
Рисунок 8.37. Строка состояния автоматически прижимается к нижнему краю формы
Такое поведение обеспечивает свойство Align, которое в компоненте StatusBar изначально содержит значение alBottom. Свойство Align есть во многих визуальных компонентах. С его помощью вы можете заставить компонент подгонять свои размеры и положение при изменении размеров своего владельца (формы или компонента, на котором он находится). Возможные значения свойства Align описаны в таблице 8.10.
Таблица 8.10. Значения свойства Align
Принимая во внимание, что некоторые компоненты могут содержать другие компоненты, становится ясно, какую мощь таит в себе свойство Align, избавляя программистов от огромной работы по перерасчету координат компонентов при изменении размеров формы. Всегда помните об этой чудесной возможности и старайтесь использовать ее в полной мере.
Шаг 42. Вернемся к примеру и приспособим строку состояния для отображения размеров рисунка и имени файла, в котором рисунок хранится на диске. С этой целью разделим строку состояния на две информационные панели. Перейдите к окну свойств и в поле Panels щелкните кнопку с многоточием (либо в контекстном меню строки состояния выберите пункт Panels Editor…). Откроется специальное окно с заголовком Editing StatusBar.Panels для создания панелей в строке состояния (рисунок 8.38).
Рисунок 8.38. Окно для создания панелей в строке состояния
Шаг 43. В этом окне создаются, редактируются и удаляются панели строки состояния. Оно работает в паре с окном свойств, в котором настраиваются свойства отдельно взятой панели строки состояния. Нажатием кнопки Add New создайте первую панель и установите ее свойства так, чтобы она получилась шириной 70 пикселей (Width = 70), продавленной (Bevel = pbLowered) и с центрированным текстом (Alignment = taCenter). См. рисунок 8.39.
Рисунок 8.39. В строке состояния создана панель
В этой панели будут отображаться размеры рисунка. Аналогично создайте вторую панель (рисунок 8.40) неограниченной ширины (Width = -1), продавленной (Bevel = pbLowered) и с прижатым влево текстом (Alignment = taLeftJustify). В ней будет отображаться имя файла.
Рисунок 8.40. В строке состояния создана еще одна панель
После этого закройте окно Editing StatusBar.Panels.
Строка состояния создана и сейчас рассмотрим, как вывести в ней текст. Доступ к панелям обеспечивает свойство Panels. Оно содержит массив Items, элементами которого являются объекты-панели. Каждая панель имеет свойство Text, в котором хранится отображаемый на панели текст. Итак, установка содержимого строки состояния в нашем примере будет выглядеть так:
StatusBar.Panels.Items[0].Text :=
Format('%d x %d', [Image.Picture.Width, Image.Picture.Height]);
StatusBar.Panels.Items[1].Text := OpenDialog.FileName;
Учитывая, что массив Items выступает главным свойством объекта Panels, эти операторы можно записать короче:
StatusBar.Panels[0].Text :=
Format('%d x %d', [Image.Picture.Width, Image.Picture.Height]);
StatusBar.Panels[1].Text := OpenDialog.FileName;
Для вывода информации на первую панель (с индексом 0) мы воспользовались функцией Format, форматирующей строку. Первый параметр функции — это строка-шаблон, а второй — открытый массив с аргументами, подставляемыми вместо управляющих символов строки-шаблона.
Шаг 44. Обновление строки состояния удобно оформить в виде метода формы:
procedure TPictureForm.UpdateStatusBar;
begin
if Image.Width <> 0 then
begin
StatusBar.Panels[0].Text := Format('%d x %d',
[Image.Picture.Width, Image.Picture.Height]);
StatusBar.Panels[1].Text := OpenDialog.FileName;
end
else // в компоненте Image нет рисунка
begin
StatusBar.Panels[0].Text := '';
StatusBar.Panels[1].Text := '';
end;
end;
Шаг 45. Вызовы метода UpdateStatusBar поместите в обработчики команд меню Open... и Close.
procedure TPictureForm.OpenMenuItemClick(Sender: TObject);
begin
if OpenDialog.Execute then
begin
Image.Picture.LoadFromFile(OpenDialog.FileName);
EnableCommands(True);
NormalSizeMenuItem.Click;
end;
UpdateStatusBar;
end;
procedure TPictureForm.CloseMenuItemClick(Sender: TObject);
begin
with Image do
begin
Picture := nil;
Width := 0;
Height := 0;
end;
NormalSizeMenuItem.Click;
EnableCommands(False);
UpdateStatusBar;
end;
Наконец выполните компиляцию приложения и проверьте, что строка состояния работает. Например, откройте файл Chemical.bmp, расположенный по маршруту C:\Program Files\Common Files\Borland Shared\Images\Splash\256Color. В строке состояния отобразятся размеры рисунка и путь к файлу.
Рисунок 8.41. Программа для просмотра графических файлов теперь имеет строку состояния
8.3.2. Подсказки в строке состояния
Как вы хорошо знаете, строка состояния — это еще стандартное место отображения подсказок к пунктам меню. Сейчас самое время заняться этим вопросом. Вспомните, как работает строка состояния вашего любимого текстового процессора. Когда вы активизируете меню, строка состояния, состоящая из нескольких панелей, превращается в простую длинную панель и на ней отображается подсказка текущего пункта меню. Когда вы завершаете работу с меню (например, выбираете команду), строка состояния восстанавливает свой первоначальный вид.
Для того чтобы вы могли получить строку состояния с описанной выше логикой работы, в компоненте StatusBar предусмотрен режим отображения простого текста. Его обеспечивает булевское свойство SimplePanel. По умолчанию оно равно значению False и в строке состояния отображаются панели объекта Panels. Если установить свойство SimplePanel в значение True, то в строке состояния будет отображаться текст, хранящийся в свойстве SimpleText. Итак, задача состоит в том, чтобы при активизации меню записывать подсказку выбранного пункта в свойстве SimpleText и, в том случае если подсказка содержит текст, устанавливать свойство SimplePanel в значение True. Для решения этой задачи вы должны представлять механизм работы подсказок. Его суть состоит в следующем.
Каждый пункт меню имеет свойство Hint для хранения подсказки. Когда вы выделяете пункт меню с помощью мыши или клавиатуры, текст подсказки переписывается из пункта меню в объект Application, у которого тоже есть свойство Hint. При этом в объекте Application возникает событие OnHint. Все, что нам нужно — написать обработчик этого события, который отобразит значение свойства Hint объекта Application в строке состояния.
Объект Application не виден в окне свойств, но вы можете получить доступ к его событиям на этапе проектирования. Для этого в форму помещается специальный компонент
procedure TPictureForm.CloseMenuItemClick(Sender: TObject);
begin
with Image do
begin
Picture := nil;
Width := 0;
Height := 0;
end;
NormalSizeMenuItem.Click;
EnableCommands(False);
end;
Шаг 40. Еще остались незавершенными обработчики команд меню Half Size, Normal Size и Double Size, которые тоже нужно доработать. С ними вы легко разберетесь:
procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject);
begin
HalfSizeMenuItem.Checked := True;
HalfSizePopupItem.Checked := True;
with Image do
begin
AutoSize := False;
Width := Picture.Width div 2;
Height := Picture.Height div 2;
Stretch := True;
end;
end;
procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject);
begin
NormalSizeMenuItem.Checked := True;
NormalSizePopupItem.Checked := True;
Image.AutoSize := True; // восстановить нормальные размеры компонента
end;
procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject);
begin
DoubleSizeMenuItem.Checked := True;
DoubleSizePopupItem.Checked := True;
with Image do
begin
AutoSize := False;
Width := Picture.Width * 2;
Height := Picture.Height * 2;
Stretch := True;
end;
end;
В первом приближении программа для просмотра графических файлов готова. Выполните компиляцию программы и проверьте ее работоспособность. Например, откройте файл Chemical.bmp из стандартной коллекции изображений среды Delphi (C:\Program Files\Common Files\Borland Shared\Images\Splash\256Color). Вашему взору предстанет следующая картина (рисунок 8.35):
Рисунок 8.35. Программа для просмотра графических файлов в работе
Внимание! В каталоге C:\Program Files\Common Files\Borland Shared\Images вы найдете для своих приложений много полезных и красивых точечных рисунков, значков, курсоров. Если вы еще не исследовали этот каталог, то сделайте это с помощью своей программы.
Экспериментируя с приложением, обратите внимание на способность формы прокручивать рисунки, которые в ней не умещаются. Это явление называется автоматической прокруткой. Автоматическая прокрутка не требует никаких забот со стороны программиста и очень хорошо выручает в тех случаях, когда изображение превышает размеры рабочей области формы.
8.3. Строка состояния
8.3.1. Создание строки состояния
Строка состояния (status bar) — это панель в нижней части окна, предназначенная для вывода вспомогательной информации: параметров документа, с которым работает пользователь, подсказок к пунктам меню и др. В среде Delphi она организуется с помощью компонента StatusBar, расположенного в палитре компонентов на вкладке Win32 (рисунок 8.36).
Шаг 41. Поместите компонент на форму и дайте ему имя
StatusBar.
Рисунок 8.36. Компонент StatusBar
Таблица 8.9 знакомит вас с основными свойствами компонента StatusBar. Когда вы изучите компонент, она пригодится вам в качестве справочника, а сейчас просто окиньте ее взглядом и двигайтесь дальше.
Свойство | Описание |
Action | Задает так называемую команду, которая будет выполняться по щелчку на строке состояния. Весь список команд содержится в компоненте ActionList (см. параграф 8.6). |
Align | Способ выравнивания строки состояния в пределах содержащего компонента (например, формы или панели). |
AutoHint | Если равно значению True, то текст строки состояния автоматически устанавливается равным текущей всплывающей подсказке. |
BorderWidth | Величина отступа от границ компонента до границ информационных панелей. |
Panels | Информационные панели, отображаемые на строке состояния. |
SimplePanel | Если равно значению True, то вместо информационных панелей на строке состояния отображается одна простая строка текста, хранящаяся в свойстве SimpleText. |
SimpleText | Строка текста, отображаемая в строке состояния, когда свойство SimplePanel равно значению True. |
SizeGrip | Если равно значению True, то в правом нижнем углу строки состояния рисуется "гармошка", работающая как размерная рамка. |
UseSystemFont | Если равно значению True, то используется стандартный шрифт системы. |
OnCreatePanelClass | Позволяет создавать свои собственные панели на базе класса TStatusPanel. |
OnDrawPanel | Происходит при рисовании панели, если свойство Style содержит значение psOwnerDraw. |
Таблица 8.9. Важнейшие свойства и события компонента StatusBar
Как только вы добавили на форму строку состояния, она тут же прижалась к нижнему краю формы и растянулась по всей ее ширине (см. рис. ниже). Какая сообразительная! А ну-ка изменим ширину формы. Ба! Строка состояния тоже корректирует свою ширину и всегда занимает всю нижнюю часть формы (рисунок 8.37).
Рисунок 8.37. Строка состояния автоматически прижимается к нижнему краю формы
Такое поведение обеспечивает свойство Align, которое в компоненте StatusBar изначально содержит значение alBottom. Свойство Align есть во многих визуальных компонентах. С его помощью вы можете заставить компонент подгонять свои размеры и положение при изменении размеров своего владельца (формы или компонента, на котором он находится). Возможные значения свойства Align описаны в таблице 8.10.
Значение | Описание |
alNone | Позиция и размеры компонента остаются неизменными в пределах владельца. |
alTop | Компонент прижимается к верхнему краю владельца и растягивается по всей его ширине. |
alBottom | Компонент прижимается к нижнему краю владельца и растягивается по всей его ширине. |
alLeft | Компонент прижимается к левому краю владельца и растягивается по всей его высоте. |
alRight | Компонент прижимается к правому краю владельца и растягивается по всей его высоте. |
alClient | Компонент подгоняется под размеры владельца. |
Таблица 8.10. Значения свойства Align
Принимая во внимание, что некоторые компоненты могут содержать другие компоненты, становится ясно, какую мощь таит в себе свойство Align, избавляя программистов от огромной работы по перерасчету координат компонентов при изменении размеров формы. Всегда помните об этой чудесной возможности и старайтесь использовать ее в полной мере.
Шаг 42. Вернемся к примеру и приспособим строку состояния для отображения размеров рисунка и имени файла, в котором рисунок хранится на диске. С этой целью разделим строку состояния на две информационные панели. Перейдите к окну свойств и в поле Panels щелкните кнопку с многоточием (либо в контекстном меню строки состояния выберите пункт Panels Editor…). Откроется специальное окно с заголовком Editing StatusBar.Panels для создания панелей в строке состояния (рисунок 8.38).
Рисунок 8.38. Окно для создания панелей в строке состояния
Шаг 43. В этом окне создаются, редактируются и удаляются панели строки состояния. Оно работает в паре с окном свойств, в котором настраиваются свойства отдельно взятой панели строки состояния. Нажатием кнопки Add New создайте первую панель и установите ее свойства так, чтобы она получилась шириной 70 пикселей (Width = 70), продавленной (Bevel = pbLowered) и с центрированным текстом (Alignment = taCenter). См. рисунок 8.39.
Рисунок 8.39. В строке состояния создана панель
В этой панели будут отображаться размеры рисунка. Аналогично создайте вторую панель (рисунок 8.40) неограниченной ширины (Width = -1), продавленной (Bevel = pbLowered) и с прижатым влево текстом (Alignment = taLeftJustify). В ней будет отображаться имя файла.
Рисунок 8.40. В строке состояния создана еще одна панель
После этого закройте окно Editing StatusBar.Panels.
Строка состояния создана и сейчас рассмотрим, как вывести в ней текст. Доступ к панелям обеспечивает свойство Panels. Оно содержит массив Items, элементами которого являются объекты-панели. Каждая панель имеет свойство Text, в котором хранится отображаемый на панели текст. Итак, установка содержимого строки состояния в нашем примере будет выглядеть так:
StatusBar.Panels.Items[0].Text :=
Format('%d x %d', [Image.Picture.Width, Image.Picture.Height]);
StatusBar.Panels.Items[1].Text := OpenDialog.FileName;
Учитывая, что массив Items выступает главным свойством объекта Panels, эти операторы можно записать короче:
StatusBar.Panels[0].Text :=
Format('%d x %d', [Image.Picture.Width, Image.Picture.Height]);
StatusBar.Panels[1].Text := OpenDialog.FileName;
Для вывода информации на первую панель (с индексом 0) мы воспользовались функцией Format, форматирующей строку. Первый параметр функции — это строка-шаблон, а второй — открытый массив с аргументами, подставляемыми вместо управляющих символов строки-шаблона.
Шаг 44. Обновление строки состояния удобно оформить в виде метода формы:
procedure TPictureForm.UpdateStatusBar;
begin
if Image.Width <> 0 then
begin
StatusBar.Panels[0].Text := Format('%d x %d',
[Image.Picture.Width, Image.Picture.Height]);
StatusBar.Panels[1].Text := OpenDialog.FileName;
end
else // в компоненте Image нет рисунка
begin
StatusBar.Panels[0].Text := '';
StatusBar.Panels[1].Text := '';
end;
end;
Шаг 45. Вызовы метода UpdateStatusBar поместите в обработчики команд меню Open... и Close.
procedure TPictureForm.OpenMenuItemClick(Sender: TObject);
begin
if OpenDialog.Execute then
begin
Image.Picture.LoadFromFile(OpenDialog.FileName);
EnableCommands(True);
NormalSizeMenuItem.Click;
end;
UpdateStatusBar;
end;
procedure TPictureForm.CloseMenuItemClick(Sender: TObject);
begin
with Image do
begin
Picture := nil;
Width := 0;
Height := 0;
end;
NormalSizeMenuItem.Click;
EnableCommands(False);
UpdateStatusBar;
end;
Наконец выполните компиляцию приложения и проверьте, что строка состояния работает. Например, откройте файл Chemical.bmp, расположенный по маршруту C:\Program Files\Common Files\Borland Shared\Images\Splash\256Color. В строке состояния отобразятся размеры рисунка и путь к файлу.
Рисунок 8.41. Программа для просмотра графических файлов теперь имеет строку состояния
8.3.2. Подсказки в строке состояния
Как вы хорошо знаете, строка состояния — это еще стандартное место отображения подсказок к пунктам меню. Сейчас самое время заняться этим вопросом. Вспомните, как работает строка состояния вашего любимого текстового процессора. Когда вы активизируете меню, строка состояния, состоящая из нескольких панелей, превращается в простую длинную панель и на ней отображается подсказка текущего пункта меню. Когда вы завершаете работу с меню (например, выбираете команду), строка состояния восстанавливает свой первоначальный вид.
Для того чтобы вы могли получить строку состояния с описанной выше логикой работы, в компоненте StatusBar предусмотрен режим отображения простого текста. Его обеспечивает булевское свойство SimplePanel. По умолчанию оно равно значению False и в строке состояния отображаются панели объекта Panels. Если установить свойство SimplePanel в значение True, то в строке состояния будет отображаться текст, хранящийся в свойстве SimpleText. Итак, задача состоит в том, чтобы при активизации меню записывать подсказку выбранного пункта в свойстве SimpleText и, в том случае если подсказка содержит текст, устанавливать свойство SimplePanel в значение True. Для решения этой задачи вы должны представлять механизм работы подсказок. Его суть состоит в следующем.
Каждый пункт меню имеет свойство Hint для хранения подсказки. Когда вы выделяете пункт меню с помощью мыши или клавиатуры, текст подсказки переписывается из пункта меню в объект Application, у которого тоже есть свойство Hint. При этом в объекте Application возникает событие OnHint. Все, что нам нужно — написать обработчик этого события, который отобразит значение свойства Hint объекта Application в строке состояния.
Объект Application не виден в окне свойств, но вы можете получить доступ к его событиям на этапе проектирования. Для этого в форму помещается специальный компонент