Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3491 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 3:

Документы и проекты

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >

Система документов и ее проект

До сих пор мы говорили о проекте одного документа. Давайте немного расширим рамки и поговорим о совокупности или системе документов, о том, как связаны между собой проекты такой системы.

Оставим пока в стороне создание и использование AddIns, Com AddIns, DLL, ActiveX, Internet документов. Им будет посвящен особый разговор. Пока поговорим о более понятных случаях использования совокупности документов. Прежде всего, заметим, что корневой объект Application любого из приложения Office 2000 содержит коллекцию документов. Так что изначально предполагается возможность открытия в одном приложении нескольких документов и совместной работы с ними. Но совместная работа не ограничивается однотипными документами, принадлежащими одному приложению. Уже в "Начнем с объектов Office 2000" мы подробно, с примерами рассмотрели возможность создания и одновременной работы с несколькими объектами Application. Следовательно, всегда есть возможность открытия совокупности документов разного типа и совместной работы с ними, предоставляя пользователю возможность переключаться по ходу дела от одного документа к другому.

Совместная работа с несколькими документами, возможно, разного типа типична для Office 2000. Программным проектом системы документов будем называть совокупность программных проектов всех документов, входящих в систему.

Остается ответить на главный вопрос, - могут ли взаимодействовать между собой проекты отдельных документов. Можно ли из одного проекта вызывать процедуры стандартного модуля другого проекта, можно ли пользоваться объектами класса другого проекта? Можно ли иметь глобальные переменные уровня системы документов для передачи информации от одного документа к другому? На все эти вопросы существует один ответ, - Да! С программным проектом системы документов в Office 2000 достаточно просто работать, достаточно просто организовать нужные связи между программными проектами отдельных документов, нужно только уметь это делать.

Организация системы документов

Наше определение системы документов достаточно общее, - совокупность открытых документов составляет систему. О связях между документами ничего не говорится. Пользователь сам может решать, с каким документом он будет работать в следующий момент, и волен свободно переходить от одного документа к другому. Но документы в системе могут быть связаны. Рассмотрим связи двух видов:

  • Связи документов "по вызову".
  • Связи проектов документов "по ссылке"

Два документа A и B связаны по вызову, если в одном из документов, например A, вызывается документ B. Документ A называют родителем, а документ B, соответственно, потомком. Совокупность связанных по вызову документов образует дерево связанных документов. Корень дерева - это тот первичный документ, из которого и начинаются вызовы других документов. Связи в дереве направлены от корня к потомкам.

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

Проекты A и B связаны по ссылке, если один из проектов, например B, ссылается на проект A. Проект A называют родителем, а проект B, соответственно, потомком. Совокупность связанных по ссылке проектов образует дерево связанных проектов. Корень дерева - это тот первичный проект, на который ссылаются остальные проекты. Связи в дереве ссылок направлены от потомков к корню. Вообще говоря, проекты, связанные по ссылке, также могли бы организовывать более сложную структуру, чем дерево. Действительно, взаимные ссылки кажутся допустимыми. Но это не так. Помните, циклические ссылки проектов VBA документов не разрешены. Так что при разработке проекта системы документов Office 2000 исходите из древесной структуры организации связей между проектами. На рисунке 2.5 показаны три возможные структуры организации системы документов Office 2000.

Три структуры организации системы документов

Рис. 2.5. Три структуры организации системы документов
Как организуются ссылки между проектами

Рассмотрим теперь технический вопрос, как организовать ссылку из проекта B на проект A. Для этого нужно сделать две вещи, во-первых, дать собственные имена проектам, во-вторых, - включить ссылку в проекте B на проект A. Имя нужно дать, по крайней мере, родительскому проекту A. О том, как это делается, мы уже рассказали в разделе "Свойства проекта" этой лекции. На рис. 2.2 показано соответствующее диалоговое окно.

Задание ссылки выполняется также стандартным образом. В окне Редактора Visual Basic нужно выбрать соответствующий проект, в нашем примере проект B, и из меню Tools выбрать команду References. Если документ, содержащий проект A открыт, то в окне ссылок наряду с другими возможными для ссылок компонентами появится флажок с именем проекта A, останется только его включить.

Обмен информацией между документами

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

  • Выделим один из проектов, который будем называть основным, и в стандартном модуле этого проекта зададим множество Public переменных, в совокупности и определяющих общую для всей системы информацию. Систему документов спроектируем так, чтобы их проекты были связаны по ссылке, и корнем дерева был основной документ, хранящий глобальную информацию. В этом случае каждый проект будет иметь доступ к этой информации. Напомним, циклические ссылки между проектами не разрешены, отсюда следует, что нельзя часть информации поместить в проект А, часть в проект В и сделать эту информацию общедоступной для обоих проектов. Возможна только древесная организация хранения общей информации. Самая общая информация хранится в корневом проекте, в "дочерних" проектах хранится информация необходимая потомкам этих дочерей, и так до терминальных проектов.
  • Второй способ состоит в том, что общая для всех проектов информация размещается в виде списков Excel, в ячейках выделенной рабочей книги, играющей роль основного документа. Этот способ основан на том, что не только VBA обеспечивает взаимодействие проектов, возможно взаимодействие самих документов, ссылки между ними. Известно, что ссылки на ячейки книги Excel допустимы и широко распространены. Так что страницы Excel часто используются как удобное средство для передачи информации между документами. Чуть ниже на примере мы продемонстрируем этот способ передачи информации. Достоинство этого способа состоит и в том, что проекты могут и не быть связанными ссылками, более того, возможен взаимный обмен информацией.
  • Классическим способом хранения общей информации, особенно, в больших объемах, являются базы данных. Поэтому базу данных Access также можно использовать для организации информационного пула системы проектов.
  • Для полноты картины упомянем обычный текстовый файл.

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

Перейдем теперь к примерам организации взаимодействия системы документов. Один из примеров на эту тему мы уже приводили в предыдущей лекции. Возможно, стоит еще раз обратиться к нему и разобрать, как из документа Word происходит переключение на работу с рабочей книгой Excel и базой данных Access. Приведем еще один пример, где показано, как пользователь делает выбор между тремя документами - рабочими книгами Excel. Этот пример также демонстрирует возможность доступа из проекта, связанного с одной рабочей книгой, к информации, записанной в ячейках другой рабочей книги. Взгляните на то, как выглядит исходный документ при его открытии.

Открытие рабочей книги, содержащей ссылки

Рис. 2.6. Открытие рабочей книги, содержащей ссылки

Поскольку в данной рабочей книге есть ссылки на другие рабочие книги, то при открытии документа появляется сообщение о том, что, возможно, следует обновить документ, поскольку после его закрытия могли измениться документы, на которые он ссылается. На листе рабочей книги нашего примера расположена командная кнопка с надписью " ChooseBook ". Эту кнопку пользователь должен нажать в тот момент, когда он стоит на распутье, и должен выбрать, с какой следующей книгой он хочет работать. Вот текст обработчика события " Click ":

Private Sub CommandButton5_Click()
    ChooseBook
End Sub

Public Sub ChooseBook()
 'Выбор книги, с которой будет работать пользователь
 Const PathDir As String = "e:\O2000\CD2000\Ch2\"
   Dim Answer As Variant
    Dim CurrentBook As String
    Dim Book As Workbook
    Dim Found As Boolean
    
    Answer = InputBox(prompt:= _
	"Выберите книгу, с которой будете работать (1/2/3)", Default:=1)
    Select Case Answer
        Case 1
            CurrentBook = "BookOne.xls"
        Case 2
            CurrentBook = "BookTwo.xls"
        Case 3
            CurrentBook = "BookThree.xls"
        Case Else
            CurrentBook = "I don't know such book"
    End Select
    MsgBox ("Your choose is " & CurrentBook)
    'Проверяем есть ли уже книга в коллекции
    Found = False
    For Each Book In Workbooks
        If Book.Name = CurrentBook Then
            Found = True
            Exit For
        End If
    Next Book
    If Found Then
    'Активизируем выбранную книгу
        Workbooks(CurrentBook).Activate
        ElseIf CurrentBook = "I don't know such book" Then
            MsgBox ("I don't know such book")
        Else   'Добавляем книгу в коллекцию
            Workbooks.Open PathDir & CurrentBook
            Workbooks(CurrentBook).Activate
    End If
End Sub
2.3.

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

Public Sub PrintGlobal()
    Dim MyrOne As Range, MyrTwo As Range, MyrThree As Range
    
    Debug.Print ("Работает процедура PrintOne")
    Debug.Print ("Печать глобальных переменных")
    Debug.Print (One & "-" & Two & "-" & Three)

    Debug.Print ("Допустимы ссылки на ячейки различных рабочих книг!")
    Set MyrOne = Range("[BookOne.xls]Sheet1!D1")
    Debug.Print MyrOne
    Set MyrTwo = Range("[BookTwo.xls]Sheet1!D1")
    Debug.Print MyrTwo
    Set MyrThree = Range("[BookThree.xls]Sheet1!D1")
    Debug.Print MyrThree
    MsgBox ("Everything is OK! Look at Immediate Window")
End Sub

Вот результаты отладочной печати в конце работы этой процедуры:

Работает процедура PrintOne
Печать глобальных переменных
My value is One -My value is One -My value is One 
Допустимы ссылки на ячейки различных рабочих книг!
BookOne
BookTwo
BookThree

Всем глобальным переменным предварительно было присвоено одно и то же значение. Книги BookOne, BookTwo, BookThree.xls на первой странице в ячейке D1 хранят свои названия, их и печатает наша процедура, вызываемая в проекте одной из этих книг.

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >
полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.