Справочник по компонентам Delphi. Часть 3 - Создание нового объекта
ОГЛАВЛЕНИЕ
Создание нового объекта
Этот способ применяется, когда вы хотите добавить к приложению данные из уже существующего файла, снабдив их возможностями одного из серверов OLE, который "умеет" с этими данными работать. Данные можно внедрить или связать. Можно также внедрить новый (пустой) объект, в этом случае сразу будет вызван сервер. В основе этого способа лежит вызов функции:
function InsertOLEObjectDIg(Form: TForm; HelpContext: THelpContext; var PInitInfo: Pointer): Boolean;
Она инициализирует диалог, позволяющий создать новый объект OLE. В случае успешного окончания диалога создается структура типа BOLEInitInfo. Пример этого достаточно прост:
procedure TFormI-BitBtnIClick(Sender: Tobject);
var
Thelnfo : Pointer;
begin
if InsertOLEObjectDIg(Self, 0, Thelnfo) then
begin
OLEContainerI.PInitInfo := Thelnfo;
ReleaseOLEInitInfо(Thelnfo);
end;
end;
Регистрация форматов
Два других способа получения данных OLE — через буфер обмена или посредством "перетаскивания" — требуют выполнения предварительных операций.
Для того чтобы форма могла играть роль получателя данных, нужно сделать следующее:
- Объявить ее как приемник объектов OLE.
- Связать с ней список форматов буфера обмена, получение которых будет поддерживаться.
Обе этих задачи решает вызов функции:
procedure RegisterFormAsOLEDropTarget(Form: TForm; const Fmts: array of BOLEFormat);
Здесь Form — регистрируемая форма, Fmts — массив форматов. Каждый элемент массива форматов является записью типа:
BOLEFormat = Record
fmtid: Word;
fmCName: array [0.. 31] of char;
fmtResultName: array[0..31] of char;
fmtMedium: BOLEMedium;
fmtIsLinkable: Bool;
end;
Поля записи имеют следующее назначение:
- fmtid — идентификатор формата буфера обмена. Это может быть как стандартный формат (CF_TEXT, CF_BITMAP и др.), так и специальный формат для объектов OLE. В этом случае он должен быть зарегистрирован при помощи функции RegisterClipboardFormat (см. пример ниже);
- fmtName — имя, которое появится в списке форматов диалога PasteSpecialDIg;
- fmtResultName — имя формата, которое появится в комментариях внутри этого диалога. Например, если значение fmtResultName равно "Bitmap", то пользователь получит примерно следующий комментарий: "Inserts the contents of the Clipboard into your document as Bitmap";
- fmtIsLinkable — показывает, могут ли данные в этом формате играть роль связанных объектов.
- fmtMedium — константа, идентифицирующая тип данных в буфере обмена. Связана со значением поля fmtid следующим образом:
BOLEMEDSTREAM | Связанные объекты OLE. |
BOLEMEDSTORAGE | Внедренные объекты OLE. |
BOLEMEDMFPICT | Метафайлы (CF.METAFILEPICT). |
BOLEMEDGDI | Графические данные (CF BITMAP, CF SYLK, CF DIP, CF TIFF, CF DIB, CF PALETTE, CF PENDATA, CFJUFF, CFWAVE). |
BOLEMEDHGLOBAL | Все прочие данные. |
Специально для вычисления значения поля fmtMedium по формату данных предусмотрена функция:
function BOLEMediumCalc(frntid: Word): BOLEMedium;
Заполнить требуемый массив можно, например, так:
var
FEmbedClipFmt, FLinkClipFmt: Word;
Fmts: array[0..2] of BOLEFormat;
FEmbedClipFmt := RegisterClipboardFormat('Embedded Object');
FLinkClipFmt := RegisterClipboardFormat('Link Source');
Fmts[0].fmtid := FEmbedClipFmt;
Fmts[0].fmtMedium := BOLEMediumCalc(FEmbedClipFmt);
Fmts[0].fmtIsLinkable := False;
StrPCopy (Fmts[0].fmtName, '%s');
StrPCopy (Fmts[0].fmtResultName, '%s');
Fmts[l].fmtid := FLinkClipFmt;
Fmts[l].fmtMedium := BOLEMediumCalc(FLinkClipFmt);
Fmts[1].fmtIsLinkable := True;
StrPCopy (Fmts[1].fmtName, '%s');
StrPCopy (Fmts[1].fmtResultName, '%s');
Fmts[2].fmtid := CF_BITMAP;
Fmts[2].fmtMedium := BOLEMediumCalc(CF_BITMAP);
Fmts[2].fmtIsLinkable := False;
StrPCopy (Fmts[2].fmtName, 'Bitmap');
StrPCopy (Fmts[2].fmtResultName, 'Device-dependent Bitmap');
RegisterFormAsOLEDropTarget(Self, Fmts);
Для упрощения создания элемента списка форматов есть функция:
function OLEFormat(AFmtId: Word; AName, AResultName: String; AIsLinkable: Bool): BOLEFormat;
Она заполняет структуру типа BOLEFormat переданными ей параметрами и возвращает указатель на нее. Приведенный выше фрагмент кода можно преобразовать так:
FEmbedClipFmt := RegisterClipboardFormat С Embedded Object');
FLinkClipFmt := RegisterClipboardFormat ('Link Source');
RegisterFormAsOLEDropTarget (Self, [OLEFormat (PEmbedClipFmt, '%s', '%s', FALSE), OLEFormat (PLinkClipFmt, '%s', '%s', TRUE)]);
Для тех случаев, когда регистрацию формы и установку списка возможных форматов нужно произвести раздельно, предусмотрены процедуры:
procedure RegisterFormAsOLEDropTgt(Form: TForm);
procedure SetFormOLEDropFormats(Form: TForm; const Fmts: array of BOLEFormat);
В паре они делают то же, что и RegisterFormAsOLEDropTarget. Для очистки списка форматов можно воспользоваться процедурой:
procedure ClearForrnOLEDropFormats(Form: TForm);