

Внимание! Значок, заданный с помощью свойства Bitmap, используется только в случае, когда свойство ImageIndex содержит отрицательное число. Поэтому если вы обнаружите, что установка значка с помощью свойства Bitmap не приносит желаемого результата, не паникуйте, а просто проверьте свойство ImageIndex.
Шаг 29. Кстати, мы совсем забыли про значок, все еще хранящийся в свойстве Bitmap компонента OpenMenuItem. Сейчас в нем нет необходимости, поскольку реально используется значок, заданный с помощью свойства ImageIndex. Чтобы не держать в программе ненужные данные, удалите значок из свойства Bitmap. Для этого вызовите дизайнер меню для компонента MainMenu и выберите пункт Open.... Далее в окне свойств перейдите к свойству Bitmap и нажмите клавишу Del, после чего нажмите клавишу Enter.
Теперь мы вплотную приблизились к полноценному приложению для просмотра графических файлов.
8.2. Полноценное приложение для просмотра графических файлов
Сейчас вы достаточно много знаете о меню, и вас наверняка одолевает желание сделать из вышеприведенной заготовки полноценное приложение для просмотра графических файлов. Для этого необходимо решить две задачи:
организовать выбор файла по командам меню Open... и Save As... ;
реализовать загрузку и отображение рисунка.
Первая задача решается с помощью стандартных диалоговых компонентов OpenDialog и SaveDialog, вторая — с помощью специального компонента Image.
8.2.1. Диалоговые окна открытия и сохранения файла
Шаг 30. Диалоговые окна для выбора открываемого или сохраняемого файла организуются с помощью компонентов OpenDialog и SaveDialog (рисунок 8.29). Найдите их в палитре компонентов на вкладке Dialogs и поместите на форму. Первый компонент назовите
OpenDialog, а второй — SaveDialog.
Рисунок 8.28. Компоненты OpenDialog и SaveDialog
Характерные свойства этих компонентов кратко описаны в таблице 8.6.
Свойство |
Описание |
|
|
DefaultExt |
Расширение, которое добавляется к имени файла, |
|
если пользователь его не указал. |
FileName |
Имя выбранного файла. |
Filter |
Фильтры имени файла. |
FilterIndex |
Номер активного фильтра. |
InitialDir |
Начальный каталог, открываемый при первом |
281

|
появлении окна диалога. |
|
|
Options |
Параметры, определяющие внешний вид и поведение |
||
|
окна диалога. (см. таблицу 8.7). |
|
|
OptionsEx |
Дополнительные параметры, определяющие внешний |
||
|
вид и поведение окна диалога (см. таблицу 8.7). |
||
Title |
Заголовок окна диалога. Если значение свойства не |
||
|
указано, то заголовок будет стандартным — Open |
||
|
(Открыть) или Save (Сохранить) в зависимости от |
||
|
типа компонента. |
|
|
OnCanClose |
Происходит, когда пользователь пытается закрыть |
||
|
окно диалога. Позволяет выполнить дополнительные |
||
|
проверки и отменить закрытие окна при |
||
|
необходимости. |
|
|
OnClose |
Происходит |
непосредственно |
перед закрытием |
|
формы после события OnCanClose. |
||
OnFolderChange |
Происходит, если пользователь переходит в другой |
||
|
каталог. |
|
|
OnIncludeItem |
Происходит при добавлении каждого файла в список |
||
|
отображаемых в окне файлов. Позволяет выполнять |
||
|
дополнительную фильтрацию файлов. |
||
OnSelectionChang |
Происходит при смене выделенного файла или списка |
||
e |
файлов. |
|
|
OnShow |
Происходит |
непосредственно |
перед отображением |
|
окна диалога на экране. |
|
|
OnTypeChange |
Происходит, когда пользователь выбирает фильтр. |
Таблица 8.6. Важнейшие свойства и события компонентов OpenDialog и SaveDialog.
Компоненты OpenDialog и SaveDialog очень схожи между собой, оба являются объектноориентированными оболочками стандартных диалоговых окон Windows: Open и Save. На следующем рисунке показано окно Open (рисунок 8.29).
282

Рисунок 8.29. Стандартное окно Open для выбора открываемого файла
Приблизительный сценарий работы с каждым из компонентов OpenDialog и SaveDialog таков. Компонент помещается на форму и конфигурируется для выбора тех или иных файлов. По команде меню Open... или Save As... у соответствующего компонента вызывается метод Execute. Он вызывает диалог и возвращает значение True, если пользователь выбрал файл. Полный маршрут к файлу запоминается в свойстве FileName. Ход дальнейших действий зависит от прикладной задачи и, как правило, включает или чтение, или запись файла, в зависимости от обрабатываемой команды меню.
Придерживаясь написанного сценария, приспособим компоненты OpenDialog и SaveDialog для выбора графических файлов, поддерживаемых нашей программой. Чтобы пользователь мог просматривать файлы выборочно (какого-то одного типа) в диалоговых блоках имеется набор фильтров, оформленный в виде раскрывающегося списка с подписью Files of type (см. рис. выше). Исходные данные для этого списка устанавливаются в свойстве Filter. Номер активного в данный момент фильтра записывается в свойстве FilterIndex.
Шаг 31. Приступим к формированию списка фильтров. Активизируйте на форме компонент OpenDialog и в окне свойств выберите свойство Filter (рисунок 8.30). Щелчком кнопки с многоточием откройте редактор фильтров — окно Filter Editor (рисунок 8.31).
283

Рисунок 8.30. Нажатие кнопки с многоточием вызывает редактор фильтров
Окно Filter Editor представляет собой список с двумя столбцами. В левой колонке вводится текст, отображаемый в раскрывающемся списке Files of type окна диалога. В правом столбце через точку с запятой записываются маски, на основании которых выполняется фильтрация файлов.
Шаг 32. Установите в компоненте OpenDialog фильтры, как показано на рисунке 8.31.
Рисунок 8.31. Окно для редактирования фильтров — Filter Editor
Шаг 33. Аналогичным образом установите фильтры в компоненте SaveDialog. Самый простой и быстрый способ в данном случае — скопировать текст свойства Filter из компонента OpenDialog в компонент SaveDialog через буфер обмена (результат показан на рисунке 8.32):
284

Рисунок 8.32. Фильтры для окна Save скопированы из окна Open
Компоненты OpenDialog и SaveDialog имеют большое количество булевских параметров, организованных в виде составных свойств Options и OptionsEx. Эти параметры влияют на то, как окно диалога выглядит и работает. Их смысл поясняет таблица 8.7.
Параметр |
Описание |
|
|
ofReadOnly |
Если равно True, то переключатель Read-only в окне |
|
диалога включен. |
ofOverwritePrompt |
Если равно True, то пользователю выдается |
|
предупреждение при попытке сохранить файл с |
|
именем, которое уже существует. |
ofHideReadOnly |
Если равно True, то переключатель Read-only |
|
отсутствует в окне диалога. |
ofNoChangeDir |
Если равно True, то пользователь не сможет сменить |
|
каталог в окне диалога. |
ofShowHelp |
Если равно True, то в окне диалога присутствует |
|
кнопка Help. |
ofNoValidate |
Если равно True, то пользователь может вводить в |
|
имени файла любые символы, даже недопустимые. |
ofAllowMultiSelect |
Если равно True, то пользователь может выделить |
|
сразу несколько файлов. |
ofExtensionDifferent |
Этот параметр устанавливается после завершения |
|
диалога, если расширение в имени файла отличается |
|
от начального расширения. |
ofPathMustExist |
Если равно True, то пользователь не сможет ввести |
285

для файла несуществующий маршрут.
ofFileMustExist Если равно True, то пользователь не сможет ввести имя несуществующего файла.
ofCreatePrompt Если равно True и пользователь вводит имя несуществующего файла, то пользователю задается вопрос, желает ли он создать новый файл с таким именем.
ofShareAware Если равно True, то ошибки одновременного доступа к файлу со стороны нескольких приложений игнорируются.
ofNoReadOnlyRetur |
Если равно True, то пользователь не сможет ввести |
|||
n |
файл с атрибутом read-only (только для чтения). |
|||
ofNoTestFileCreate |
Если равно True, то проверка на возможность записи |
|||
|
в каталог не выполняется. |
|
|
|
ofNoNetworkButton |
Если равно True, то кнопка Network отсутствует в |
|||
|
окне диалога. Этот параметр работает только в паре |
|||
|
с параметром ofOldStyleDialog. |
|
||
ofNoLongNames |
Если равно True, то длинные имена файлов |
|||
|
запрещены. |
|
|
|
ofOldStyleDialog |
Если равно True, то окно диалога отображается в |
|||
|
старом стиле Windows 3.1. |
|
|
|
ofNoDereferenceLin |
Если равно True, то ярлыки к каталогам трактуются |
|||
ks |
как обычные файлы. В противном случае они |
|||
|
трактуются как каталоги. |
|
|
|
ofEnableIncludeNoti |
Если равно True, то при формировании списка |
|||
fy |
отображаемых |
файлов |
происходит |
событие |
OnIncludeItem (для каждого файла). В обработчике этого события обычно выполняется дополнительная фильтрация файлов.
ofEnableSizing Если равно значению True, то пользователь имеет возможность изменять размеры окна диалога.
ofDontAddToRecent Если равно значению True, то файл не помещается в список последних открытых файлов.
ofShowHidden Если равно True, то в окне показываются скрытые файлы (файлы с атрибутом Hidden).
ofExNoPlaceBar Если равно True, то боковая панель не показывается в окне диалога. Флажок ofExNoPlaceBar относится к свойству OptionsEx.
286

Таблица 8.7. Параметры компонентов OpenDialog и SaveDialog
Шаг 34. В нашем простом примере ограничимся тем, что установим в компоненте
SaveDialog параметр ofOverwritePrompt в значение True (см. табл. 6.6).
Заметим, что проверить работу компонентов OpenDialog и SaveDialog можно с помощью команды Test Dialog. Она находится в контекстном меню значка компонента в форме.
8.2.2. Отображение рисунков
Шаг 35. Ну вот, диалоговые компоненты настроены. Теперь нужен компонент, обеспечивающий отображение рисунков различных форматов. Такой компонент в среде Delphi есть, он называется Image и находится в палитре компонентов на вкладке Additional (рисунок 8.33). Выберите его из палитры и поместите на форму. Назовите новый компонент Image, а свойствам Left и Top установите значение 0.
Рисунок 8.33. Компонент Image
Характерные свойства компонента Image кратко описаны в таблице 8.8.
Свойство Описание
AutoSize Если равно значению True, то размеры компонента автоматически подгоняются под размеры рисунка.
Center |
Центрирует рисунок в пределах компонента. |
IncrementalDispla Обеспечивает постепенное (по мере загрузки)
yотображение больших рисунков. Используется для устранения эффекта блокировки пользовательского ввода во время отображения рисунка.
Picture |
Cодержит рисунок, отображаемый в области |
|||||
|
компонента. Свойство Picture является объектом |
|||||
|
класса TPicture и может хранить точечный рисунок |
|||||
|
(bitmap), метафайл (metafile), значок (icon). |
|
||||
Proportional |
Если равно значению True, то при масштабировании |
|||||
|
сохраняется пропорция между вертикальным и |
|||||
|
горизонтальным размерами рисунка. |
|
|
|||
Stretch |
Если |
равно |
значению |
True, |
то |
рисунок |
|
масштабируется так, чтобы его размеры совпадали с |
|||||
|
размерами |
компонента. |
Масштабирование |
|||
|
выполняется только для точечных рисунков и |
|||||
|
метафайлов. |
|
|
|
|
Transparent Если равно значению True, то фон рисунков становится прозрачным. Эффект появляется только после установки свойства Picture.
OnProgress Происходит по мере выполнения длительных
287

операций, например во время загрузки больших рисунков.
Таблица 8.8. Основные свойства компонента Image
Компонент Image позволяет отображать рисунки разных форматов: точечные рисунки (BMP), значки (ICO), метафайлы (WMF, EMF). Сам рисунок хранится в свойстве Picture.
Шаг 36. Размеры установленного рисунка могут не совпадать с текущими размерами компонента. В этом случае лишняя часть изображения отсекается. Чтобы подогнать размеры компонента под размеры рисунка установите свойство AutoSize в значение True (рисунок 8.34). После этого при каждой установке свойства Picture размеры компонента (но не рисунка) будут изменяться автоматически.
Рисунок 8.34. Свойство AutoSize в компоненте Image установлено в значение True
Бывает и обратная ситуация, когда нужно подогнать размеры рисунка под заданные размеры компонента. Для этого свойство Stretch устанавливается в значение True, а AutoSize — в значение False. Масштабирование целесообразно применять только для векторных изображений; для точечных рисунков оно не всегда дает приятный результат — начинает сказываться точечная природа изображения.
Сейчас компонент Image находится на своем месте и подготовлен к работе (свойство AutoSize имеет значение True). Рассмотрим, как осуществляется загрузка и сохранение рисунка по командам меню Open... и Save As... .
Шаг 37. В исходном тексте уже имеется недописанный обработчик команды Open... . В нем нужно вызвать стандартное диалоговое окно открытия файла и загрузить рисунок в том случае, если пользователь ввел в этом окне имя файла:
288

procedure TPictureForm.OpenMenuItemClick(Sender: TObject); begin
if OpenDialog.Execute then begin
Image.Picture.LoadFromFile(OpenDialog.FileName);
EnableCommands(True);
NormalSizeMenuItem.Click; end;
end;
В данном обработчике обратите внимание на NormalSizeItem. Он имитирует выбор пункта меню рисунок имел нормальный размер.
вызов метода Click у компонента Normal Size, чтобы сразу после загрузки
Шаг 38. Пункт меню Save As... еще не имеет обработчика события OnClick, поэтому вам придется его создать (напомним, что это делается в окне свойств на вкладке Events). Обработка команды Save As... состоит в вызове стандартного диалогового окна Save с последующем сохранением рисунка в файле:
procedure TPictureForm.SaveAsMenuItemClick(Sender: TObject); begin
if SaveDialog.Execute then Image.Picture.SaveToFile(SaveDialog.FileName);
end;
Шаг 39. Чтобы наш пример, наконец, заработал, осталось дописать несколько обработчиков событий. В обработчике команды меню Close добавим операторы удаления рисунка из компонента 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, которые тоже нужно доработать. С ними вы легко разберетесь:
289

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 вы найдете для своих приложений много полезных и красивых точечных рисунков, значков, курсоров. Если вы еще не исследовали этот каталог, то сделайте это с помощью своей программы.
290