

Экспериментируя с приложением, обратите внимание на способность формы прокручивать рисунки, которые в ней не умещаются. Это явление называется автоматической прокруткой. Автоматическая прокрутка не требует никаких забот со стороны программиста и очень хорошо выручает в тех случаях, когда изображение превышает размеры рабочей области формы.
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 Строка текста, отображаемая в строке состояния,
291

|
когда свойство SimplePanel равно значению True. |
SizeGrip |
Если равно значению True, то в правом нижнем углу |
|
строки состояния рисуется "гармошка", работающая |
|
как размерная рамка. |
UseSystemFont |
Если равно значению True, то используется |
|
стандартный шрифт системы. |
OnCreatePanelClas |
Позволяет создавать свои собственные панели на базе |
s |
класса TStatusPanel. |
OnDrawPanel |
Происходит при рисовании панели, если свойство |
|
Style содержит значение psOwnerDraw. |
Таблица 8.9. Важнейшие свойства и события компонента StatusBar
Как только вы добавили на форму строку состояния, она тут же прижалась к нижнему краю формы и растянулась по всей ее ширине (см. рис. ниже). Какая сообразительная! А ну-ка изменим ширину формы. Ба! Строка состояния тоже корректирует свою ширину и всегда занимает всю нижнюю часть формы (рисунок 8.37).
Рисунок 8.37. Строка состояния автоматически прижимается к нижнему краю формы
Такое поведение обеспечивает свойство Align, которое в компоненте StatusBar изначально содержит значение alBottom. Свойство Align есть во многих визуальных компонентах. С его помощью вы можете заставить компонент подгонять свои размеры и положение при изменении размеров своего владельца (формы или компонента, на котором он находится). Возможные значения свойства Align описаны в таблице 8.10.
Значени Описание
е
alNone Позиция и размеры компонента остаются неизменными в пределах владельца.
292

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.
293

Рисунок 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. Обновление строки состояния удобно оформить в виде метода формы:
294

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. В строке состояния отобразятся размеры рисунка и путь к файлу.
295

Рисунок 8.41. Программа для просмотра графических файлов теперь имеет строку состояния
8.3.2. Подсказки в строке состояния
Как вы хорошо знаете, строка состояния — это еще стандартное место отображения подсказок к пунктам меню. Сейчас самое время заняться этим вопросом. Вспомните, как работает строка состояния вашего любимого текстового процессора. Когда вы активизируете меню, строка состояния, состоящая из нескольких панелей, превращается в простую длинную панель и на ней отображается подсказка текущего пункта меню. Когда вы завершаете работу с меню (например, выбираете команду), строка состояния восстанавливает свой первоначальный вид.
Для того чтобы вы могли получить строку состояния с описанной выше логикой работы, в компоненте StatusBar предусмотрен режим отображения простого текста. Его обеспечивает булевское свойство SimplePanel. По умолчанию оно равно значению False и в строке состояния отображаются панели объекта Panels. Если установить свойство SimplePanel в значение True, то в строке состояния будет отображаться текст, хранящийся в свойстве SimpleText. Итак, задача состоит в том, чтобы при активизации меню записывать подсказку выбранного пункта в свойстве SimpleText и, в том случае если подсказка содержит текст, устанавливать свойство SimplePanel в значение True. Для решения этой задачи вы должны представлять механизм работы подсказок. Его суть состоит в следующем.
Каждый пункт меню имеет свойство Hint для хранения подсказки. Когда вы выделяете пункт меню с помощью мыши или клавиатуры, текст подсказки переписывается из пункта меню в объект Application, у которого тоже есть свойство Hint. При этом в объекте Application возникает событие OnHint. Все, что нам нужно — написать обработчик этого события, который отобразит значение свойства Hint объекта Application в строке состояния.
Объект Application не виден в окне свойств, но вы можете получить доступ к его событиям на этапе проектирования. Для этого в форму помещается специальный компонент ApplicationEvents, который вы найдете в палитре компонентов на вкладке Additional
(рисунок 8.42).
296

Рисунок 8.42. Компонент ApplicationEvents
Шаг 46. Поместите на форму компонент ApplicationEvents. Дайте ему имя ApplicationEvents. Обратите внимание, что у этого компонента всего два свойства: Name и Tag. Это не удивительно, так как основное назначение компонента — представить события объекта Application (таблица 8.11).
Событие Описание
OnActionExecute Происходит при выполнении любой команды в компоненте ActionList (см. параграф 8.6).
OnActionUpdate Происходит во время простоя программы для обновления состояния команд в компоненте ActionList (см. параграф 8.6).
OnActivate Происходит, когда приложение получает активность, т.е. когда пользователь переключается на него с другого приложения.
OnDeactivate Происходит, когда приложение теряет активность, т.е. когда пользователь переключается с него на другое приложения.
OnException Происходит, когда в приложении возникает необработанная исключительная ситуация. По умолчанию обработчик этого события вызывает метод ShowException для отображения окна сообщений с пояснением причины ошибки. Вы можете изменить реакцию на событие OnException, переписав его обработчик.
OnHelp |
Происходит, когда пользователь вызывает справку. |
|||
OnHint |
Происходит, когда курсор мыши наводится на |
|||
|
компонент, содержащий всплывающую подсказку. |
|||
OnIdle |
Периодически происходит во время простоя |
|||
|
программы. |
|
|
|
OnMessage |
Происходит при получении программой сообщения |
|||
|
операционной системы Windows. |
|
||
OnMinimize |
Происходит, |
когда |
пользователь |
сворачивает |
|
приложение. |
|
|
|
OnRestore |
Происходит, когда пользователь восстанавливает |
|||
|
свернутое приложение. |
|
|
|
OnSettingChange |
Происходит |
при изменении настроек |
операционной |
297

системы, например, настроек экрана или региональных настроек.
OnShortCut Происходит при нажатии клавиш на клавиатуре (еще до того, как в форме происходит событие
OnKeyDown).
OnShowHint Происходит непосредственно перед появлением любой всплывающей подсказки.
Таблица 8.11. События компонента ApplicationEvents
Шаг 47. В окне свойств переключитесь на вкладку Events, найдите событие OnHint и создайте следующий обработчик:
procedure TPictureForm.ApplicationEventsHint(Sender: TObject); begin
with StatusBar do begin
SimpleText := Application.Hint; SimplePanel := SimpleText <> '';
end; end;
Шаг 48. Теперь в свойстве Hint каждого пункта меню впишите угодную вам строкуподсказку (рисунок 8.43).
Рисунок 8.43. Подсказка для пункта меню
Шаг 49. Выполните компиляцию и запустите программу. Проверьте работу механизма подсказок в строке состояния (рисунок 8.44).
298

Рисунок 8.44. Программа для просмотра графических файлов теперь показывает подсказки для пунктов меню в строке состояния
Если критически взглянуть на нынешний вариант программы, то среди прочих мелких замечаний выделяется существенный недостаток: форма неправильно прокручивает свое содержимое, когда размеры рисунка превышают размеры формы. Дело в том, что в прокрутке участвует и строка состояния, а этого быть не должно. Строка состояния должна оставаться на своем месте, прижимаясь к нижнему краю формы. Чтобы разобраться с этой проблемой, читайте следующий параграф.
8.4. Прокрутка
8.4.1. Прокрутка рабочей области формы
На практике часто бывает, что отображаемая информация не умещается на форме целиком (даже если форма раскрыта на весь экран). Например, в нашем примере можно загрузить рисунок, размеры которого превосходят размеры формы (и даже всего экрана) в несколько раз. Лучшее, что можно предпринять в таком случае, — это организовать прокрутку (scrolling) рисунка внутри формы.
В области прокрутки видна только часть всей картины. Доступ к скрытым частям происходит с помощью полос прокрутки. Щелчок мыши на стрелке полосы прокрутки сдвигает изображение на одну "информативную строку", а щелчок мыши на самой линейке прокрутки (но не на бегунке) сдвигает изображение на одну "информативную страницу" (понятия строки и страницы существуют для прокрутки и по вертикали, и по горизонтали). Перемещая бегунок, можно быстро прокрутить изображение на любое число информативных строк или страниц.
Форма имеет встроенную поддержку прокрутки, благодаря чему реализуется просмотр содержимого формы при любом изменении ее размеров. Когда размеры или координаты компонентов превышают размеры формы, форма создает полосы прокрутки и пользователь получает возможность прокручивать изображение. Встроенные в форму полосы прокрутки представлены составными свойствами HorzScrollBar (горизонтальная полоса прокрутки) и VertScrollBar (вертикальная полоса прокрутки). Они кратко описаны в таблице 8.12.
Свойство Описание
299

ButtonSize |
Размер кнопок со стрелками. |
Increment |
Величина “информативной строки” в пикселах. |
Margin |
Минимальный отступ прокручиваемых элементов от края |
|
области прокрутки. |
Position |
Позиция бегунка на полосе прокрутки. |
Range |
Виртуальный размер области прокрутки. |
Size |
Ширина полосы прокрутки. |
Smooth |
Значение True указывает, что значение свойства Increment |
|
должно автоматически рассчитываться компонентом. |
Style |
Стиль полосы прокрутки: ssRegular — обычный |
|
рельефный, ssFlat — плоский, ssHotTrack — плоский с |
|
подсветкой при наведении указателя мыши. |
ThumbSize |
Размер бегунка. |
Tracking |
Если равно значению True, то прокрутка изображения |
|
происходит по мере передвижения бегунка. |
Visible |
Определяет, видна ли полоса прокрутки пользователю. |
Таблица 8.12. Составные свойства HorzScrollBar и VertScrollBar
Наибольший интерес представляют вложенные свойства Tracking и Increment. Установка булевского свойства Tracking в значение True обеспечивает прокрутку изображения по мере передвижения бегунка с помощью мыши. Свойство Increment задает величину "информативной строки" в пикселях. Уменьшив это значение до 1, вы получите более плавную прокрутку.
8.4.2. Отдельная область прокрутки
Как ни крути, а форма не позволяет организовать прокрутку в отдельной своей части. Например, в приложении для просмотра графических файлов хотелось бы организовать прокрутку рисунка, но так, чтобы строка состояния в прокрутке не участвовала. Форма этого сделать не позволяет. Здесь на помощь приходит компонент ScrollBox, представляющий собой отдельную область прокрутки. Он расположен в палитре компонентов на вкладке
Additional (рисунок 8.45).
Рисунок 8.45. Компонент ScrollBox
Таблица 8.13 содержит краткую характеристику его отличительных свойств.
Свойство Описание
Align Способ выравнивания области прокрутки в пределах владельца.
300