Страница 28 из 39 Класс 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 канвы, содержащей графику, ибо канва несет тот контекст, в котором должна осуществляться операция. Рассмотрим предопределенные графические классы. |