Основы офисного программирования и документы Word


Диалоги с пользователем. Коллекция Dialogs


Коллекция объектов Dialogs задает совокупность диалоговых окон, встроенных в Word. Добавлять новые или удалять элементы этой коллекции программным путем нельзя. Но соответствующие окна можно открыть и показать на экране дисплея и тем самым организовать диалог с пользователем по теме, заданной соответствующим окном. Коллекция Dialogs и объекты Dialog не принадлежат к общим объектам Office 2000. Вместе с тем в каждом из приложений Office 2000 есть свои объекты Dialogs и Dialog. В совокупности они составляют семейство схожих объектов, имея много общего в своем поведении и некоторую специфику, зависящую от приложения. Есть смысл хотя бы в одном приложении подробно разобраться с этими объектами, тогда в других приложениях можно будет ссылаться на знакомое поведение этих объектов.

Коллекция Dialogs устроена совсем просто. У нее стандартный для коллекций набор свойств - Count, Application, Creator, Parent и всего лишь один метод Item . Простота устройства коллекции понятна, поскольку ни добавить, ни убавить ничего нельзя, - все элементы встроены. Но, учтите, элементов у этой коллекции, то есть встроенных диалоговых окон достаточно много - более 200. К каждому из элементов коллекции можно добраться, зная его тип, задаваемый соответствующей константой, входящей в перечисление wdWordDialog.

Объект Dialog устроен более сложно. У него есть шесть свойств - Application, Creator, Parent, CommandName, Type, DefaultTab и четыре метода - Display, Execute, Show и Update. На четырех первых свойствах особо останавливаться не буду, - первые три стандартны, а четвертое, возвращающее имя процедуры, отображающей диалоговое окно, применяется разве что из любопытства. Свойство Type, имеющее статус "только для чтения", возвращает тип окна, - соответствующую константу из перечисления wdWordDialog. Более важным является свойство DefaultTab. Дело в том, что многие из открываемых окон устроены сложно и имеют различные вкладки. Если, используя это свойство, перед открытием окна установить нужную вкладку, то перед пользователем окно откроется на этой вкладке, что облегчит нелегкую жизнь пользователя. Каждая из возможных вкладок задается соответствующей константой, принадлежащей перечислению wdWordDialogTab.

Поговорим теперь о четырех методах объекта Dialog:

  • Show- открывает диалоговое окно, заданное объектом Dialog, после чего прерывает свою работу, давая возможность пользователю задать нужные установки в диалоговом окне и выполнить некоторые действия, для чего ему достаточно нажать ту или иную кнопку в диалоговом окне. Действия, предписанные пользователем, выполняются, и метод Show заканчивает свою работу, возвращая в качестве результата номер кнопки, нажатой пользователем. Значение - 2 соответствует кнопке Close, -1 - OK, 0 - Cancel, N>0 - командной кнопке с номером N. Вместо стандартных кнопок OK, Close, Cancel могут применяться эквивалентные по сути кнопки с другими названиями, например, "Открыть" вместо кнопки OK.
  • Update - обновляет установки, принятые по умолчанию для диалогового окна. Чаще всего вызывается в самом начале работы с диалоговым окном, перед тем как задаются новые значения установок.
  • Display - альтернатива методу Show. Также как и метод Show, открывает диалоговое окно и позволяет пользователю задать нужные установки и нажать кнопку. Однако не выполняет действия, предписанные пользователем, возвращая, по-прежнему, в качестве результата номер нажатой кнопки. После чего программа может проанализировать действия пользователя и принять окончательное решение, например, принять установки, вызвав метод Execute.
  • Execute - применяет текущие установки диалогового окна.


Шесть свойств и 4 метода объекта Dialog - это лишь видимая часть айсберга, каковым является объект Dialog. Нужно понимать, что каждое диалоговое окно, то есть конкретный объект Dialog имеет множество дополнительных параметров (свойств), определяющих специфику этого объекта. Основные сложности работы с этим объектом связаны с пониманием сути параметров и установкой корректных их значений. Реально здесь могут возникать различные проблемы, о которых поговорим чуть позже при рассмотрении одного из примеров. Хочу еще несколько слов сказать об использовании этих объектов. Работа с ними предполагает, что в какой-то момент программа начинает диалог с пользователем на стандартную тему, для которой в системе Office 2000 заготовлено соответствующее окно. Часто, разумно при первом открытии окна дать возможность пользователю сделать свой выбор и установить подходящие значения параметров окна. Затем установки пользователя могут быть сохранены в объекте Dialog. При повторном открытии окна используется этот объект, и окно открывается с установками, повторяющими предыдущий выбор пользователя. К сожалению, сохранение всех установок не всегда возможно.

Давайте перейдем теперь к примерам и начнем с простой и классической задачи - открытия файла. Вот пример работы с одним из наиболее употребительных диалоговых окон - окном открытия файла:

Public Sub WindowOpenFile() 'Предоставление пользователю возможности открыть любой файл. 'Открывается каталог, хранящий активный документ, с показом всех файлов. Dim Act As Long With Dialogs (wdDialogFileOpen) .Name = ActiveDocument.Path & "\*.*" Act = . Show Debug.Print Act If Act = -1 Then 'Файл успешно открыт и можно получить путь к нему и его имя Debug.Print Documents(1).Path & "\" & Documents(1).Name End If End With

End Sub

Листинг 1.11.

(html, txt)

Заметьте, открывающееся перед пользователем стандартное окно открытия файла предварительно настроено, так что пользователь сможет увидеть все файлы каталога, хранящего активный документ. Для этой настройки использовалось свойство (параметр) Name, которым обладает данный конкретный объект FileOpen коллекции Dialogs . Замечу, что у этого объекта более 10 различных параметров, с их помощью можно задавать пароли, статус открытия и другие свойства, связанные с открытием файла. В справочной системе в разделе "Built-in Dialog box argument lists" для каждого диалогового окна указан список его возможных параметров. К сожалению, нельзя найти ни описания сути этих параметров, ни их возможных значений. Обо всем приходится догадываться, зная имя параметра и анализируя работу руками в диалоговом окне. Заметьте, контекстные справки к элементам интерфейса диалоговых окон также не всегда существуют.

Вернемся к примеру. Он демонстрирует, как по окончании работы пользователя можно проанализировать результаты его работы и в случае успешного открытия файла получить путь к нему и его имя. Мы еще будем говорить об этом в дальнейшем, но уже сейчас стоит обратить внимание, что открытие нового файла означает добавление нового элемента в начало коллекции Documents, и я использую этот факт при получении пути и имени нового файла.

Давайте рассмотрим еще один, более сложный пример, в котором возникают некоторые проблемы. Рассказывая об общих объектах, я рассмотрел объект Filesearch, используемый для поиска файлов. Теперь рассмотрим, решение этой задачи с использованием соответствующего объекта Dialog. Я напомню, что для поиска файлов в Office 2000 следует открывать не специальное окно поиска файлов, а обычное окно открытия файлов, - то есть выполнить команду "Open". Из этого окна по нажатию кнопки "Сервис" можно перейти в окно поиска и там уже можно сформировать достаточно сложное логическое выражение, задающее условие поиска. Условия поиска могут включать размер файла, дату его создания и внесения изменений, полное или частично заданное имя файла и множество других критериев, включая, в том числе, и полно текстовый поиск. Программная работа с объектом Filesearch позволяет выполнить аналогичные операции. При работе с объектом Dialog большая часть работы возлагается на пользователя, который должен сформировать критерии поиска в момент открытия окна. Программно можно предварительно сформировать лишь некоторые критерии поиска.

У диалогового объекта Dialog FileFind большое число разнообразных параметров. Не поленюсь и приведу список всех параметров этого объекта, разделив их на две группы. В первую группу входят параметры:SearchPath,Name,SubDir,Title, Author, KeyWords, Subject, MatchCase, Text, PatternMatch, DateSavedFrom, DateSavedTo, SavedBy, DateCreatedFrom, DateCreatedTo. К этой группе я отнес параметры, смысл и значения которых мне понятны, - они служат для формирования соответствующих критериев поиска. Заметьте, что среди них нет многих параметров, доступных при формировании критериев поиска вручную, например, нельзя задать ограничение на размер отыскиваемого файла. Во вторую группу я отнес параметры, смысл или множество возможных значений которых мне не совсем понятны. Вот эти параметры: SearchName, Options, View, SortBy, ListBy, SelectedFile, Add, Delete, ShowFolders, MatchByte.

От сетований давайте перейдем к примеру работы с этим диалоговым окном:



Листинг 1.12.

(html, txt)

Обратите внимание, перед тем как открыть диалоговое окно методом Show, я программно формирую ряд критериев поиска:

  • Свойство SearchName позволяет указать (я так предполагаю), что поиск ведется среди документов Word.
  • СвойствоName говорит о том, что ищется файл, в имени которого есть сочетание "Ch6".
  • СвойствоSearchPath задает каталог поиска.
  • СвойстваSubDir и MatchCase включают флажки, указывающие, что поиск должен вестись в глубину с просмотром подкаталогов, а при полно текстовом поиске следует проверять словоформы.
  • Свойство DateCreatedFrom указывает, что разыскиваются файлы, созданные не ранее 20 мая 2000 года.
  • Свойство Author задает автора документов.
  • Свойство Text задает слово, чьи словоформы будут искаться в файлах.


Выполнение метода Execute непосредственно перед открытием окна позволяет передать в окно эти установки и когда окно будет открыто, то в нем будут отображаться результаты поиска, не требуя никаких действий от пользователя. Вот как выглядит диалоговое окно в момент его открытия методом Show:


увеличить изображение
Рис. 1.5.  Диалоговое окно поиска файлов в момент открытия

Как видите, пользователю, в данном случае мне самому, не пришлось предпринимать никаких усилий, чтобы получить список найденных файлов. Заметьте, критерии поиска сформированы на основании программных установок. Их можно увидеть, для чего достаточно нажать кнопку "Сервис" и перейти в окно формирования критериев поиска:


Рис. 1.6.  Окно формирования критериев поиска

Правда, не все параметры, заданные в программе, были успешно переданы в окно. Это касается первых двух параметров - SearchName и Name. Что касается первого из них, то при открытии диалогового окна поиск возможен только среди всех типов файлов, и эту установку нельзя изменить даже вручную. То, что не передается имя файла в окно, связано, скорее всего, с очередной недоработкой. Замечу, что в обратную сторону передать имя файла, установленное пользователем, объекту Dialog возможно.

Конечно же, пользователь может остаться неудовлетворенным полученными результатами и иметь желание скорректировать критерии поиска. Я, например, так и сделал. Мои корректировки можно увидеть на следующем рисунке:


Рис. 1.7.  Корректировка критериев поиска

Усложнив условие поиска, я сократил список найденных файлов, удовлетворяющих условию поиска до трех файлов:


увеличить изображение
Рис. 1.8.  Новые результаты поиска файлов

Отмечу сразу еще одну досадную недоработку, связанную с этим диалоговым окном. Если пользователь выберет из представленного списка один из файлов и захочет его открыть, нажав имеющуюся тут же кнопку "Открыть", то файл не откроется, хотя и выполняется метод Show, обязанный исполнять действия пользователя. Квалифицированный пользователь, правда, сможет справиться с этой трудностью, если щелкнет правой кнопкой по выбранному им файлу и выберет из появившегося контекстного меню пункт "Быстрый просмотр", но не "Открыть файл".

Но давайте продолжим рассмотрение нашей программы. После того как пользователь, так или иначе, завершит работу в диалоговом окне, завершит свою работу и метод Show, и программа продолжит свое нормальное выполнение. Рассмотрим, что происходит, когда создается объект HisDialog класса Dialog. Будут ли ему переданы установки, заданные пользователем во время последнего сеанса работы? Ответ половинчатый, - часть параметров передается объекту HisDialog, часть нет. Вот результаты моих экспериментов в окне отладки после формирования объекта HisDialog:



Type - 99 Вызываемая процедура - FileFind -1 ?HisDialog.SearchName

?HisDialog.Name Ch ?HisDialog.SearchPath E:\O2000\DS2000 ?HisDialog.SubDir 1 ?HisDialog.MatchCase 1 ?HisDialog. DateCreatedFrom

?HisDialog.Author

?HisDialog.Text Execute

Листинг 1.13.

(html, txt)

Как видите, дата, автор и, очевидно, свойства, подобные им, не передаются созданному объекту. Вместе с тем ряд важных свойств сохраняются. Так что для данного диалогового окна лишь частично можно сохранить выбор установок, сделанных пользователем в ходе работы с диалоговым окном.

На этом я закончу описание работы с диалоговыми окнами в приложении Word. В заключение еще раз скажу, что это важный класс объектов, с которыми часто приходится сталкиваться разработчику решений на базе Office 2000. Нужно быть готовым к преодолению трудностей, возникающих при работе с ними.

Содержание раздела