Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

DiVM / OOP / 12_116608_1_51491

.pdf
Скачиваний:
26
Добавлен:
11.05.2015
Размер:
6.45 Mб
Скачать

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

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