Автор работы: Пользователь скрыл имя, 24 Мая 2013 в 16:39, реферат
В этом разделе не описаны расположенные на этой странице компоненты TDDEClient, TDDEClientItem, TDDEServer И TDDEServerItem.
Они рассчитаны на поддержку устаревшей технологии межпрограммного обмена данными DDE - Dynamic Data Exchange (динамический обмен данными), которая в современных программах полностью вытеснена технологией OLE.
Иногда требуется воспроизвести короткий звуковой сигнал для привлечения внимания пользователя программы - например, после завершения длительного , по времени процесса- обновления данных. Стандартная для Delphi процедура без параметров Веер извлекает сигнал из системного динамика только в том случае, если ПК не оснащен звуковой картой. С другой стороны, мощные возможности компонента TMediaPlayer кажутся излишними для решения этой задачи на ПК, оснащенных звуковой картой. В этом случае может пригодиться API-функция MessageBeep, с помощью которой Windows 32 озвучивает стандартниге диалоговые окна. Единственным параметром обращения к ней является один из следующих идентификаторов стандартного звука: mb_IconAsfcerisk, mb_IconExcla-mation, mb_IconHand, mb IconQuestion, mb Ok. Обращение с параметром $ffffffff игнорирует звуковую карту и извлекает “бип” из системного динамика. Сразу после обращения функция возвращает управление программе и воспроизводит звук асинхронно.
Значительно более богатыми возможностями в этом отношении имеет, API-функция PlaySound, которая способна воспроизводить любые звуковые клипы.
Заголовок функции:
function PlaySound(pszSound: PChar; hmod: HINST;
fdw.Sound: Cardinal): .Boolean;
3десь pszSound - имя воспроизводимого файла; hmod - указывает Экземпляр программы, если звук берется из ресурсного файла ( в противном случае содержит 0); fdwSound - параметр, уточняющий воспроизведение. Его значениями могут быть: snd_async звук воспроизводится асинхронно (функция возвращает управление сразу после обращения к ней); end loop звук воспроизводится постоянно до тех пор, пока не будет .вызвана та же функция с параметром pszSound=0;
SND_NOSTOP функция пытается воспроизвести звук, если устройство не занято; в противном случае не воспроизводит ничего; если устройство занято, но этот параметр не указан, функция прервет воспроизведение старого звука и начнет воспроизведение нового;
SND_NOWAIT если устройство
занято, функция не будет
SND_PORGE. прекращает, воспроизведение всех звуков для данной задачи;
SND SYNC воспроизводит звук
синхронно и возвращает
18.4.4. TOleContainer - контейнер объектов OLE
Компонент является удобным контейнером для размещения связанного или внедренного OLE-объекта. Такие объекты (таблицы, картинки, фрагменты текста и т. п.) на форме Delphi-программы выглядят как обычно или заменяются пиктограммами. Замечательной особенностью OLE-объекта является то, что его активизация (обычно с помощью двойного щелчка мышью) приводит к активизации связанной с объектом программы, которая называется OLE-сервером и которая после загрузки показывает на экране свое окно и предоставляет пользователю средства редактирования объекта.
Типичными OLE-серверами являются такие системные утилиты, как Paint и Notepad, текстовый процессор Word, табличный процессор Excel и др.
Чтобы наглядно продемонстрировать возможности компонента, проделайте следующее.
procedure TFormI.FormCreate(Sender: TObject);
begin
{Поскольку в следующем
OleContainerI.
end;
Запустите программу и дважды щелкните
по изображению мышью. После паузы,
вызванной загрузкой программы-
Рис. 18.37. Пример связывания OLE-обьекта с сервером Paint
Теперь вы можете использовать средства
графического редактора Paint для редактирования
изображения. Чтобы завершить
Не правда ли, весьма впечатляющая демонстрация мощных возможностей компонента: ведь для полноценного доступа к сложной технологии OLE понадобился единственный вызов одного из его методов.
Компонент может создавать как связанные, так и внедренные объекты и открывать окно сервера как в отдельном окне, так и в окне содержащей его программы. В последнем случае при запуске сервера происходит автоматическая замена опций главного меню программы с групповыми индексами 1, 3 и 5 (если они есть) на опции главного меню сервера, а также вставка в окно программы инструментальных панелей сервера. Если компонент открывается в окне программы, его свойство Align (или такое же
свойство панели, на которую он помещен) должно иметь значение alClient.
Свойства компонента:
property AllowActiveDoc: Boolean; |
Разрешает/запрещает компоненту использовать специализированный интерфейс для документов loleDocumentSite |
property AllowInPlace: Boolean;
|
Определяет способ размещения OLE- сервера. Если имеет значение True и свойство Icon=False, окно сервера с редактируемым объектом размещается в пределах размера компонента, в противном случае создается отдельное окно для сервера (независимо от значения icon) |
TAutoActivate = (aaManual, aaGet- Focus, aaDoubleClick) ; property AutoActivate: TAutoActivate; |
Определяет способ активизации OLE- объекта: aaManual - активизируется путем программного вызова метода doVerb(ovShow);aaGetFocus - активизирует ся при получении фокуса ввода; aaDouble Click - активизируется при двойном щелчке мышью |
property AutoVerbMenu: Boolean; |
Если имеет значение True, для компонента
автоматически создается |
TBorderStyle = bsNone..bsSingle; property BorderStyle: Tborder Style; |
Определяет стиль рамки: bsNone - компонент не имеет рамки; bsSingle - компонент имеет рамку толщиной 1 пиксель |
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 Newlnserted: Boolean; |
Содержит True, если объект был заново создан с помощью метода insertOb jectDialog. В этом случае вызывайте DoVerb (ovShow), чтобы показать объект в окне сервера. Доступно только для чтения |
property ObjectVerbs: TStrings; |
Содержит список команд, которые программа может посылать серверу. Доступно только для чтения |
property OldStreamFormat: Boolean;
|
В это свойство следует поместить True перед чтением объекта из файла или потока, если объект был создан версией Delphi 1 |
property OleClassName: String; |
Содержит имя класса, под которым был зарегистрирован OLE-сервер в реестре Windows. Доступно только для чтения |
property OleObject: Variant; |
Содержит ссылку на OLE-объект |
property OleObjectInterface: IQleObject; |
Предоставляет доступ к OLE-объекту через интерфейс сloleObject |
property PrimaryVerb: Integer; TSizeMode = (smClip, smCenter, smScale, smStretch, smAutoSize) ; property SizeMode: TSizeMode; |
Содержит индекс умалчиваемой команды для OLE-объектаОпределяет способ размещения OLEобъекта в контейнере: smClip - отсекаются любые части объекта, выходящие за границы контейнера; smCenter - центрируется в контейнере; smScale - масштабируется так, чтобы целиком заполнить границы контейнера; smStretch - масштабируется так, чтобы не нарушились пропорции объекта; smAutoSize - изменяются границы контейнера, чтобы полностью отобразить объект без искажений |
property SourceDoc: String; |
Содержит имя файла для |
type TObjectState = (osEmpty, osLoaded, osRunning, osOpen, os- InPlaceActive, osUIActive); property State: TObjectState;
|
Определяет состояние OLE-объекта: osEmpty - контейнер не содержит объект; osLoaded - объект загружен, но его сервер не запущен; osRuftning - запущен OLE-сервер; osOpen - объект открыт в отдельном окне; osinPlaceActive - объект открыт в окне контейнера, но сервер еще не заменил опции меню и инструментальные панели программы на свои (промежуточное состояние перед osOIActive); osUIActive -объект открыт в окне контейнера |
property Storagelnterface: IStorage; |
Открывает доступ к интерфейсу низкого уровня istorage, использующемуся для обращения к API OLE |
Методы компонента: | |
function ChangeIconDialog: Boolean;
|
Создает и показывает диалоговое окно смены пиктограммы, заменяющей изображение объекта. Возвращает True, если пользователь закрыл окно кнопкой ОК |
procedure Close; |
Закрывает сервер. Все сделанные к этому моменту изменения в объекте автоматически сохраняются |
procedure Copy;rocedure 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 CreateObjectFromInfo (const Createlnfo: TCreateInfo); |
Создает объект по информации, хранящейся в Createlnfo (см.ниже) |
procedure DestroyObject; |
Уничтожает объект без сохранения сделанных в нем изменений |
procedure DoVerb(Verb: Integer); |
Требует от объекта выполнить действие с индексом verb из списка objectVerbs |
function GetIconMetaPict: HGlobal; |
Возвращает указатель на распределенный в куче метафайл для прорисовки пиктограммы объекта на другой канве |
function InsertObjectDialog: Boolean; |
Создает и показывает диалоговое окно создания объекта. Возвращает True, если пользователь закрыл окно кнопкой OK |
procedure LoadFromFile (constFileName: String); |
Загружает объект из файла FileName. Если OldStreamFormat содержит True, загружает объект, созданный с помощью Delphi 1 |
procedure LoadFromStream(Stream:TStream) ; |
Загружает объект из потока Stream. Если OldStreamFormat содержит True, загружает объект, созданный с помощью Delphi 1 |
function ObjectPropertiesDialog: |
Создает и показывает диалоговое окно изменения свойств объекта. Возвращает True, если пользователь закрыл окно кнопкой OK |
procedure Paste; |
Создает объект по данным, хранящимся в буфере Сlipboard |
function PasteSpecialDialog: Boolean;
|
Создает и показывает диалоговое окно специальной вставки объекта. Возвращает True, если пользователь закрыл окно кнопкой ОК |
procedure Run; |
Запускает сервер, но не активизирует объект. Активизация объекта при запущенном сервере происходит значительно быстрее |
procedure SaveAsDocument(const FileName: Strings- |
Сохраняет объект в файле FileName с ис пользованием формата OLE Document |
procedure SaveToFile(const FileName: String) ;
|
Сохраняет объект в файле FileName. Если OldStreamFormat содержит True, объект может быть загружен программой, созданной с помощью Delphi 1 |
procedure SaveToStream(Stream:TStream); |
Сохраняет объект в потоке Stream. Если OldStreamFormat содержит True, объект может быть загружен программой, созданной с помощью Delphi 1 |
procedure UpdateObject; |
Обновляет объект, вновь загружая его из источника |
procedure UpdateVerbs; |
Обновляет список Objectverbs (некоторые команды могут его изменить, например, команда Play может заменить Play на Stop) |
Метод СreateObjectFrominfo использует запись типа
type
TCreateInfo = record
CreateType: TCreateType;
ShowAsIcon: Boolean;
IconMetaPict: HGlobal;
ClassID: TCLSID;
FileName: String;
DataObject: IDataObject;
end;
type TCreateType = (ctNewObject, ctFromFile, ctLinkToFile, ctFromData, ctLinkFromData) ;
поля которой имеют следующие назначения:
CreateType |
Тип объекта и его источник: ctNewObject - внедренный объект, заданный идентификатором класса ClassID; ctFromFile - внедренный из файла FileName; ctLinkToFile - связанный С файлом FileName; ctFromData - внедренный по данным DataObject; CtLinkFromData -связанный сданными DataObject |
ShowAsIcon |
Если True, объект изображается пиктограммой |
IconMetaPict |
Дескриптор глобальной памяти, в которой распределен метафайл для пиктограммы. Если содержит 0 и showAslcon= True, используется стандартная пиктограмма Идентификатор класса сервера |
ClassID FileName |
Имя файла |
DataObject |
Данные для объекта |
Для компонента определены такие события:
property OnActivate: TNoti-fyEvent; |
Возникает сразу после активизации объекта |
property OnDeactivate: TNotifyEvent; |
Возникает сразу после перехода объекта в неактивное состояние |
type TObjectMoveEvent = procedure( OleContainer: TOleCon-tainer; const Bounds: TRect) of object; |
Возникает при перемещении или изменении размеров объекта. Параметр Bounds содержит границы объекта в координатах клиентской части контейнера |
property On.ObjectMoye: TObjectMoveEvent; property OnResize: TNotifyEvent; |
Возникает при изменении размеров окна контейнера |
18.5. КОМПОНЕНТЫ СТРАНИЦЫ DIALOGS
В состав Windows входит ряд типовых диалоговых окон, таких как окно выбора загружаемого файла, окно выбора шрифта, окно для настройки принтера и т. д. В Delphi реализованы классы, объекты которых дают программисту удобные способы создания и использования таких окон.
Работа со стандартными диалоговыми окнами осуществляется в три этапа.
Вначале на форму помещается соответствующий компонент и осуществляется настройка его свойств (следует заметить, что собственно компонент-диалог не виден в момент работы программы, видно лишь создаваемое им стандартное окно). Настройка свойств может проходить как на этапе конструирования, так и в ходе прогона программы. Как и для любых других компонентов, программист не должен заботиться о вызове конструктора и деструктора диалога - эти вызовы реализуются автоматически в момент старта и завершения программы.
На втором этапе осуществляется вызов стандартного для диалогов метода Execute, который создает и показывает на экране диалоговое окно. Вызов этого метода обычно располагается внутри обработчика какого-либо события. Например, обработчик выбора опции меню
Открыть файл может вызвать метод Execute Диалога TOpenDialog, обработчик нажатия инструментальной кнопки сохранить может вызвать такой же метод у компонента TSaveDialog и т. д. Только после обращения к Execute на экране появляется соответствующее диалоговое окно. Окно диалога является модальным окном, поэтому сразу после обращения к Execute дальнейшее выполнение программы приостанавливается до тех пор, пока пользователь не закроет окно. Поскольку Execute - логическая функция, она возвращает в программу True, если результат диалога с пользователем был успешным.
Проанализировав результат Execute, программа
может выполнить третий этап - использование
введенных с помощью
Проиллюстрируем сказанное следующим примером. Создадим простую программу для просмотра содержимого текстового файла. Для этого на пустую форму поместите компонент TOpenDialog, a также кнопку TButton и редактор TMето. При работе программы щелчок по кнопке будет сигналом о необходимости загрузить в редактор новый файл. Создайте такой обработчик события OnClick этой кнопки:
procedure TForml.ButtonlClick(Sender: TObject);
var
S: String;
F: TextFile;
begin
// Настраиваем диалог на отбор текстовых файлов:
OpenDialogI.Filter :== 'Текстовые файлы|*.txt|'+ 'Файлы Паскаля|*.pas';
// Выполняем диалог и анализируем
его результат if OpenDialogI.Execute and FileExists(OpenDialogI.
begin
// Результат успешный - пользователь выбрал файл
// Открываем файл
AssignFile(F, OpenDialogI.FileName) ;
Reset(F);
Memol.Lines.Clear; // Очищаем редактор
while not EOF(F) do // и наполняем его
begin
ReadLn(F, S) ;
Memol.Lines.Add(S)
end;
CloseFile(F)
end
end;
18.5.1. TOpenDialog и TSaveDialog - диалоги открытия и сохранения файлов
Эти компоненты имеют идентичные свойства и поэтому рассматриваются вместе. Пример окна TOpenDialog показан на рис. 18.38.
Свойство FileName: string содержит маршрут поиска и выбранный файл при успешном завершении диалога. Программа может использовать это свойство для доступа к файлу с целью читать из него данные (TOpenDialog) или записывать в него (TSaveDialog). Замечу, что пользователь может ввести произвольное имя и, следовательно, указать несуществующий файл. Для записи это не имеет значения, но при чтении отсутствие файла может привести к краху программы. Чтобы избежать этого, можно проверить существование файла глобальной функцией FileExists, как это сделано в предыдущем примере, или использовать механизм обработки исключительных ситуаций.
Рис. 18.38. Стандартное окно TOpenDialog
Свойство Filter: string используется для фильтрации (отбора) файлов, показываемых в диалоговом окне. Это свойство можно устанавливать с помощью специального редактора на этапе конструирования формы или программно, как это сделано в предыдущем примере. Для доступа к редактору достаточно щелкнуть по кнопке в строке Filter окна Инспектора объектов. При программном вводе фильтры задаются одной длинной строкой, в которой символы “|” служат для разделения фильтров друг от друга, а также для разделения описания фильтруемых файлов от соответствующей маски выбора. Например, оператор
OpenDialogI.Filter := 'Текстовые файлы|*.txt| Файлы Паскаля|*.раs';
задает две маски - для отбора файлов с расширениями раs и TXT.
Установить начальный каталог позволяет свойство InitialDir string. Например:
OpenDialogI.InitiaiDir := 'c:\program files\borland\delphi5\source';
С помощью свойства DefaultExt: String [ 3 ] формируется полное имя файла, если при ручном вводе пользователь не указал расширение. В этом случае к имени файла прибавляется разделительная точка и содержимое этого свойства.
В диалоговом окне для ручного ввода предусмотрен элемент TEdit, который при желании можно заменить на TCоmbовох. Для этого необходимо свойству FileEditStyle придать значение fsComboBox вместо умалчиваемого fsEdit. Если выбран комбинированный список, с ним можно связать протокол выбора имен. Для этого используется свойство HistoryList: TStrings, содержимое которого будет появляться в выпадающем списке. Этот список не пополняется автоматически, поэтому за его содержимым должна следить программа. Например:
if OpenDialogI.Execute then
begin
HistoryList.Add(OpenDialogI.
end;
Настройка диалога может варьироваться с помощью свойства
TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly, ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCre-atePrompt, ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCre-ate, ofNoNetworkButton, ofNoLongNames, ofOldStyleDialog, of-NoDereferenceLinks) ;
TOpenOptions = set of TOpenOption;
property Options: TOpenOptions;
Значения этого свойства имеют следующий смысл:
ofReadOnly |
Устанавливает переключатель Только для чтения |
ofOverwritePrompt |
Требует согласия пользователя при записи в существующий файл |
ofHideReadOnly |
Прячет переключатель Только для чтения |
OfNoChangeDir |
Запрещает смену каталога |
ofShowHelp |
Включает в окно кнопку Help |
ofNoValidate |
Запрещает автоматическую проверку правильности набираемых в имени файла символов |
OfAllowMultiSelect |
Разрешает множественный выбор файлов |
ofExtensionDifferent |
При завершении диалога наличие этого значения в свойстве options говорит о том, что пользователь ввел расширение, отличающееся от умалчиваемого |
ofPathMustExist |
Разрешает указывать файлы только из существующих каталогов |
ofFileMustExist |
Разрешает указывать только существующие файлы |
ofCreatePrompt |
Требует подтверждения для создания несуществующего файла |
ofShareAware |
Разрешает выбирать файлы, используемые другими параллельно выполняемыми программами |
OfNoReadOnlyReturn |
Запрещает выбор файлов, имеющих атрибут Только для чтения |
ofNoTestFileCreate |
Запрещает проверку доступности сетевого или локального диска |
OfNoNetworkButton |
Запрещает вставку кнопки для создания сетевого диска |
ofNoLongNames |
Запрещает использование длинных имен файлов |
ofOldStyleDialog |
Создает диалог в стиле Windows 3-х |