Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Библиотека визуальных компонентов VCL >> Описание компонентов VCL >> Интерфейс OLE. >> Использование OLE. Вставка объектов OLE из буфера обмена
Переход на главную страницу

Сервер поддерживается
кафедрой информатики и вычислительной техники ГрГУ
тел. +375-(0)152-445-101
E-mail :
kadan@grsu.grodno.by


[Назад]    [Содержание ]    [Вперед]

  


Использование 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. В этом случает дескриптор недействителен, а смысл имеет только параметр PInitInfo; если вставляются имеющиеся в буфере обмена данные одного из обычных форматов, то параметр Format содержит его идентификатор, Handle ? дескриптор соответствующих данных, a PInitInfo равен nil.

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

function PasteSpecialEnabled(Form: TForm; const Pints: array of BOLEFormat) : Boolean;

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

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

procedure TForm1.PasteItemClick(Sender: TObject);
var
═════DataFormat: Word;
═════DataHandle: THandle;
═════TheInfo: Pointer;
begin
═════if PasteSpecialEnabled(Self, Fmts) then
══════════if PasteSpecialDlg(Form1, Fmts, 0, DataFormat, DataHandle, Thelnfo) then
═══════════════if DataFormat = Word(-l) then
════════════════════begin
═════════════════════════OLEContainerl.PInitInfo := Thelnfo;
═════════════════════════ReleaseOLEInitInfo(Thelnfo) ;
════════════════════end
═══════════════else if DataFormat in [CF_BITMAP, CF_METAFILEPICT] then
══════════════════════════════Image1.Picture.Assign(Clipboard) ;
end;

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

function PasteSpecialOLEDlg(Form: TForm; HelpContext: THelpContext;
═══════════════var PInitInfo: Pointer): Boolean;

function PasteSpecialOLEEnabled(Form: TForm): Boolean;

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

Пример вызова диалога PasteSpecialOLEDlg короче предыдущего:

procedure TForm1.PasteItemClick(Sender: TObject);
var
═════TheInfo: Pointer;
begin
═════if PasteSpecialOLEEnabled(Self, Fmts) then
══════════if PasteSpecialOLEDlg(Form1, 0, TheInfo) then
═══════════════begin
════════════════════OLEContainerl.PInitInfo := TheInfo;
════════════════════ReleaseOLEInitInfo(TheInfo) ;
═══════════════end;
end;

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

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

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

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

function LinksDlgEnabled(Form: TForm): Boolean;



[Назад]    [Содержание ]    [Вперед]

  


Для комментария : kadan@grsu.grodno.by

  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017