Справочник по компонентам Delphi. Часть 3
Страница 5. Вставка объектов OLE из буфера обмена


 

Вставка объектов OLE из буфера обмена

Вставку реализует специальный диалог, вызываемый функцией:

function PasteSpecialDlg(Form: TForm; const Fmts: array of BOLEFormat; HelpContext: THelpContext; var Format: Word; var Handle: THandle; var PInitInfo: Pointer ): Boolean;

Параметры этой функции означают следующее:

Form — принимающая данные форма;

Fmts — список поддерживаемых форматов данных;

HelpContext — контекст системы помощи для диалога (в файле с расширением .HLP, связанном с приложением). Если этот параметр имеет значение 0, то кнопка Help будет отсутствовать;

Функция присваивает значения трем параметрам:

Format — выбранный пользователем формат (из доступных в диалоге);

Handle — дескриптор данных;

PInitInfo — указатель на структуру данных инициализации. Функция возвращает True, если пользователь нажал в диалоге кнопку ОК или клавишу <Enter>. Логическая взаимосвязь между значениями Format, Handle и PInitInfo такая:

• если пользователь решил присоединить или встроить имеющийся в буфере обмена объект, то в параметре Format возвращается значение -1. В этом случает дескриптор недействителен, а смысл имеет только параметр PTnitTnfo:

• если вставляются имеющиеся в буфере обмена данные одного из обычных форматов, то параметр Format содержит его идентификатор, Handle — дескриптор соответствующих данных, a PInitInfo равен nil.

Перед тем, как вызывать PasteSpecialDIg, нужно убедиться в целесообразности этого, вызвав функцию:

function PasteSpecialEnabledfForm: TForm; const Pints: array of BOLEFormat): Boolean;

Она проверяет, есть ли в буфере обмена данные поддерживаемых формой Form форматов и, если это так, возвращает True. Если вы вызвали PasteSpecialDIg, не произведя проверку с помощью этой функции, то диалог появится, но в случае отсутствия данных не произведет никаких действий.

Посмотрите на приведенный ниже пример использования вызова диалога PasteSpecialDIg:

procedure TFormI.PasteItemClick(Sender: TObject); var DataFormat: Word; DataHandle: THandle; Thelnfo: Pointer; begin if PasteSpecialEnabledfSelf, Pints) then

if PasteSpecialDIg(Formi, Fmts, 0, DataFormat, DataHandle, Thelnfo) then

if DataFormat = Word(-l) then begin

OLEContainerl.PInitInfo := Thelnfo; ReleaseOLEInitInfo(Thelnfo); end

else if DataFormat in [CP_BITMAP, CF_METAPILEPICT] then Iinagel -Picture .Assign (Clipboard) ;

end;

Если вы хотите ограничиться вставкой из буфера обмена только объектов OLE, возможно значительно упростить описанный выше механизм. Функции

function PasteSpecialOLEDIg(Form: TForm; HelpContext: THelpContext; var PInitInfo: Pointer): Boolean; function PasteSpecialOLEEnabled(Form: TForm): Boolean;

являются полными аналогами PasteSpecialDIg и PasteSpecialEnabled — но толь­ко в части, касающейся OLE. Список зарегистрированных форматов по-преж­нему необходим, но в нем будут играть роль только форматы для связанного и внедренного объектов.

Пример вызова диалога PasteSpecialOLEDIg короче предыдущего: procedure TFormI.PasteitemClick(Sender: TObject); var Thelnfo: Pointer; begin if PasteSpecialOLEEnabled(Self, Fmts) then

if PasteSpecialOLEDIg(Formi, 0, Thelnfo) then begin

OLEContainerl.PInitInfo := Thelnfo; ReleaseOLEInitInfo(Thelnfo) ; end; end;

С помощью переключателей (радиокнопок), имеющихся в диалогах вставки, пользователь может определить, хочет ли он встроить или связать объект с вашим приложением.

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

procedure LinksDig(Form: TForm; HelpContext: THelpContext);

Если связанного объекта нет, то вызов LinksDig не имеет смысла. Убедитесь в целесообразности при помощи функции:

function LinksDlgEnabled(Form: TForm): Boolean; Свойства контейнера Проверить наличие объекта OLE в контейнере позволяет метод: function OLEObjAllocated: Boolean; Свойство (Pb) property AutoSize: Boolean;

означает, что контейнер автоматически принимает размер помещенного в него объекта OLE. Играет роль оно только в момент внедрения (связывания).

После того, как в контейнер загружен объект OLE, его можно идентифицировать при помощи свойств:

(Pb) property ObjClass: String; (Pb) property ObjDoc: String; (Pb) property Objitem: String;

Свойство ObjClass представляет собой имя (класс) объектов, поддерживаемых данным сервером OLE, например "Документ Microsoft Word 6.0", "Visio 3.0 Drawing" или "Paintbrush Picture".

Свойства ObjDoc и Objitem применяются только для связанных объектов. Первое свойство представляет собой имя документа (зачастую имя файла), а второе — имя его части (если контейнер связан только с частью документа, например, с фрагментом изображения). Вы можете увидеть значения ObjDoc и Objitem в диалоге LinksDig: они разделяются восклицательным знаком и в паре составляют имя связи.

Нужно отметить, что правило присвоения этих трех имен — прерогатива сервера, и подробности этого нужно искать в соответствующей документации.

Редактирование внедренных объектов возможно как в отдельном окне, созда­ваемом сервером, так и прямо в содержащем его документе ("по месту"). Последняя возможность предусмотрена спецификацией OLE 2.0; при этом могут заменяться главное меню и строка состояния формы.

Контейнер OLE в VCL поддерживает работу с серверами обеих спецификаций. Если же по каким-либо причинам активизация сервера "по месту" нежелатель­на, то установка в False свойства

(Pb) property AllowInPlace: Boolean;

позволяет ее запретить. Поскольку загрузка сервера "по месту" подразумевает изменение главного меню, то оно должно быть у приложения, содержащего форму с контейнером.

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