уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

В принципе тема создания своих элементов управления в меню Microsoft Office достаточно специфичная. Обычно задачи при работе с Office из Delphi сводятся к простым действиям, таким как: открыть документ, прочитать/записать данные, закрыть документ. При этом совсем не обязательно, чтобы в меню Office «светилась» кнопка Вашего приложения. Мне создание нового контрола на ленте Microsoft Excel 2007 потребовалось для решения следующей задачи.

Есть две стандартные формы документов, разработанные в Excel. В первую форму заносятся данные по годовым выбросам загрязняющих веществ предприятия. Второй документ — стандартная форма отчёта по затратам предприятия на природоохранные мероприятия — создается на основании первой формы и набора данных и БД по запланированным/выполненным природоохранным мероприятиям. Действия пользователя были следующими: открыть первую форму, записать данные, рассчитать плату за выбросы, открыть вторую форму, записать эти данные, добавить данные из БД (при этом вначале сделать выборку данных), сохранить формы и отправить по адресу или распечатать. В общем рутинная работа. Как можно было избавить и себя и других от подобной рутины? Я написал небольшое приложение, которое при первом запуске создавало свой контрол в меню Excel. При нажатии на кнопку в меню запускалось приложение, которое автоматически вытаскивало все данные из первой формы, рассчитывало издержки, добавляло эти данные во вторую форму и по запросу пользователя выписывало данные из БД. Т.е. по сути вся рутина осталась только на этапе формирования первой формы. При этом не надо было сохранять документ, указывать программе где он лежит и т.д. Все делается не выходя из Excel — нажал на кнопку — получил результат…Что-то я уже полез в специфику работы :) Перейдем лучше непосредственно к теме поста.
Итак, все элементы управления Microsoft Office располагаются на панелях (коллекция CommandBars), следовательно, чтобы создать какой-либо элемент управления нам необходимо:
1. Получить доступ к коллекции CommandBars;
2. Найти необходимую нам панель (CommandBar);
3. Добавить новый элемент управления (Control) на панель;
4. Указать необходимые свойства для элемента управления (параметры командной строки, иконку и т.д.)
Сейчас я не буду повторяться и расписывать все предварительные процедуры и функции как то: определить установлен ли Excel или как определить запущен ли Excel и т.д. всё это Вы можете найти в статье «Работа с Excel в Delphi. Основы основ.«, а начну сразу с первого пункта списка.

1. Получаем доступ к коллекции CommandBars

Для того, чтобы перечислить все элементы ControlBar из коллекции CotrolBars нам необходимо получить доступ к объекту Excel.Application как это делается описано в этой статье. Пусть ссылка на наш объект будет содержаться в переменной:

MyExcel:OLEVariant;

Перечислить все элементы коллекции CommandBars объекта Excel.Application можно, используя её свойства:
1. Count — количество элементов в коллекции;
2. Item — отдельный элемент коллекции (CommandBar)
Например, выпишем все имена панелей Excel в ListBox:

var  CommandBar:OLEVariant;
for i:=1 to MyExcel.CommandBars.Count do
   begin
    CommandBar:=MyExcel.CommandBars.item[i];
    ListBox1.Items.Add(CommandBar.Name);
   end;

После выполнения этого цикла у меня в списке ListBox оказалось 164 элемента и некоторые из элементов вообще не имели никакого названия. Но нам это пока не важно. Нам необходимо найти панель с именем Standard — именно на неё мы добавим новый контрол. Для поиска необходимой панели можно воспользоваться методом коллекции FindControl либо, использовать приведенный выше цикл для поиска панели по её имени. Для того, чтобы добавить новый элемент управления на CommandBar необходимо воспользоваться методом Add коллекции CommandBarControls, который имеет следующие параметры:
Type: integer — тип элемента. Может принимать значения: msoControlButton=1, msoControlEdit=2, msoControlDropdown=3, msoControlComboBox=4, или msoControlPopup=10;
Id: integer — идентификатор объекта;
Parameter: string — имя связанной с данным элементом команды;
Before: integer — позиция нового контрола на панели, если параметр не указан то новый элемент добавляется последним в коллекцию.
Temporary: boolean — указывает будет ли новый контрол удален после закрытия создавшего его приложения.
Попробуем добавить новый контрол на панель Microsoft Excel:

var RibbonBar: OLEVariant;//элемент CommandBar с именем Standard
NewControls:Variant;//новый элемент управления
begin
  NewControls:=RibbonControlBar.Controls.Add(Type:=1,id:=1);
  NewControls.Caption:='New Caption';//подпись кнопки
  NewControls.TooltipText:='c:\Windows\notepad.exe';//подсказка. одновременно может быть использована для запуска приложения
  NewControls.HyperlinkType:=1;//указывает на то, что по клику будет открыта ссылка
  NewControls.FaceId:=10;//идентификатор стандартного изображения кнопки  
  NewControls.Style:=3;//стиль кнопки
end;

После выполнения этого кода в ленте Excel появится новая вкладка «Надстройки» с кнопкой:

По нажатию на кнопке будем запущен Блокнот. Приведенный выше пример добавления новой кнопки на панель Excel — это один из нескольких способов. В связи с тем, что Microsoft Office 2007 обзавелся новым интерфейсом Ribbon появился как минимум ещё один способ работы с панелями и элементами управления, который является более предпочтительным в настоящее время. Однако мне хватило и приведенного выше ;).

Скачать исходник: Исходники —> Excel в Delphi

Книжная полка

Автор: Юрий Магда
Название:Разработка приложений Microsoft Office 2007 в Delphi
Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.
Купить на ЛитРес

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
8 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
cemick
cemick
20/04/2010 12:55

А вы не пробовали добавить кнопку на произвольный бар, мне к сожалению не удалось установить обработчик: http://www.delphimaster.ru/cgi-bin/forum.pl?id=1190216320&n=8
пост от cemick (11.08.09 19:05) [11]

Deha
Deha
14/05/2010 14:35

Если не сложно выложите рабочий пример, что то у меня не получается(((( Или скинте на deha[a].nm.ru

Deha
Deha
15/05/2010 14:29

Не могу понять откуда нужно брать RibbonControlBar!

Deha
Deha
15/05/2010 16:03

У меня 2007 офис, спасибо за исходник (понял в чем была моя ошибка))) ). Остался только один вопрос как поместить туда Edit и по нажатию Enter производить обработку данных, с последующим добавлением еэтих данных а активную ячейку?

trackback
Полная автоматизация. Редактируем объекты Excel, содержащиеся в документах Word. | Delphi в Internet
24/11/2012 18:59

[…] Следующая статья на тему работы с Excel в Delphi — "Создаем свои контролы на ленте Microsoft Office." Похожие […]