100 компонентов общего назначения библиотеки Delphi5

       

Изображение в компоненте Image битовой матрицы (а) и пиктограммы (6)

а)
б)

В этом приложении метод LoadFromFile применен к Image1.Picture. Если будут открываться только файлы битовых матриц, то оператор загрузки файла можно заменить на Image1.Picture.Bitmap.LoadFromFile( OpenPictureDialog1.FileName);

Для пиктограмм можно было бы использовать оператор Image1.Picture.Icon.LoadFromFile( OpenPictureDialog1.FileName); а для метафайлов — оператор Image1.Picture.Metafile.LoadFromFile( OpenPictureDialog1.FileName); или Image1.Picture.Graphic.LoadFromFile( OpenPictureDialog1.FileName) ;

Но во всех этих случаях, если формат файла не совпадет с предполагаемым, возникнет ошибка. Аналогично работает и метод SaveToFile с тем отличием, что примененный к Picture или к Picture.Graphic он сохраняет в файле изображение любого формата. Например, если вы дополните свое приложение диалогом SavePictureDialog (см. ), введете в меню раздел Сохранить как и в его обработчик поместите оператор if SavePictureDialog1.Execute then Image1.Picture.SaveToFile(SavePictureDialog1.FileName); то пользователь получит возможность сохранить изображение любого формата в файле с новым именем. Только при этом, чтобы не возникало в дальнейшем путаницы, расширение сохраняемого файла все-таки должно соответствовать формату сохраняемого изображения.

Абсолютно идентично для изображений любого формата будет работать программа, если оператор сохранения вы замените на Image1.Picture.Graphic.SaveToFile( SavePictrureDialog1.FileName); использующий свойство Picture.Graphic. А если вам известен формат хранимого в компоненте Image изображения, то вы можете применить метод SaveToFile к свойствам Picture.Bitmap, Picture.Icon и Picture.Metafile.

Для всех рассмотренных объектов Picture, Picture.Bitmap, Picture.Icon и Picture.Metafile определены методы присваивания значений объектов: procedure Assign(Source: TPersistent);

Однако, для BitMap, Icon и Metafile присваивать можно только значения однородных объектов: соответственно битовых матриц, пиктограмм, метафайлов. При попытке присвоить значения разнородных объектов генерируется исключение ЕConvertError. Объект Picture — универсальный, ему можно присваивать значения объектов любых из остальных трех классов. А значение Picture можно присваивать только тому объекту, тип которого совпадает с типом объекта, хранящегося в нем.

Метод Assign можно использовать и для обмена изображениями с буфером Clipboard. Например, оператор Clipboard.Assign(Image1.Picture) ; занесет в буфер обмена изображение, хранящееся в Image1. Аналогично оператор Image1.Picture.Assign(Clipboard) ; прочитает в Image1 изображение, находящееся в буфере обмена. Причем это может быть любое изображение и даже текст.

Надо только не забыть при работе с буфером обмена вставить в оператор uses вашего модуля ссылку на модуль Clipbrd. Автоматически Delphi эту ссылку не вставляет.

Возвращаясь к свойствам компонента Image, можно отметить один недостаток, присущий нашему тестовому приложению, приведенному на Рисунок 4.5. При загрузке разных изображений размер окна приложения может оказаться или слишком маленьким, и тогда вы увидите только часть изображения, или слишком большим, и тогда изображение будет некрасиво размещено в левом верхнем углу формы, оставляя много пустого пространства. Этот недостаток можно устранить, если воспользоваться свойствами Height (высота) и Width (ширина) компонента Image. При свойстве AutoSize установленном в true размеры Image автоматически устанавливаются равными размерам загруженного изображения. И этими размерами можно воспользоваться для соответствующего изменения размеров формы. Например, приведенный ранее код загрузки изображения из файла можно заменить на следующий: if OpenPictureDialog1.Execute then begin Image1.Picture.LoadFromFile( OpenPictureDialog1.FileName); Form1.ClientHeight := Image1.Height+10; Image1.Top := Form1.ClientRect.Top + (Form1.ClientHeight - Image1.Height) div 2; Form1.ClientWidth := Image1.Width+10; Image1.Left := Form1.ClientRect.Left + (Form1.ClientWidth - Image1.Width) div 2; end;

В этом коде размеры клиентской области формы устанавливаются несколько больше размеров компонента Image1, которые в свою очередь адаптируются к размеру картинки благодаря свойству AutoSize. Внесите эти исправления в свое приложение, выполните его и увидите, что форма стала автоматически адаптироваться к размерам загруженного изображения.



Содержание раздела