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