Справочник по компонентам Delphi. Часть 1 - Класс TPicture

ОГЛАВЛЕНИЕ

 

Класс TPicture

 TPicture = class(TPersistent) 

Класс-надстройка над TGraphic, точнее — над его потомками. Он содержит поле Graphic, которое может содержать TBitmap, TIcon и TMetafile. Предна­значение TPicture — управлять вызовами соответствующих методов, скрывая при этом хлопоты с определением типа и детали их реализации.

Кроме того, на уровне TPicture определены возможности по регистрации и использованию других — определенных пользователем — классов графических объектов, порожденных от TGraphic. Доступ к графическому объекту осу­ществляется посредством свойства:

 property Graphic: TGraphic; 

Если графический объект ilmcctодин из трех предопределенных типов, то к нему можно обратиться и как к одному из свойств:

 property Bitmap: TBitmap; 
property Icon: TIcon;
property Metafile: TMetafile;

Если в поле Graphic хранился объект одного класса, а затребован — другого, то прежний объект уничтожается, а вместо него создается пустой объект нуж­ного класса. Если же вы описали свой класс (допустим, TDIB), то к его методам и свойствам следует обращаться так:

 (Graphic as TDIB).My Property := MyValue; 

Перечислим остальные методы и свойства:

procedure LoadFromFile(const Filename: scring);Анализирует расширение имени файла FileName и, если оно известно (зарегистри­ровано), то создается объект нужного класса и вызывается его метод LoadFromFile. В противном случае возникает исклю­чительная ситуация EInvalidGraphic. Стан­дартными расширениями являются .ICO, .WMF и .BMP.
procedure SaveToFile(const Filename: string);Сохраняет графику в файле, вызывая соответствующий метод объекта Graphic.
procedure LoadFromClipboardFor-r.ac iAFcr.T.at: Word; AData: T'Handle; APalette: HPALETTE) ;Если формат AFormat найден среди зарегистрированных, то AData и APalette передаются для загрузки одноименному методу соответствующего объекта. Стан­дартно зарегистрированных форматов два: битовое изображение CF BITMAP и метафайл CFMETAFILEPICT.
procedure SaveToClipboardFormat(var AFormat: Word; var AData: THar.dle; var APalette: H?ALE"T3!;Сохраняет графику в буфере обмена, вызывая метод объекта Graphic.
procedure Assign(Source: TPersistent) ;Метод Assign переписан таким образом, чтобы присваиваемый объект мог быть класса как TPicture, так и TGraphic или любого его потомка. Кроме того, пара­метр Source может быть равен nil — в этом случае поле Graphic очищается с удалением прежнего объекта.
class function SupportsClipboardPormat(AFormat: Word) : Boolean;Метод класса возвращает True, если формат AFormat поддерживается классом TPicture (зарегистрирован в системе). Напомним, что методы класса можно вызывать через ссылку на класс, без создания экземпляра объекта.
class procedure RegisterFileFormat(const AExtension, ADescription: string; AGraphicClass: TGraphicClass); class procedure RegisterClipboardFormat(AFormat: Word; AGraphicClass: TGraphicClass) ;Предназначены для создателей новых графических классов. Они позволяют зарегистрировать формат файла и буфера обмена и связать их с созданным классом — потомком TGraphic, который умеет читать и записывать информацию в этом формате.
(^) property Width: Integer; (ко) property Height: Integer-Ширина и высота картинки. Те же, что и у Graphic.
property OnChange: TNotifyEvent;Это событие вызывается при изменениях графического объекта.

Все три разновидности графических объектов имеют свои системы кэширования. Это означает, что на один реально существующий в системе (и занимающий долю ресурсов!) дескриптор могут одновременно ссыпаться не­сколько объектов. Реализуется такое связывание через метод Assign. Выражение

 Iconi.Assign(Icon2) ; 

означает, что два этих объекта разделяют теперь один значок.

Более простым является кэширование для TIcon и TMetafile, которые умеют только отображать себя и не предназначены для редактирования (создатели Delphi считают, что дескриптор графического объекта дается программисту не для того, чтобы ковыряться в нем на уровне двоичных кодов). Гораздо сложнее устроен механизм кэширования для TBitmap, который имеет свою канву для рисования.

Внутреннее представление информации в графических объектах двоякое — она может храниться как поток типа TMemoryStream (в него загружается со­держимое соответствующего файла), как область памяти с дескриптором (струк­тура которой зависит от типа графического объекта) и одновременно в двух этих видах, содержимое которых автоматически синхронизируется. Поэтому будьте готовы к тому, что загрузка изображения потребует вдвое большего объема памяти — особенно это актуально для больших картинок.

Кого-то может удивить отсутствие объявленных методов рисования вроде Draw у TIcon, TMetafile и TBitmap. Такие методы есть, но они недоступны. Все рисование должно осуществляться через вызовы методов Draw и StretchDraw канвы, содержащей графику, ибо канва несет тот контекст, в котором должна осуществляться операция. Рассмотрим предопределенные графические классы.