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


 

Класс TPicture

TPicture = class(TPersistent)

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

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

property Graphic: TGraphic;

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

property Bitmap: TBitrr.ap;
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 канвы, содержащей графику, ибо канва несет тот контекст, в котором должна осуществляться операция. Рассмотрим предопределенные графические классы.

 
« Предыдущая статья   Следующая статья »