Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
GUI в XLL, Рассмотрим возможные варианты
 
Наконец добрался до возможности взаимодействия xll с пользователем посредством графического интерфейса.
И здесь, к сожалению вариантов мало и все они мало где освещены.
Информацию по биту доставал.
C VBA все отлично, там элементарно делается Ribbon на XML и вперед.
в xll на С++ так не сделать.
Рассматривал такие варианты:
1. Программное создание меню через Excel C++ API (добавляются команды на вкладку "ADD-IN")
2. Создание на чистом С++ COМ-интерфейса и использование СОМ-модели Excel для создания панели (программно). Похож на первый вариант, но можно добавлять иконки.
3. Создание Ribbon XML через управляемый код и интегрировать это все в xll (собственно это и есть Ribbon как в VBA, но прослойка из управляемого кода еще тот торт)

Начал с первого варианта.
Версия v1.0.3.3beta
Какое окошко вам больше нравится?
WIN API, с диалогом перехода на сайт
Или Excel API, со справкой (перехода на сайт)
Также будет транспонирование массива на месте, пока только вывод тестовых данных сделал.

Если есть инфо по теме, буду рад изучить.

Что использовал:
Раз
Два
Три
Изменено: bedvit - 19 ноя 2020 19:14:54
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Какое окошко вам больше нравится?
дело вкуса - по мне Win  поинтереснее смотрится, правильно я понимаю, что пользовательские формы недоступны в этих вариантах?
Каждому For свой Next
 
Цитата
bedvit написал:
Какое окошко вам больше нравится?
а какое из окошек с наследованием интерфейса? Чтобы в 10 Windows, например, заимствовались окошки в стиле Flat. Это на мой взгляд и будет лучший вариант - чтобы все было более-менее в общем стиле.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
buchlotnik, стандартными Excel C API - нет (я не нашел), если не говорить о "InputBox"
Используя 2й вариант (через СОМ-интерфейс) можно попробовать сделать, у меня получается создать форму, далее не могу достучатся до тех свойств, которые в VBA нормально отрабатывают.
Нужна полная объектная модель Excel. В обозревателе объектов не все уровни отражаются. Кто-то может поделится инфой?
Уже скачал OLE/COM Object Viewer, но толку пока мало.
Дмитрий(The_Prist) Щербаков, похоже оба, т.к. в win api, для MessageBox я в дескрипторе окна владельца создаваемого окна указываю дескриптор главного окна Excel. Сейчас протестировал, поменял оформление в WIN7 на aero-интерфейс, окошко тоже в этом стиле. Если протестируете на win10 буду благодарен.
Оставил win-версию. Больше возможностей в настройках.
Изменено: bedvit - 20 ноя 2020 17:28:56
«Бритва Оккама» или «Принцип Калашникова»?
 
Добавил значки в меню
У всех работает меню (начиная с версии Excel 2010)?
У меня работает справка, транспонирование пока просто вставка данных на лист, форма создается, но пока не выводится (можно посмотреть в VBA-проекте активной книги)
Надстройка по той же ссылке.
«Бритва Оккама» или «Принцип Калашникова»?
 
Много "bedvit-ов", привел в соответствие с общей стратегией (с названиями категорий для функций XLL). Поменьше саморекламы :)
Мне кажется, так лучше
«Бритва Оккама» или «Принцип Калашникова»?
 
проверено в 365 - лента, функции -полёт нормальный
Каждому For свой Next
 
Цитата
bedvit: Поменьше саморекламы
я не был согласен с горе-комментаторами тогда, не согласен с тобой и сейчас. bedvit — коротко, лаконично и однозначно определяет ГРУППУ инструментов. Это как минимум просто удобно. Верни  :)
Изменено: Jack Famous - 25 ноя 2020 12:40:16
Реквизиты для благодарности и контакты для связи — в профиле
 
buchlotnik, спасибо за тест, Jack Famous, Алексей, четко разложил :)
Добавил транспонирование, по второму способу взаимодействия пользователя/dll/Excel, т.е. через СОМ-интерфейс Excel (есть вариант через Excel C API, но пока или не оптимизирован или я не пойму почему он даже медленнее второго варианта.)
Что могу сказать по второму варианту, штатную не обгоняю, т.е. СОМ - медленный, и сама операция транспонирования миллисекунды, а вывод через СОМ на порядки больше.
Зато могу транспонировать на месте, штатная так не позволяет (если стороны диапазона разного размера).
Залил туда же.
«Бритва Оккама» или «Принцип Калашникова»?
 
Итак продолжу по теме.
Глава: ФОРМЫ в XLL(Excel)
Скрытый текст

Немного обобщая пройденное:
Итак в первом топике я указал 3 варианта взаимодействия xll  с пользователем.
Excel C++ API - отлично работает для UDF/самописных функций, работающих со скоростью родных функций Excel (см. пример: функции в категорий XLL)
С++ +  использование СОМ-модели Excel подходит для создание меню (со значками), работы с с книгой/листом/ячейками/форматированием/данными (см. пример: команды на вкладку "ADD-IN", транспонирования массива-команда "XLL Transpose")
С++ + управляемый код +  использование СОМ-модели Excel. Вот здесь и подходим к теме текущей главы. Формы, прекрасно создаются вторым способом. НО что бы ими пользоваться, нужен управляемый код - VBA.
Вчера этот способ реализовал. И уже хотел поделится.
Было сделано красиво: создал формы, код на VBA в нужных модулях (все кодом С++), с запуском нужных команд из XLL.
НО, было обнаружено, что если отключена галка "Доверять доступ к объектной модели проектов VBA" - код не работает.
По первой, хотел с этой проблемой справится через реестр или другими методами, потом понял, что некрасиво это как-то выходит.
А хочется красиво сделать.
В итоге был реализован 4й способ, самый трудоемкий и самый эффективный - С++  + использование СОМ-модели Excel + WIN API
В итоге я не завишу от настроек безопасности (кроме первоначального запуска) и могу сделать любую форму (с анимацией и блекджеком), ограничиваясь лишь моим временем на реализацию свистелок и пер нужных элементов. Можно даже мою игруху LIFE туда поместить :)
Сейчас набросал самую простую.
(см. пример: команды на вкладку "ADD-IN", команда "XLL Form")
XLLform.PNG (11.65 КБ)
Изменено: bedvit - 27 ноя 2020 13:42:40
«Бритва Оккама» или «Принцип Калашникова»?
 
СОМ-модель Excel позволяет программно добавить 5 элементов управления:
1.msoControlButton
2.msoControlEdit
3.msoControlDropdown (выбор только из списка)
4.msoControlComboBox (список и возможность вписать свои данные)
5.msoControlPopup

В реализации выглядит так.

Матчасть:
MsoControlType enumeration (Office) (типы элементов управления )
CommandBarButton members (Office)(методы и свойства элементов управления )
Изменено: bedvit - 30 ноя 2020 18:46:39
«Бритва Оккама» или «Принцип Калашникова»?
 
Добавил контекстное меню для ячеек

строки

столбца
.
Добавил автоматическое удаление всех кнопок и меню при закрытии надстройки.
Добавил "Конвертацию числа сохраненного как текст в число", для теста.
При тестировании у меня был паритет с VBA версией, исправление 2 млн. ячеек - 11 сек.(причина в том, что оба языка используют СОМ-модель Excel).
Думаю нужно протестировать на чем-то вроде подбора слагаемых под нужную сумму на больших массивах или что-то в этом роде. Думаю будут интересные результаты.
Тестовые функции:
VBA
Скрытый текст


C++
Скрытый текст


Библу перезалил. Можно тестировать, кому интересно.
Изменено: bedvit - 3 дек 2020 16:47:55
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: подбора слагаемых под нужную сумму на больших массивах
давно хотел предложить тебе комбинаторику
Это будет круто!  :idea:
Реквизиты для благодарности и контакты для связи — в профиле
 
Цитата
Jack Famous написал:
предложить тебе комбинаторику
Создал отдельную тему.
Кстати, можно из VBA пользоваться командами, которые назначены на кнопки (будет выполнятся для активного листа).
к примеру
Код
Sub Application_RUN()
Application.RUN ("XLLbuttonTranspose")
End Sub

Добавил список XLL Button API для всех кнопок (команда для кнопки отображается в скобках). Легко скопировать нужную.
Для всех кнопок есть всплывающая подсказка.
Изменено: bedvit - 4 дек 2020 14:59:18
«Бритва Оккама» или «Принцип Калашникова»?
 
Добавил возможность отключить диалоги с нужным ответом.
Для возможности из VBA пользоваться командами для кнопок, в автоматическом режиме, каждый раз не нажимая ответ в диалоге.
1- ответ в диалоге "Да", 0 - "Нет"
К примеру в рассматриваемом коде, не вызывается два диалога, а автоматически выполняется код, как если бы мы два раза ответили "Да"
Код
Sub Application_RUN()
Application.RUN "XLLbuttonFindSummands", "11" 
End Sub

Есть и возможность оставить все диалоги, просто вызвав команду без параметра (это опционально).
Изменено: bedvit - 16 дек 2020 12:50:00
«Бритва Оккама» или «Принцип Калашникова»?
 
Добавил 3 режима работы библиотеки
Test - вывод подсказок, таймингов;
User - вывод подсказок;
Professional - без подсказок


Далее по теме:
Ribbon на XML - мощная GUI, с широкими возможностями создания любых своих пожеланий на ленте (пока не реализовал этот вариант в xll, в силу отсутствия знаний, как это сделать красиво)
Программное создание элементов управление, через СОМ-модель Excel сильно беднее по возможностям, выше описывал возможные команды/элементы.
Но есть один неоспоримый плюс - это динамическое создание элементов управление.
т.е. при нажатии на кнопку, я могу создать еще одну кнопку(и),удалить кнопку(и), изменить иконку для кнопки, да же изменить привязанную функцию/команду.
Насколько я знаю в Ribbon на XML это невозможно или сильно с костылями.
К примеру так:
Изменено: bedvit - 16 дек 2020 12:58:54
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1
Читают тему (гостей: 1)
Наверх