Страницы: 1 2 След.
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.11.2020 19:14:54
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Какое окошко вам больше нравится?
дело вкуса - по мне Win  поинтереснее смотрится, правильно я понимаю, что пользовательские формы недоступны в этих вариантах?
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
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.11.2020 17:28:56
«Бритва Оккама» или «Принцип Калашникова»?
 
Добавил значки в меню
У всех работает меню (начиная с версии Excel 2010)?
У меня работает справка, транспонирование пока просто вставка данных на лист, форма создается, но пока не выводится (можно посмотреть в VBA-проекте активной книги)
Надстройка по той же ссылке.
«Бритва Оккама» или «Принцип Калашникова»?
 
Много "bedvit-ов", привел в соответствие с общей стратегией (с названиями категорий для функций XLL). Поменьше саморекламы :)
Мне кажется, так лучше
«Бритва Оккама» или «Принцип Калашникова»?
 
проверено в 365 - лента, функции -полёт нормальный
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
bedvit: Поменьше саморекламы
я не был согласен с горе-комментаторами тогда, не согласен с тобой и сейчас. bedvit — коротко, лаконично и однозначно определяет ГРУППУ инструментов. Это как минимум просто удобно. Верни  :)
Изменено: Jack Famous - 25.11.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")
Изменено: bedvit - 27.11.2020 13:42:40
«Бритва Оккама» или «Принцип Калашникова»?
 
СОМ-модель Excel позволяет программно добавить 5 элементов управления:
1.msoControlButton
2.msoControlEdit
3.msoControlDropdown (выбор только из списка)
4.msoControlComboBox (список и возможность вписать свои данные)
5.msoControlPopup

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

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

строки

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


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


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

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

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


Далее по теме:
Ribbon на XML - мощная GUI, с широкими возможностями создания любых своих пожеланий на ленте (пока не реализовал этот вариант в xll, в силу отсутствия знаний, как это сделать красиво)
Программное создание элементов управление, через СОМ-модель Excel сильно беднее по возможностям, выше описывал возможные команды/элементы.
Но есть один неоспоримый плюс - это динамическое создание элементов управление.
т.е. при нажатии на кнопку, я могу создать еще одну кнопку(и),удалить кнопку(и), изменить иконку для кнопки, да же изменить привязанную функцию/команду.
Насколько я знаю в Ribbon на XML это невозможно или сильно с костылями.
К примеру так:
Изменено: bedvit - 16.12.2020 12:58:54
«Бритва Оккама» или «Принцип Калашникова»?
 
Хочу узнать мнения спецов по вопросу локализации. Нужна ли она и до какого уровня (не нужна, только нужнах только для.. всплывающих  комментариев к кнопкам меню, для всего меню, для функций, для описание аргументов функции и т.д)? Плюсы, минусы такого подхода?
«Бритва Оккама» или «Принцип Калашникова»?
 
Голосуем:
1.
2.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Ribbon на XML - мощная GUI, с широкими возможностями создания любых своих пожеланий на ленте (пока не реализовал этот вариант в xll, в силу отсутствия знаний, как это сделать красиво)
Программное создание элементов управление, через СОМ-модель Excel сильно беднее по возможностям, выше описывал возможные команды/элементы.
bedvit спасибо за ваши труды!
как по мне, то чем более лаконичен GUI, тем быстрее находишь то, что всегда нужно под рукой, не распыляя глаза по всей ленте... фокус внимания должен отдыхать при поиске инструментов, потому что при использовании далее этих инструментов ему стоит сосредоточится на своей логике... всегда легко работать, когда не отвлекает ничего лишнего и все силы не приходится тратить на выглядывание ещё только инструмента... имхо... чем проще, тем лучше... (кстати поэтому я всегда любила office2003  и до сих пор скептически отношусь к office2007 и выше, хоть и приходится ими пользоваться)
Цитата
bedvit написал:
по вопросу локализации.
по этому вопросу, думаю, что ответ #3 тоже валиден... - про общий стиль...
или, если ориентироваться по моим вкусам, - в "стиле минимализма", чтобы не напрягать фокус внимания постоянно всплывающими переводами... а общий стиль по принципу или-или (или ru локаль, или en локаль) синхронизированно с локалью самого office... - если я правильно поняла ваш вопрос...
p.s.
а ещё лучше под свой брэнд разрабатывать свой дизайн - т.е. одной кнопкой с ленты всё-таки выбросить своё окошко (можно даже со своим логотипом)... но если цель максимально интегрироваться в продукт Microsoft, чтобы стать его частью - то можно  и всё на его ribbon... вобщем это сугубо вопрос самопозиционирования на рынке услуг и маркетинга для своего продукта :) ... о чём кстати тоже не стоит забывать при разработке... имхо
Успехов вам и спасибо за развитие темы.
Изменено: JeyCi - 04.02.2021 07:26:01
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
синхронизированно с локалью самого office
Это хорошая идея.
Запилил.
В первоначальном запуске язык меню зависит от локали самого офиса. Потом можно переключать. Сделал видео, правда не попало в видеозахват контекстное меню (прилагаю скриншот)
https://youtu.be/DutbxErsF_M
Изменено: bedvit - 05.02.2021 13:57:30
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
правда не попало в видеозахват контекстное меню (прилагаю скриншот)
спасибо... вот это кстати удобнее, чем на ленту лазить... а поддерживается ли данный функционал растягиванием выделения на диапазон (крестиком от ячейки) и форматом по образцу (метёлкой)?.. т.е. будет ли его поведение, как поведение формул и форматов Excel там, где это возможно?
Изменено: JeyCi - 06.02.2021 06:40:25
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
bedvit написал:
Хочу узнать мнения спецов по вопросу локализации.
Локализация - вред!!!  :D   Главной что сказал А говорим Б, то есть если делать то делать реальный мультилангвидж, и тут надо серьезно работать по переводу при этом все ж соблюдать и точность и адаптивность. Ну я про Remove Arrows  - Убрать, Duplicate values - Выделить дубликаты ....

А вот по поводу общей организации - для меня организация рибон сперва была не удобна, а потом я понял что попала в самую точку. Я никогда не запоминал кнопок 95-2003 и ходил через меню которое там было. Рибон - тоже меню только более интерактивное и так как менее насыщено, то проще на мой взгляд.
По вопросам из тем форума, личку не читаю.
 
Коллеги, спасибо за мнения!
JeyCi, контекстное меню поддерживает и работает именно с выделенной областью (если выделена одна ячейка применяется ко всему листу). Поведение как и у стандартного контекстного меню.
БМВ, сделал на разных языках только команды меню/контекстного меню. Будет время, возможно и диалоги сделаю. Пока, в этом, не видно сильной необходимости.
Цитата
БМВ написал:
Duplicate values - Выделить дубликаты ....
Перевод довольно вольный. В англоязычной версии так ,
а в RU-версии - перевод не дословный, ближе к функционалу.
Изменено: bedvit - 18.02.2021 14:51:56
«Бритва Оккама» или «Принцип Калашникова»?
 
Сейчас обнаружил (для себя) еще одну интересную особенность моего меню/контекстного меню и механизма создания интерфейса: Для каждого нового окна это разные кнопки/команды (в терминах СОМ - разный IDispatch(интерфейс)). Т.е. при создании новой книги, Excel копирует/создает новые кнопки с тем же названием, но с разным IDispatch (по простому - с разным указателем). Это выливается в интересную особенность: в одном и том же сеансе Excel, для разных книг свой набор кнопок. Вплоть до разных языков.
Напрашивается вопрос - нужен ли одинаковый интерфейс (язык, режим работы надстройки) для всех книг сессии или сделать независимым?
Изменено: bedvit - 18.02.2021 15:05:37
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Для каждого нового окна это разные кнопки/команды (в терминах СОМ - разный IDispatch(интерфейс)). Т.е. при создании новой книги, Excel копирует/создает новые кнопки с тем же названием, но с разным IDispatch (по простому - с разным указателем).
т.е. каждый IDispatch прогружается в память сам по себе и AddRef по сути для каждого всегда остаётся 1 ?.. вообще как-то не по предназначению COM... - я-то думала, что загружается в память 1 раз, а потом AddRef может добавлять обращение к интерфейсу IDispatch (в частности через него к QueryInterface) от любого процесса?..
стесняюсь спросить, может не совсем правильно сделано (как по задумке разработчиков COM-технологии)?.. или я не совсем правильно понимаю суть COM?
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, вопрос не в подсчете ссылок на объект, а в том, что это разные объекты.
Одна и та же кнопка (это объект со своим идентификатором/интерфейсом  IDispatch) в разных окнах - разные объекты. см. прилож. рис.

Легко можно посмотреть в разных окнах для одной и той же кнопки свойство InstanceIdPtr (VBA).
Поэтому, к примеру если мы захотим динамически менять данные по кнопке, нам нужно будет это делать для всех открытых окон (для одной и той же кнопки).
Пришлось использовать FindControl и ActiveWindow.ActivateNext (что достаточно удобно для целей перехода по окнам)
Жаль, что Range. Next не работает как написано.
Цитата
Если объект является диапазоном, это свойство эмулирует клавишу TAB,
- не работает оно так. А было бы удобно, по диапазону с несколькими Areas.
«Бритва Оккама» или «Принцип Калашникова»?
 
понятно, что QueryInterface даёт разные объекты... но вот IDispatch почему так размножился - мне не совсем понятно...
Цитата
bedvit написал:
Одна и та же кнопка (это объект со своим идентификатором/интерфейсом  IDispatch) в разных окнах - разные объекты. см. прилож. рис.
Легко можно посмотреть в разных окнах для одной и той же кнопки свойство InstanceIdPtr (VBA).
InstanceIdPtr и так может быть разный даже если с одного IDispatch...
вобщем не буду спорить (не имела ещё таких ситуаций в своей практике), но для себя оставлю на потом для уточнения тему множественного использования интерфейса COM разными клиентами... хотя в вашем случае даже, наверно, и об одном клиенте можно говорить (приложение Office Excel)...
P.S.
кстати если IDispatch у вас будет 1 на все кнопки - то вопрос, надо ли дифференцировать локаль для разных окон отпадёт... имхо...
а вообще, когда рябит в глазах - не очень удобно - поэтому на ваш вопрос о режиме для всех книг сессии дала бы такой же ответ, как уже дала выше, -- единообазно с локалью/режимом для всего excel (т.е. всех открытых книг сессии) и все книги сессии вообще-то тоже единообразны по режиму по природе своей есть... думаю, дёргать режимы здесь - только калейдоскоп или фейерверк устраивать, - это для шоу, не для работы... имхо
Изменено: JeyCi - 25.02.2021 08:36:40
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
InstanceIdPtr и так может быть разный даже если с одного IDispatch...
Один и тот же IDispatch для двух разных объектов? с таким не встречался, сможете привести пример?  IDispatch это интерфейс к конкретному объекту, как он может быть одинаков у разных объектов (имеется ввиду не общий набор свойств и методов родителя, а именно нужный объект)
Цитата
JeyCi написал:
IDispatch у вас будет 1 на все кнопки
Здесь я не понял, см. вопрос выше.
По интерфейсу спасибо за мнение, сейчас как-раз взвешиваю варианты. Ведь для каждого окна могут быть свои настройки, видимость, фильтры, условный формат, защита ячеек. Если панель будет одна для всех книг, эти особенности нельзя будет учесть для каждой книги, выходит калейдоскопа нет, но и нет функционала отдельно для книги.
Сейчас смотрю, сам Excel - как раз калейдоскоп, для каждой книги, свой шрифт, группировки, условного формата, разметки, с отображением этого в командах/кнопках (с подсветкой кнопок или их деактивации).
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
(имеется ввиду не общий набор свойств и методов родителя, а именно нужный объект)
вот, bedvit, а кто тогда родитель?.. :) -- думала, что IDispatch - родитель: Практическое использование IDispatch
я просто сейчас немного далека от COM...
но, может быть, вы и правы, возможно я всё ещё путаю класс и объекты им создаваемые... просто, наверно, не помню кто там 1 раз прогружается в память, чтобы быть доступным всем процессам?.. - наверно, сама надстройка COM, которая и порождает разных диспетчеров для разных объектов... т.е. надстройка, как класс, видимо, по сути... возможно её IUnknown ? , от которого и наследует IDispatch
Цитата
IDispatch был разработан как способ управления объектом
- да, судя по всему 1 диспетчер на 1 объект...
p.s.
sorry, что внесла немного путаницу...
p.p.s.
Цитата
bedvit написал:
Сейчас смотрю, сам Excel - как раз калейдоскоп
вот это, действительно, настораживает... тут, вероятно, очень тонкую ювелирную работу придётся провести по внедрению в контекстное меню для каждой ячейки... вобщем моё мнение однозначное - всё к единообразию - чтобы не переключать фокус внимания...
успехов вам и спасибо за пояснения
Изменено: JeyCi - 26.02.2021 07:35:33
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
а кто тогда родитель?..  
а вообще wiki хорошо объясняет
Цитата
Aggregation in COM​.
In Microsoft's Component Object Model, aggregation means that an object exports, as if it were their owner, one or several interfaces of another object it owns. Formally, this is more similar to composition or encapsulation than aggregation. However, instead of implementing the exported interfaces by calling the interfaces of the owned object, the interfaces of the owned object themselves are exported. The owned object is responsible for assuring that methods of those interfaces inherited from IUnknown actually invoke the corresponding methods of the owner. This is to guarantee that the reference count of the owner is correct and all interfaces of the owner are accessible through the exported interface, while no other (private) interfaces of the owned object are accessible.
... вобщем, owner - интерфейс внутри самого COM, методы которого вызываются объектами, чьи интерфейсы наследуются от IUnknown(Ы) через IDispatch(И)...
Изменено: JeyCi - 08.03.2021 08:34:55
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1 2 След.
Наверх