|
<< Нажмите, чтобы показать Содержание >> Обзор RichView Format (RVF) |
RVF (RichView Format) – это формат файлов, специально разработанный для сохранения/загрузки документов TРВ-Редактора (RichView). Это довольно простой и компактный формат. Он может быть текстовым или бинарным (определяется свойством TRichView.RVFOptions).
Этот формат используется:
▪в TDBRichView, TDBRichViewEdit, чтобы хранить документы в бинарных полях базы данных;
▪RVF может быть скопирован в буфер обмена; редактор может вставлять RVF;
▪данные могут быть перетащены мышью в формате RVF;
▪копирование документа из одного компонента в другой удобно реализовывать через сохранение и чтение RVF (см. также свойство Document)
▪можно загружать и сохранять RVF методами: LoadRVFFromStream, InsertRVFFromStream, AppendRVFFromStream, LoadRVF, SaveRVFToStream, SaveRVF.
Все свойства документа TRichVew можно сохранить в формате RVF. Дополнительно можно сохранить наборы стилей текста, абзацев, списков, шаблонов стилей, полей и фона (см. ниже).
▪Основные настройки, влияющие на сохранение и загрузку RVF-файлов, можно изменить в редакторе компонента TRichView во время проектирования (designtime);
▪для загрузки из RVF значков, интерактивных значков и маркеров списка с изображениями из TImageList необходимо обработать событие OnRVFImageListNeeded;
▪вы можете сохранять рисунки и вставленные компоненты в бинарном или текстовом режиме (бинарный режим гораздо эффективнее и компактнее);
▪вы можете сохранять изображения и вставленные компоненты непосредственно в RVF или создавать их по запросу при загрузке;
▪если вы загружаете вставленные компоненты из RVF, необходимо зарегистрировать их классы с помощью процедуры RegisterClasses (например: RegisterClasses([TButton]));
▪то же самое для рисунков; однако, если класс изображения не зарегистрирован, TRichView попытается найти подходящий графический класс на основе содержимого;
▪форматирование текста и абзацев (т.е. стили) сохраняется в RVF-документах опционально, если rvfoSaveTextStyles и rvfoSaveParaStyles включены в RVFOptions;
▪шаблоны стилей сохраняются в RVF, если в RVFOptions указаны опции rvfoSaveTextStyles и rvfoSaveParaStyles, а также UseStyleTemplates=True.
TRichView может самостоятельно сохранять и загружать всё содержимое документа, но есть исключение: значки, интерактивные значки и маркеры списка, использующие изображения из TImageList.
При загрузке ТРВ-Редактору необходимо знать, какой компонент TImageList использовать для данного элемента документа. Он запрашивает эту информацию у приложения, вызывая событие OnRVFImageListNeeded. Вам необходимо обработать это событие, если вы хотите загружать документы с вышеперечисленными элементами.
При сохранении TRichView записывает значение свойства Tag компонента TImageList вместе с другими данными вышеперечисленных элементов документа. При чтении TRichView вызывает событие OnRVFImageListNeeded и передаёт ему это значение.
Пример
Пусть у нас есть два компонента TImageLists (ImageList1 и ImageList2), которые используются в значках документа, который нужно загрузить в MyRichView. Вам нужно:
▪установить ImageList1.Tag в 1, а ImageList2.Tag в 2,
▪обработать событие MyRichView.OnImageListNeeded:
procedure TMyForm.MyRichViewRVFImageListNeeded(
Sender: TCustomRichView; ImageListTag: Integer;
var il: TCustomImageList);
begin
case ImageListTag of
1:
il := ImageList1;
2:
il := ImageList2;
end;
end;
Не путайте ImageList.Tag с тегами элементов документа. В этом случае используется свойство ImageList.Tag.
TRichView не является владельцем компонентов TImageList, он никогда их не уничтожает. Он просто хранит ссылки на них.
В RVF можно сохранять полную информацию об изображениях и вставленных компонентах, но также можно использовать другую возможность: сохранять изображения/элементы управления самостоятельно и включать в RVF только некоторые «идентификаторы», которые можно использовать для создания изображений/компонентов при необходимости (при загрузке). В качестве этих «идентификаторов» можно использовать два значения: теги и названия элементов документа.
При загрузке, используйте события OnRVFPictureNeeded и OnRVFControlNeeded.
procedure TMyForm.MyRichViewRVFControlNeeded( const Tag: TRVTag; var ctrl: TControl); begin case StrToInt(Tag) of 1: begin ctrl := TButton.Create(nil); TButton(ctrl).Caption := Name; end; 2: begin ctrl := TEdit.Create(nil); TEdit(ctrl).Text := Name; end; end; end; |
Как можно видеть, TRichView передаёт два параметра, по которым можно идентифицировать загружаемый компонент:
▪Tag: TRVTag – тег элемента документа (не следует путать с со свойством Tag компонентов, унаследованных от TComponent);
▪Name: TRVUnicodeString – название элемента документа (строковое свойство, имеющееся у каждого нетекстового элемента документа).
procedure MyRichViewRVFPictureNeeded(Sender: TCustomRichView; const ItemName: TRVUnicodeString; Item: TRVNonTextItemInfo; Index1, Index2: Integer; var gr: TRVGraphic); var FileName: TRVUnicodeString; begin if (Index1>=0) and (Index2>=0) then FileName := (Item as TRVTableItemInfo). Cells[Index1, Index2].BackgroundImageFileName else if Item is TRVTableItemInfo then FileName := TRVTableItemInfo(Item).BackgroundImageFileName else if Item is TRVGraphicItemInfo then FileName := TRVGraphicItemInfo(Item).ImageFileName else end; |
Как вы видите, это событие даёт дополнительные возможности для идентификации изображения. Помимо названия (ItemName) и тега (Item.Tag) элемента документа, можно использовать другие свойства. В частности, данный пример использует свойства, специально предназначенные для хранения имени файла.
Изображения могут храниться непосредственно в RVF-файле. RVF содержит имена графических классов, используемых для этих изображений. Если вы хотите использовать те же графические классы для загруженных изображений, вам необходимо зарегистрировать эти классы с помощью процедуры RegisterClasses. VCL-версия ТРВ-Редактора сама регистрирует классы TBitmap, TMetafile, TIcon, TJPEGImage, TWicImage (для Delphi 2010+), TPngImage (для Delphi 2009+). Если вы включите модуль RVGifAnimate2007 в свой проект, TGifImage также будет зарегистрирован (для Delphi 2007+). Все остальные графические классы должны быть зарегистрированы явно. Если указанный в RVF графический класс недоступен при чтении, TRichView попытается определить подходящий класс по содержимому графики.
Если вы включите опцию rvfoIgnoreGraphicClasses в RichView.RVFOptions, RichView будет игнорировать имена графических классов, хранящихся в RVF, и всегда будет пытаться найти подходящий графический класс по содержимому графики.
Свойство TRichView.RVFOptions содержит опции для сохранения и загрузки RVF-файлов.
После загрузки вы можете проверить свойство TRichView.RVFWarnings. В зависимости от опций в TRichView.RVFOptions, некоторые значения в RichView.RVFWarnings могут рассматриваться либо как ошибки (из-за которых чтение было прервано), либо как предупреждения (о возможных проблемах при чтении документа).
Файл RVF может быть записан с использованием единиц измерения (пикселей, твипов или EMU), отличными от Style.Units компонента TRichView, загружающего этот файл.
При загрузке файла RVF компонент работает в соответствии с опцией rvfoCanChangeUnits:
▪Если она исключена из RVFOptions, размеры из RVF преобразуются в Style.Units.
▪Если она включена, то наоборот, размеры из RVF читаются без преобразования, а существующие стили преобразовываются в единицы измерения, считанные из RVF (с использованием метода Style.ConvertToDifferentUnits)
Если при чтении RVF выполняется преобразование единиц измерения, rvfwConvUnits включается в RVFWarnings.
Свойства TRichView:
▪Options,
События TRichView:
▪OnControlAction (ControlAction=rvcaAfterRVFLoad),
▪OnItemAction (ItemAction=rviaInserting and rviaInserted);
Методы TRichView:
▪LoadRVFFromStream, InsertRVFFromStream, AppendRVFFromStream, LoadRVF,
Методы TRichViewEdit :
▪InsertRVFFromStreamEd, InsertRVFFromFileEd,
▪Paste, PasteRVF, CanPasteRVF, CutDef.