(Продолжение, начало см. МК № 1—2, 5 (172—173, 176))

Разработка панели инструментов шаблона

Исходя из потребностей пользователя, разобьем процесс разработки Шаблона на три этапа, из которых последний будет наиболее трудоемким и сложным:

  1. Определение задач, решение которых должен автоматизировать Шаблон. Создание бланка Шаблона. Планирование внешнего вида панели(ей) инструментов, функций кнопок, полей и списков ввода-вывода.

  2. Написание кода создания панели инструментов.

  3. Разработка необходимых процедур для объектов разрабатываемой Рис. 1панели.

Определимся, что Шаблон будет находиться в папке со всеми Шаблонами MS Office, а панель будет иметь такой внешний вид (рис. 1).

В верхнем ряду командные кнопки:

Обновление данных — для загрузки и обновления в раскрывающемся списке данных из базы;

Очистка — очистка полей ввода-вывода данных;

Запись в базу данных нового предприятия;

Открытие программы «Блокнот» — для редактирования текстовой базы данных;

Вставка — вставка данных из буфера обмена в документ;

Запуск программы «Буфер обмена» — для просмотра содержимого буфера обмена;

Вызов справки.

Второй и третий ряды содержат данные о предприятии.

Четвертую строку занимает раскрывающийся список

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

В Word’е существует возможность создания встроенных меню и кнопок вручную: «Сервис»/«Настройка»/Закладка «Команды» — в окне «Категории» выбрать «Макросы», кнопку выбранного макроса перетащить на панель инструментов или в меню, затем можно изменить рисунок выделенного объекта (рис. 2).

Но в данном случае от этой затеи придется отказаться — по причине того, что в Word’е не предусмотрена возможность создания вручную полей ввода и раскрывающихся списков. Панель со всеми ее объектами придется создавать программно, подбирая каждой кнопке свою иконку. Форма для генерирования иконок была мной предложена в МК № 7-9 (126—128).Рис. 2

Для создания панели, первоначально на уровне общей области модуля (так как к объектам во время работы с панелью обращение будет осуществляться и из других процедур), объявим объектные переменные для создания раскрывающихся списков и полей ввода-вывода реквизитов. Обращаться в программе к объектам панели инструментов можно по имени объекта (если оно задавалось), по индексу (порядковому номеру в панели), или используя значение свойства Caption; правила обращения в программе уточняются разработчиком во время тестирования. Наиболее устойчивым является обращение по индексу.

Option Explicit Dim MyControl As CommandBarComboBox ' Раскрывающийся список со всеми реквизитами Dim MyControl_Org As CommandBarControl 'Название организации Dim MyControl_Cod As CommandBarControl 'Код Организации Dim MyControl_Bank As CommandBarControl 'Банк Dim MyControl_MFO As CommandBarControl 'Код Банка Dim MyControl_Account As CommandBarControl 'Банковский счет Dim MyControl_ForWhat As CommandBarControl 'Назначение платежа Dim MyControl_Cop As CommandBarComboBox 'Дополнительный раскрывающийся список Public Sub ActivPanel() On Error GoTo Met1 'Удаление панели Organizations, если такая панель уже существует Application.CommandBars("Organizations").Delete Met1: 'Создание новой панели "Organizations" With Application.CommandBars.Add("Organizations", Position:=msoBarFloating, MenuBar:=msoBarTypeNormal, temporary:=True) With .Controls With .Add(msoControlButton) .Caption = "Обновить данные" .FaceId = 459 .OnAction = "New_DB" .Style = msoButtonIconAndCaption End With 'Код создания остальных кнопок аналогичен кнопке "Помощь", в листинг не включен With .Add(msoControlButton) .Caption = "Помощь" .FaceId = 49 .OnAction = "MyHelp" .Enabled = True .BeginGroup = True End With End With End With 'Создание объекта msoControlEdit (поле ввода-вывода). Все сходные объекты создаются аналогичным способом Set MyControl_Org = Application.CommandBars("Organizations").Controls.Add(Type:=msoControlEdit, temporary:=True) With MyControl_Org .OnAction = "Copy_Text" .Width = 180 .BeginGroup = True .Visible = True .Caption = "Название организации" .Enabled = True End With 'Добавление раскрывающегося списка Set MyControl = Application.CommandBars("Organizations").Controls.Add(Type:=msoControlComboBox, temporary:=True) With MyControl .OnAction = "Copy_Text" .Width = 930 .DropDownWidth = 1000 .DropDownLines = 300 .Visible = True .BeginGroup = True .Style = msoComboNormal .Caption = "Все реквизиты" End With 'Установка параметров панели: высота, ширина, положение, видимость, защита With Application.CommandBars("Organizations") .Height = 118 .Width = 616 .Left = 100 .Top = 100 .Visible = True .Protection = msoBarNoCustomize + msoBarNoChangeDock + msoBarNoResize + msoBarNoChangeVisible End With End Sub

О защите создаваемой панели следует рассказать подробнее (см. табл.). Чтобы разобраться в том, Таблица.как использовать константы, достаточно просто немного поэкспериментировать. Раскрывающийся список является одноколоночным объектом, но многоколоночность можно сымитировать, помещая между порциями данных определенный символ. Для этих целей подойдет символ табуляции. Использование других символов нецелесообразно в связи с тем, что они могут встречаться непосредственно в загружаемых данных. Поэтому процедура обновления (загрузки данных) в раскрывающийся список будет иметь следующий вид:

Sub New_DB() Dim sBuf1 As String, sBuf2 As String, sBuf3 As String, sBuf4 As String, sBuf5 As String, sBuf6 As String, sBuf7 As String Dim n As Long 'Счетчик для внесения в раскрывающийся список порядкового номера записи Dim FileNo As Integer 'Переменная для элементов раскрывающегося списка, ограничиваем размером в 254 символа Dim StringToBar As String * 254 'Создаем новый экземпляр панели, удаляя старую панель Call ActivPanel FileNo = FreeFile Open "C:\Мои документы\Const.txt" For Input As #FileNo n = 0 While Not EOF(FileNo) n = n + 1 Line Input #FileNo, sBuf1 Line Input #FileNo, sBuf2 Line Input #FileNo, sBuf3 Line Input #FileNo, sBuf4 Line Input #FileNo, sBuf5 Line Input #FileNo, sBuf6 Line Input #FileNo, sBuf7 'Замена на пробелы всех табуляций, которые могли быть ошибочно введены пользователем при заполнении базы через текстовый редактор. Текст процедуры Exchange рассматривался ранее. Call Exchange(sBuf2) Call Exchange(sBuf3) Call Exchange(sBuf4) Call Exchange(sBuf5) Call Exchange(sBuf6) Call Exchange(sBuf7) 'Заполняем список данными из текстового файла пока n не достигнет критического числа 32767 StringToBar = n & vbTab & sBuf2 & vbTab & sBuf3 & vbTab & sBuf4 & vbTab & sBuf5 & vbTab & sBuf6 & vbTab & sBuf7 If n <= 32767 Then MyControl.AddItem StringToBar & vbTab 'Как только n станет равным 32768, создается копия данного объекта (метод Copy), которая очищается от предыдущих данных (метод Clear) ElseIf n = 32768 Then Set MyControl_Cop = MyControl.Copy With MyControl_Cop .Clear .Caption = "Часть 2 всех реквизитов организаций" End With MyControl_Cop.AddItem StringToBar & vbTab 'Заполнение второго списка осуществляется по 65534 элемент ElseIf n > 32768 And n < 65535 Then MyControl_Cop.AddItem StringToBar & vbTab 'В случае превышения положенного количества записей базы (65534) осуществляется закрытие текстового файла базы данных Else: MsgBox "Размер данной базы ограничен 65534 записями", vbExclamation, "Продолжение заполнения данной панели новыми данными невозможно..." GoTo Met1 End If Wend Met1: Close #FileNo End Sub

(Продолжение следует)