Страница 5 из 42 Вставка объектов 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; позволяет ее запретить. Поскольку загрузка сервера "по месту" подразумевает изменение главного меню, то оно должно быть у приложения, содержащего форму с контейнером. |