Справочник по компонентам Delphi. Часть 3 - Вставка объектов 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
                Image1.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; 

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