На этом шаге мы рассмотрим компонент TOLEContainer.
Компонент TOleContainer является удобным контейнером для размещения связанного или внедренного OLE-объекта (Object Linked or Embedding - связывание или внедрение объекта). Такие объекты (таблицы, картинки, фрагменты текста и т.п.) на форме Delphi-программы выглядят как обычно или заменяются значками. Особенностью OLE-объекта является то, что его активизация (обычно двойным щелчком мышью) приводит к активизации связанной с объектом программы, которая называется OLE-сервером и которая после загрузки показывает на экране свое окно и предоставляет пользователю средства редактирования объекта.
Типичными OLE-серверами являются такие системные утилиты, как Paint и Notepad, текстовый процессор Word, табличный процессор Excel и др.
Чтобы наглядно продемонстрировать возможности компонента, проделаем следующее действия.
Рис.1. Windows-окно приложения при запуске
procedure TForm1.FormCreate(Sender: TObject); const BMP_Name = 'C:\Program Files\Common Files\Borland ' + 'Shared\Images\Splash\16Color\athena.bmp'; begin OleContainerl.CreateObjectFromFile(BMP_Name, False); end;
Запустим программу и дважды щелкнем на изображении мышью. После паузы, вызванной загрузкой программы-сервера, мы увидем окно, показанное на рис.2.
Рис.2. Работа с контейнером OLE
Теперь мы можем использовать средства графического редактора Paint для редактирования изображения. Чтобы завершить редактирование, нужно нажать клавишу Esc, тогда окно примет первоначальный вид, но изображение в нем сохранит все внесенные в него изменения.
Компонент может создавать как связанные, так и внедренные объекты и открывать окно сервера как в отдельном окне, так и в окне содержащей его программы-клиента. В последнем случае при запуске сервера происходит автоматическая замена пунктов главного меню программы с групповыми индексами 1, 3 и 5 (если они есть - вот почему в примере вставлено главное меню с незадействованной командой Файл) пунктами главного меню сервера, а также вставка в окно программы инструментальных панелей сервера. Если компонент открывается в окне клиента, его свойство Align (или такое же свойство панели, на которую он помещен) должно иметь значение alClient.
Свойства компонента TOleContainer:
Свойство | Описание |
---|---|
Property AllowActiveDoc: Boolean; | Определяет поддержку интерфейса IOleDocumentSite. При установке значения True контейнер OLE размещает элементы ActiveDoc (DocObject). |
Property AllowInPlace: Boolean; | Определяет способ размещения OLE-сервера. Если имеет значение True и свойство Icon = False, окно сервера с редактируемым объектом размещается в пределах компонента, в противном случае создается отдельное окно для сервера (независимо от значения Icon). |
TAutoActivate = (aaManual, aaGetFocus, aaDoubleClick); Property AutoActivate: TAutoActivate; |
Определяет способ активизации OLE-объекта:
|
Property AutoVerbMenu: Boolean; | Если имеет значение True, для компонента автоматически создается вспомогательное меню, содержащее доступные команды OLE-сервера. |
Property CanPaste: Boolean; | Имеет значение True, если буфер обмена (clipboard) содержит OLE-объект (или связь с ним), который(ую) можно вставить в компонент. Доступно только для чтения. |
Property CopyOnSave: Boolean; | Если содержит True, перед сохранением объекта в файле или потоке данных он предварительно сжимается для экономии размеров файла (потока данных). Если в компоненте размещен очень большой объект и динамической памяти может не хватить для создания временной копии сжатого объекта, в свойство следует поместить значение False. |
Property Iconic: Boolean; | Содержит True, если объект будет заменяться значком OLE-сервера, и False, если объект изображается так, как он появится в окне сервера. |
Property Linked: Boolean; | Содержит True, если объект связан с программой, и False - если является ее частью (внедрен в нее). Доступно только для чтения. |
Property Modified: Boolean; | Содержит True, если объект был изменен (в том числе заменен другим или уничтожен). |
Property NewInserted: Boolean; | Содержит True, если объект был заново создан с помощью метода InsertObjectDialog. В этом случае вызывайте метод DoVerb (ovShow), чтобы показать объект в окне сервера. Доступно только для чтения. |
Property ObjectVerbs: TStrings; | Содержит список команд, которые программа может посылать серверу. Доступно только для чтения. |
Property OldStreamFormat: Boolean; | В это свойство следует поместить True перед чтением объекта из файла или потока данных, если объект был создан версией Delphi 1. |
Property OleClassName: String; | Содержит имя класса, под которым (именем) был зарегистрирован OLE-сервер в реестре Windows. Доступно только для чтения. |
Property OleObject: Variant; | Содержит ссылку на OLE-объект. |
Property PrimaryVerb: Integer; | Содержит индекс умалчиваемой команды для OLE-объекта. |
TSizeMode = (smClip, smCenter, smScale, smStretch, smAutoSize); Property SizeMode: TSizeMode; |
Определяет способ размещения OLE-объекта в контейнере:
|
Property SourceDoc: String; | Содержит имя файла для связанного объекта. |
type TObjectState = (osEmpty, osLoaded, osRunning, osOpen, osInPlaceActive,
osUIActive); Property State: TObjectState; |
Определяет состояние OLE-объекта:
|
Методы компонента TOleContainer:
Метод | Описание |
---|---|
Procedure Close; | Закрывает сервер. Все сделанные к этому моменту изменения в объекте автоматически сохраняются. |
Procedure Copy; | Копирует объект в буфер обмена. |
Procedure CreateLinkToFile(const FileName: String; Iconic: Boolean); | Создает связанный объект по имени файла FileName. Параметр Iconic содержит True, если изображение объекта заменяется значком. |
Procedure CreateObject(const OleClassName: String; Iconic: Boolean); | Создает внедренный объект по имени класса сервера OleClassName. Параметр Iconic содержит True, если изображение объекта заменяется значком. |
Procedure CreateObjectFromFile(const FileName: String; Iconic: Boolean); | Создает внедренный объект по имени файла FileName. Параметр Iconic содержит True, если изображение объекта заменяется значком. |
Procedure DestroyObject; | Уничтожает объект без сохранения сделанных в нем изменений. |
Procedure DoVerb(Verb: Integer); | Требует от объекта выполнить действие с индексом Verb из списка ObjectVerbs. |
Function GetlconMetaPict: HGlobal; | Возвращает указатель на распределенный в куче метафайл для прорисовки значка объекта на другой канве. |
Function InsertObjectDialog:Boolean; | Создает и показывает диалоговое окно создания объекта. Возвращает True, если пользователь закрыл окно щелчком на кнопке ОК. |
Procedure LoadFromFile(const FileName: String); | Загружает объект из файла FileName. |
Procedure LoadFromStream (Stream: TStream); | Загружает объект из потока данных Stream. |
Function ObjectPropertiesDialog: Boolean; | Создает и показывает диалоговое окно изменения свойств объекта. Возвращает True, если пользователь закрыл окно щелчком на кнопке ОК. |
Procedure Paste; | Создает объект но данным, хранящимся в буфере обмена. |
Function PasteSpecialDialog: Boolean; | Создает и показывает диалоговое окно специальной вставки объекта. Возвращает True, если пользователь закрыл окно щелчком на кнопке ОК. |
Procedure Run; | Запускает сервер, но не активизирует объект. Активизация объекта при запущенном сервере происходит значительно быстрее. |
Procedure SaveAsDocument(const FileName: String); | Сохраняет объект в файле FileName с использованием формата OLEDocument. |
Procedure SaveToFile(const FileName: String); | Сохраняет объект в файле FileName. |
Procedure SaveToStream(Stream: TStream); | Сохраняет объект в потоке данных Stream. |
Procedure UpdateObject; | Обновляет объект, вновь загружая его из источника. |
Procedure UpdateVerbs; | Обновляет список ObjectVerbs (некоторые команды могут его изменить, например, команда Play может заменить Play на Stop). |
Property OnActivate: TNotifyEvent; | Возникает сразу после активизации объекта. |
Property OnDeactivate: TNotifyEvent; | Возникает сразу после перехода объекта в неактивное состояние. |
Дополнительную информацию по этому компоненту можно получить здесь.
На следующем шаге мы рассмотрим остальные компоненты вкладки System.