Переделываю ё... ленту Excel-2010 под себя Никак что-то не соображу, можно ли, не используя свои внедряемые картинки, а только встроенные сделать кнопку с картинкой "нажатой" (на жёлтом фоне)/"отпущенной" (на прозрачном фоне) в зависимости от состояния программы (переменной в программе?) Вот пример: Простейший макрос управляет параметром "показывать нули"/скрывать нули" Вкладка с кнопкой и кнопка на QAT работают, макрос кнопкой вызывается. Но вот как сделать чтобы при включенном отображении нулей кнопочка была "нажатой"? Никак не соображу
Переделываю ё... ленту Excel-2010 под себя Никак что-то не соображу, можно ли, не используя свои внедряемые картинки, а только встроенные сделать кнопку с картинкой "нажатой" (на жёлтом фоне)/"отпущенной" (на прозрачном фоне) в зависимости от состояния программы (переменной в программе?) Вот пример: Простейший макрос управляет параметром "показывать нули"/скрывать нули" Вкладка с кнопкой и кнопка на QAT работают, макрос кнопкой вызывается. Но вот как сделать чтобы при включенном отображении нулей кнопочка была "нажатой"? Никак не соображу Alex_ST
Саня, спасибо за пример работы с ToggleButton. Пригодится в будущем однозначно. Но это не совсем то, что я хотел в данном случае. Наверное, не внятно объяснил. Я хочу сделать кнопку-переключатель, которая будет одновременно служить и для индикации текущего состояния, и для его переключения по ЛКМ (т.е. аналог стандартных кнопок-переключателей).
Сейчас пришла мысль: в этой книге отслеживать события переключения листов в открытых книгах, а по этим событиям считывать установки видимости нулей (они для каждого листа свои) и устанавливать соответствующее состояние кнопки интерфейса.
Сейчас попробую (если ничем по работе не грузанут, конечно) и отпишусь.
Саня, спасибо за пример работы с ToggleButton. Пригодится в будущем однозначно. Но это не совсем то, что я хотел в данном случае. Наверное, не внятно объяснил. Я хочу сделать кнопку-переключатель, которая будет одновременно служить и для индикации текущего состояния, и для его переключения по ЛКМ (т.е. аналог стандартных кнопок-переключателей).
Сейчас пришла мысль: в этой книге отслеживать события переключения листов в открытых книгах, а по этим событиям считывать установки видимости нулей (они для каждого листа свои) и устанавливать соответствующее состояние кнопки интерфейса.
Сейчас попробую (если ничем по работе не грузанут, конечно) и отпишусь.Alex_ST
Я хочу сделать кнопку-переключатель, которая будет одновременно служить и для индикации текущего состояния, и для его переключения по ЛКМ (т.е. аналог стандартных кнопок-переключателей).
ToggleButton - это и есть кнопка-переключатель, ничего другого тебе не надо .
для твоих целей нужно просто отслеживать некое событие (судя по всему, уровня приложения) и передавать в ленту свойство pressed тогллбаттона
ps щас попробую слепить для одной книги...
Quote (Alex_ST)
Я хочу сделать кнопку-переключатель, которая будет одновременно служить и для индикации текущего состояния, и для его переключения по ЛКМ (т.е. аналог стандартных кнопок-переключателей).
ToggleButton - это и есть кнопка-переключатель, ничего другого тебе не надо .
для твоих целей нужно просто отслеживать некое событие (судя по всему, уровня приложения) и передавать в ленту свойство pressed тогллбаттона
Саш, что-то уж больно сложно для такого простейшего действия... Не может быть, чтобы нельзя было без API и намного проще.
Я свой предыдущий пример делал на основе примера Витера. У него всё работает, а у меня почему-то теряется назначение Риббона переменной и поэтому не срабатывает его обновление по myRibbon.InvalidateControl "tbtnZero"
Саш, что-то уж больно сложно для такого простейшего действия... Не может быть, чтобы нельзя было без API и намного проще.
Я свой предыдущий пример делал на основе примера Витера. У него всё работает, а у меня почему-то теряется назначение Риббона переменной и поэтому не срабатывает его обновление по myRibbon.InvalidateControl "tbtnZero"Alex_ST
API там нужны только для того, чтобы ленту "поднять" из указателя (если ссылка отвалится)
посмотрел твой №2: [vba]
Code
Sub SetRibbonByEvent(sEvent$, Optional vObj1 As Variant, Optional vObj2 As Variant) ' настройка Ribbon'a по событиям Select Case sEvent Case "WorkbookActivate", "SheetActivate" tbtnZero_state = ActiveWindow.DisplayZeros myRibbon.InvalidateControl "tbtnZero" End Select End Sub
[/vba]
все работает
API там нужны только для того, чтобы ленту "поднять" из указателя (если ссылка отвалится)
посмотрел твой №2: [vba]
Code
Sub SetRibbonByEvent(sEvent$, Optional vObj1 As Variant, Optional vObj2 As Variant) ' настройка Ribbon'a по событиям Select Case sEvent Case "WorkbookActivate", "SheetActivate" tbtnZero_state = ActiveWindow.DisplayZeros myRibbon.InvalidateControl "tbtnZero" End Select End Sub
А у меня нифига не работает: должно при переходе на другой лист/книгу показывать на ленте нажатую/отпущенную кнопочку tbtnZero в зависимости от настроек активного листа. У меня события перехватываются, но при их обработке возникает ошибка в [vba]
Code
Sub SetRibbonByEvent(sEvent$, Optional vObj1 As Variant, Optional vObj2 As Variant) ' настройка Ribbon'a по событиям Select Case sEvent Case "WorkbookActivate", "SheetActivate" tbtnZero_state = ActiveWindow.DisplayZeros myRibbon.InvalidateControl "tbtnZero" End Select End Sub
[/vba]на строке myRibbon.InvalidateControl "tbtnZero". Говорит, что
А у меня нифига не работает: должно при переходе на другой лист/книгу показывать на ленте нажатую/отпущенную кнопочку tbtnZero в зависимости от настроек активного листа. У меня события перехватываются, но при их обработке возникает ошибка в [vba]
Code
Sub SetRibbonByEvent(sEvent$, Optional vObj1 As Variant, Optional vObj2 As Variant) ' настройка Ribbon'a по событиям Select Case sEvent Case "WorkbookActivate", "SheetActivate" tbtnZero_state = ActiveWindow.DisplayZeros myRibbon.InvalidateControl "tbtnZero" End Select End Sub
[/vba]на строке myRibbon.InvalidateControl "tbtnZero". Говорит, что Alex_ST
запусти и посмотри окно иммидьет в редакторе - событие опережает загрузку ленты...
и еще, 1) не надо workbook_open, когда у тебя есть RibbonLoading 2) для обработки событий уровня приложения нужно создавать свой модуль класса, а не пихать их в модуле класса книги
запусти и посмотри окно иммидьет в редакторе - событие опережает загрузку ленты...
и еще, 1) не надо workbook_open, когда у тебя есть RibbonLoading 2) для обработки событий уровня приложения нужно создавать свой модуль класса, а не пихать их в модуле класса книгиСаня
RibbonLoading - это процедура обратного вызова - вызывается при загрузке пользовательского интерфейса последовательность вызовов (о чем я тебе писал "запусти и посмотри окно иммидьет в редакторе") можно увидеть на рисунке:
RibbonLoading - это процедура обратного вызова - вызывается при загрузке пользовательского интерфейса последовательность вызовов (о чем я тебе писал "запусти и посмотри окно иммидьет в редакторе") можно увидеть на рисунке: Саня
Да, глаз-то на самом деле к концу дня замылился: различие-то, оказывается, есть - у тебя On Error Resume Next поставлено в Sub SetRibbonByEvent Хоть это и грубо (ошибок-то вроде бы быть не должно), но действует отлично, а это - главное.
Саня, спасибо огромное. Ну, вот теперь завтра наконец-то в свой самопальный интерфейс кнопочку вставлю. А ведь целый день на это убил Ну, ничего, тяжело в лечении - легко в гробу
Да, глаз-то на самом деле к концу дня замылился: различие-то, оказывается, есть - у тебя On Error Resume Next поставлено в Sub SetRibbonByEvent Хоть это и грубо (ошибок-то вроде бы быть не должно), но действует отлично, а это - главное.
Саня, спасибо огромное. Ну, вот теперь завтра наконец-то в свой самопальный интерфейс кнопочку вставлю. А ведь целый день на это убил Ну, ничего, тяжело в лечении - легко в гробу Alex_ST
Хоть это и грубо (ошибок-то вроде бы быть не должно), но действует отлично, а это - главное.
да это вообще не правильно
весь фарш из workbook_open перенеси в RibbonLoading, для событийного приложения свой класс прицепи, а не щеми его в "книжном" модуле класса и все будет гуд
да, и не стоит пренебрегать возможностью поднимать упавший Риббон посредством конструкции "API-Pointer"...
Quote (Alex_ST)
Хоть это и грубо (ошибок-то вроде бы быть не должно), но действует отлично, а это - главное.
да это вообще не правильно
весь фарш из workbook_open перенеси в RibbonLoading, для событийного приложения свой класс прицепи, а не щеми его в "книжном" модуле класса и все будет гуд
да, и не стоит пренебрегать возможностью поднимать упавший Риббон посредством конструкции "API-Pointer"...Саня
Саня, 1. В Workbook_Open у меня (в данном примере) всего-то назначение объекта App для отлавливания событий:[vba]
Code
Private Sub Workbook_Open() Set App = Application End Sub
[/vba] 2. А вообще объект App мне нужен не только для работы с этой единственной кнопкой. По его событиям, например, ещё и по App_WorkbookOpen проверяется стиль ссылок при открытии новой книги и предлагается исправить его на А1, при необходимости работает макрос автоматического показа стрелок влияющих/зависимых ячеек при App_SheetSelectionChange и т.д. (Не просто же от делать нечего я прописал в процедуру SetRibbonByEvent кроме имени события её вызвавшего, ещё и пару опциональных параметров As Variant)
3. В Workbook_Open в дальнейшем будет и прописка описаний UDF в категорию "Определенные пользователем", и назначение хоткеев, и изменение меню ячейки, и …
Ну, и самое главное, наверное: - с модулями классов я так к своему стыду работать и не научился … Ну, разобрать-то чужой код смогу, но вот слепить свой - а вот от API вообще шарахаюсь как чёрт от ладана - не понимаю совсем.
Саня, 1. В Workbook_Open у меня (в данном примере) всего-то назначение объекта App для отлавливания событий:[vba]
Code
Private Sub Workbook_Open() Set App = Application End Sub
[/vba] 2. А вообще объект App мне нужен не только для работы с этой единственной кнопкой. По его событиям, например, ещё и по App_WorkbookOpen проверяется стиль ссылок при открытии новой книги и предлагается исправить его на А1, при необходимости работает макрос автоматического показа стрелок влияющих/зависимых ячеек при App_SheetSelectionChange и т.д. (Не просто же от делать нечего я прописал в процедуру SetRibbonByEvent кроме имени события её вызвавшего, ещё и пару опциональных параметров As Variant)
3. В Workbook_Open в дальнейшем будет и прописка описаний UDF в категорию "Определенные пользователем", и назначение хоткеев, и изменение меню ячейки, и …
Ну, и самое главное, наверное: - с модулями классов я так к своему стыду работать и не научился … Ну, разобрать-то чужой код смогу, но вот слепить свой - а вот от API вообще шарахаюсь как чёрт от ладана - не понимаю совсем.Alex_ST
Да! Тут ещё один жестокий облом меня настиг: оказывается, что в QAT возможны только элементы button, control, separator, а toggleButton - нет! А я-то надеялся свою кнопочку 0 в результате в QAT вывести
Да! Тут ещё один жестокий облом меня настиг: оказывается, что в QAT возможны только элементы button, control, separator, а toggleButton - нет! А я-то надеялся свою кнопочку 0 в результате в QAT вывести Alex_ST
RibbonLoading выполняется непосредственно после Workbook_Open, но это дело вкуса - кому как по душе... главное, чтобы вилы не вылезли и обработчик ошибок не функционировал как заглушка нелогичности происходящего.
Quote (Alex_ST)
Ну, и самое главное, наверное: - с модулями классов я так к своему стыду работать и не научился … Ну, разобрать-то чужой код смогу, но вот слепить свой sad - а вот от API вообще шарахаюсь как чёрт от ладана - не понимаю совсем.
RibbonLoading выполняется непосредственно после Workbook_Open, но это дело вкуса - кому как по душе... главное, чтобы вилы не вылезли и обработчик ошибок не функционировал как заглушка нелогичности происходящего.
Quote (Alex_ST)
Ну, и самое главное, наверное: - с модулями классов я так к своему стыду работать и не научился … Ну, разобрать-то чужой код смогу, но вот слепить свой sad - а вот от API вообще шарахаюсь как чёрт от ладана - не понимаю совсем.
это называется по-другому, но не слишком цензурно и весьма обидно для мелко-мягких (хотя они, наверное, давно уже привыкли к таким отзывам о массе их косяков и недодумок в интерфейсах)
Quote (Саня)
4, 5 лекции - типа ООП, 6 - API. Советую.
Спасибо. Будет время - почитаю обязательно.
Quote (Саня)
правда жизни
это называется по-другому, но не слишком цензурно и весьма обидно для мелко-мягких (хотя они, наверное, давно уже привыкли к таким отзывам о массе их косяков и недодумок в интерфейсах)Alex_ST