Справочник по компонентам Дельфи

Автор: Пользователь скрыл имя, 06 Февраля 2013 в 01:52, аттестационная работа

Описание работы

Класс TList -- универсальный список. Он представляет собой массив нетипированных указателей и поэтому годится для хранения набора любых, в том числе разнотипных, данных и объектов. При добавлении/удалении в список данные не создаются и не уничтожаются -- эта обязанность лежит на программисте. Приведем доступные ему методы и свойства класса.

Работа содержит 1 файл

componens.doc

— 980.33 Кб (Скачать)

procedure RegisterFormAsOLEDropTgt(Form: TForm);

procedure SetFormOLEDropFormats(Form: TForm;

const Fmts: array of BOLEFormat) ;

В паре они делают то же, что и RegisterFormAsOLEDropTarget. Для очистки списка форматов можно воспользоваться процедурой:

procedure ClearForrnOLEDropFormats(Form: TForm);

"Перетаскивание" объектов OLE

Форма может принимать данные, направляемые серверами OLE при помощи интерфейса Drag&Drop. Обратите внимание, что этот случай представляет собой исключение из общего правила, разрешающего "перетаскивать" объекты только в пределах одной формы.

Возможность работы Drag&Drop с OLE реализована, например, в приложениях из пакета Microsoft Office, однако, далеко не все серверы OLE 2.0 ее поддерживают.

Для получения данных путем "перетаскивания" нужно, во-первых, зарегистрировать форму при помощи ReisterFormAsOLEDropTarget. Во-вторых, для формы нужно создать обработчик события OnDragDrop (будьте внимательны: именно для формы, а не для контейнера!). При "перетаскивании" данных OLE этот обработчик получает в параметре Source объект специального класса TOLEDropNotify:

TOLEDropNotify = class(TObject)

public

procedure Setlnfo(Form: TForm; Rect: TRect; Info: BOLEInitInfo);

property DropPorm: TForm;

property DropRect: TRect;

property DataPormat: Word;

property DataHandle: THandle;

property PInitInfo: Pointer ;

end;

Его свойства приведены в таблице:

@ property DropForm: TForm;       Определяет форму, в которую перемещены данные. Значение обычно равно Self.

(Ro) property DropRect: TRect;       Определяет  ПрЯМОуГОЛЬНИК,  В  КОТОрЫН

производилось перемещение. Обычно стягивается в точку, где была отпущена кнопка мыши.

(Ro) property DataFormat: Word;     Определяет формат перемещенных данных. (Ro) property DataHandle: THandle;   Содержит дескриптор перемещенных данных.

(Ro) property pinitinfo: pointer;    Содержит указатель на структуру для инициализации.

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

* если получен объект OLE, то в параметре DataFormat возвращается значение -1. В этом случает дескриптор DataHandle недействителен, смысл имеет только свойство PInitInfo;

* если получены данные в одном из обычных форматов, то свойство DataFormat содержит идентификатор этого формата, DataHandle -- дескриптор соответствующих данных, a PInitInfo имеет значение nil.

Один из примеров обработчиков события OnDragDrop выглядит так:

procedure TFormI.OLEContainerlDragDropfSender, Source: TObject;

X, Y: Integer);

begin

if Source is TOLEDropNotify then with Source as TOLEDropNotify do begin

if (DataFormat = CF_TEXT) then begin

Labell.Caption := StrPas(GlobalLock(DataHandle));

GlobalUnlock(DataHandle) ;

GlobalFree(DataHandle) ;

end

else if DataFormat = Word(-l) then OLEContainerI.PInitInfo :=

TOLEDropNotify(Source).PInitInfo;

end;

end;

Обратите внимание, что в этом примере полученную структуру PInitInfo не нужно освобождать при помощи ReleaseOLEInitInfo.

Вставка объектов 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;

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

Загруженный объект OLE можно активизировать (то есть вызвать его сервер) тремя способами:

(РЬ) property AutoActivate: TAutoActivate;

TAutoActivate = (aaManual, aaGetFocus, aaDoubleClick) ;

Типичным способом (принятым по умолчанию) является двойной щелчок (aaDoubleClick). При установленном aaGetFocus активизация происходит при получении объектом фокуса ввода. Наконец, aaManual обязывает активизировать объект OLE установкой в True одного из свойств:

property Active: Boolean;

property InPlaceActive: Boolean;

Различие между ними в том, что второе (по возможности) осуществляет активизацию "по месту".

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

(Ro) property InActivation: Boolean;

После того, как сервер OLE полностью активизировался, происходит событие

(РЬ) property OnActivate: TNotifyEvent;

и устанавливается в True свойство:

property Modified: Boolean ;

Если при этом вы снова переключитесь на приложение Delphi, то увидите, что на время работы сервера клиентская область контейнера заштриховывается.

Свойство

(РЬ) property Zoom: TZoomFactor;

TZoomFactor = (г025,z050,zlOO,zl50,z200) ;

показывает, с каким масштабом отображаются объекты OLE внутри контейнера (при этом размеры самого контейнера остаются неизменными; если при увеличении часть изображения объекта выходит за границы контейнера, она отсекается).

Взаимодействие сервера OLE со строкой состояния осуществляется посредством обработки событий:

property OnStatusLineEvent: TStatusLineEvent;

TStatusLineEvent = procedure(Sender: TObject; Msg: String) of object;

Контейнер получает от сервера извещение о наступлении такого события. Он должен обработать это сообщение, например, отобразив где-либо строку Msg.

Инициировать это событие можно также при помощи процедуры:

procedure DoStatusLineMsg (Msg :String);

Контейнер может выгружать/загружать содержимое в поток и буфер обмена:

procedure LoadFromFile(const FileName: strings-procedure LoadFromStream(Stream: TStream);

procedure SaveToFile(const FileName: strings-procedure SaveToSCream(Stream: TStream);

procedure CopyToCUpboard (Clear : Boolean);

Параметр Clear в последней процедуре означает необходимость очистки предыдущего содержимого.

TOLEContainer является оконным элементом управления и поддерживает все соответствующие возможности: обработку сообщений от мыши и клавиатуры, фокус ввода, интерфейс Drag&Drop и т. п.

Наконец, в TOLEContainer есть "выходы" на элементы внутреннего устройства интерфейса OLE. Использование этих возможностей не документировано, и более подробное их обсуждение имеет смысл отложить до выхода следующей версии продукта. Здесь мы их только перечислим:

function GetContainer: TIBCont;

property Storage: IStorage;

property Site: TIBSite;

property Part: IBPart;

property PartRect: TRect;

procedure DeleteSite;

procedure DeleteStorage;

Меню OLE

У каждой формы есть свойство ObjectMenuItem. Оно ссылается на пункт меню, который специально выделяется для того, чтобы сервер OLE мог модифицировать его, разместив на этом месте свое подменю. Каждый сервер может производить над данными те или иные операции; их перечень отражаются в подменю. Оно может быть проанализировано с помощью методов, имеющихся у контейнера:

function GetObjectMenultemCount: Integer;

function GetObjectMenuItem(Index: Integer): string;

Первая функция возвращает число пунктов в подменю, а вторая -- имя заданного пункта. Например, при вставке документа русской версии Microsoft Word первыми двумя будут "Редактировать" и "Открыть". Последними двумя пунктами в добавляемом меню всегда являются разделитель и пункт "Convert...", служащий для преобразования типа объекта OLE. Вы можете определить контекст помощи, предназначенный для этого диалога:

(РЬ) property ConvertDlgHelp: THelpContext;

Вызвав функцию GetObjectMenuItem с параметром -1, можно получить имя самого подменю, например, "Paintbrush Picture Object" или "Документ Word".

Действия сервера, связанные с нужным пунктом меню, можно инициировать из программы путем вызова метода:

procedure ObjectMenuAction(Index: Integer);

Подменю становится доступным при получении фокуса компонентом TOLEContainer и блокируется при его утере. Также устанавливает состояние меню метод:

procedure ActivateObjMenuItem(Activate: Boolean);

 

Форма и ее свойства

Последним в этом разделе будет рассмотрен самый важный, особый компонент -- форма. Форма в Delphi -- это синоним окна. В библиотеках для Windows (MFC, OWL) существуют отдельные классы для каждой важной разновидности окон -- диалогового окна, клиентских и дочерних окон MDI и так далее. Разработчики VCL пошли по новому пути, объединив в одном классе свойства и методы всех этих разновидностей. Специализация при этом все равно осталась -- она определяется свойством:

(РЬ) property PcrmStyle: TPormStyle;

TPormStyle = [fsNoririal, fsMDIChild, fsMDIForm, fsStayOnTop) ;

fsNormal -- обычное окно;

fsMDIChild -- дочернее окно приложения MDI;

fsMDIForm -- главное окно MDI;

fsStayOnTop -- окно, остающееся поверх других даже в неактивном состоянии. (В данном случае это касается только других окон приложения).

Такая разновидность, как диалоговое окно, не имеет собственного стиля. Каким образом реализуются его особенности, описано ниже.

У TForm есть методы, которые имеют смысл только для некоторых из стилей FormStyle. Рассмотрим сначала общие свойства и методы формы, а затем -- специфические.

Набор пиктограмм в заголовке окна описывается свойством:

(РЬ) property Borderlcons: TBorderIcons;

TBorderIcon = (biSystemMenu, biMiniinize, biMaximize);

TBorderIcons = set of TBorderIcon;

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

Обрамление формы задается свойством:

(Pb) property BorderStyle: TFormBorderStyle ;

TPormBorderStyle = (bsNone, bsSingle, bsSizeable, bsDialog);

Помимо двух стандартных стилей обрамления (bsNone и bsSingle) у формы есть еще два своих типа (bsSizeable и bsDialog). Эти возможности стандартны для Windows. Особенности реализации здесь заключаются в том, что стиль обрамления может изменяться в процессе выполнения программы.

Каждое окно может находиться в одном из состояний -- нормальном, свернутом (минимизированном) и развернутом (максимизированном), что определяется свойством:

(рта property WindowState: TWindowState;

TWindowState = [wsNormal, wsMinimized, wsMaximized);

Значение этого свойства можно изменить как на этапе разработки, так и во время исполнения.

Окно в свернутом состоянии на экране отображается значком формы, который задается в свойстве:

(Pb) property Icon: TIcon;

Значок главной формы приложения идентифицирует само приложение в TaskManager Windows 3.11 и Windows NT или TaskBar Windows 95. Если он не определен, то используется значок приложения (объекта Application).

Информация о работе Справочник по компонентам Дельфи