powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Получить доступ к контролу риббона в Run-Time
4 сообщений из 4, страница 1 из 1
Получить доступ к контролу риббона в Run-Time
    #39345045
JustNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня!
Предыстория:
есть в Excel 2010 на панели своя пользовательская вкладка, на ней множество различных групп и контролов.
Вот часть структуры:
XML-файл риббона. Часть некая
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="MyRiibonInit">
	<ribbon>
		<tabs>
			<tab id="CustomTab" label="Редактор" keytip="RR">
				<group id="Group1" label="Общие">
					<button id="Button11" label="Загрузить" size="normal" onAction="SelectRs" imageMso="FileOpenDatabase"/>
					<button id="Button12" label="Обновить" size="normal" onAction="RefreshRs" imageMso="Refresh"/>
					<button id="Button13" label="Закрыть" size="normal" onAction="CloseRs" imageMso="GroupInkClose"/>
				</group>
				<group id="Group2" label="Оформление">
					<button id="Button21" label="Показать" size="normal" onAction="ShowOOP" imageMso="HeaderFooterEditHeader"/>
					<button id="Button22" label="Скрыть" size="normal" onAction="HideOOP" imageMso="HeaderFooterRemoveHeaderWord"/>
					<button id="Button23" label="Очистить" size="normal" onAction="ClearColor" imageMso="FormFieldReset"/>
				</group>
				<group id="Group3" label="Фильтры отображения">
					<box id="bx_Levels" boxStyle="vertical" visible="true">
						<checkBox id="chb_Bak" label="Уровень1" getPressed="GetFiltr1" onAction="Filtr1" />
						<checkBox id="chb_Spec" label="Уровень2" getPressed="GetFiltr1" onAction="Filtr1" />
						<checkBox id="chb_Mag" label="Уровень3" getPressed="GetFiltr1" onAction="Filtr1" />
					</box>
					<box id="bx_OtherFilters" boxStyle="vertical">
						<dropDown id="comboBox2" label="Формы" getSelectedItemID="GetFiltr2ID" onAction="Filtr2">
							<item id="cb21" label="Все"/>
							<item id="cb22" label="форма1"/>
							<item id="cb23" label="форма2"/>
						</dropDown>
						<dropDown id="comboBox3" label="Курсы" getSelectedItemID="GetFiltr3ID" onAction="Filtr3">
							<item id="cb31" label="Все"/>
							<item id="cb32" label="1"/>
							<item id="cb33" label="2"/>
							<item id="cb34" label="3"/>
							<item id="cb35" label="4"/>
							<item id="cb36" label="5"/>
							<item id="cb37" label="6"/>
						</dropDown>
					</box>
				</group>
			</tab>
		</tabs>
	</ribbon>
</customUI>




При загрузке книги объявляется глобальная переменная риббона, с которой и работаю. Но!!! В процессе работы, если возникает какая-либо ошибка, то слетают глобальные переменные.
При нажатии кнопки "Загрузить" данные я могу загрузить, но хотелось бы обновить и риббон - в частности, проставить всем фильтрам значения по умолчанию.

И как-то не могу понять. То ли туплю, то ли ... Нужен пинок в нужную сторону или информация, подкупающая своей новизной.
Пробовала использовать хитрый код отсюда . Excel вылетает на строке:
Код: vbnet
1.
CopyMemory ribbon, lPointer, LenB(lPointer)


И вылетает знатно, даже книгу потом невозможно ни открыть, ни восстановить.
Пробовала CommandBars. В итоге у меня есть Application.CommandBars("Ribbon").Controls, в котором всего один контрол с именем Ribbon. В нем других контролов нет :(
Как достучаться до риббона в рантайме? Или как его перезагрузить и восстановить ссылку в глобальной переменной на уже загруженный риббон?
...
Рейтинг: 0 / 0
Получить доступ к контролу риббона в Run-Time
    #39345055
JustNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, в качестве дополнения - есть еще вот тут очень много кода, но на него меня уже не хватило... Боюсь потерять еще пару дней и ничего не добиться.
Если кто-то уже разбирался, подскажите, будьте добры :)
...
Рейтинг: 0 / 0
Получить доступ к контролу риббона в Run-Time
    #39345311
JustNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из последних мыслей: для загрузки данных я нажимаю собственно кнопку Загрузить на риббоне. Т.е. я могу в то же процедуре после отработки загрузки обновить обновить и фильтры.
Тогда остается вопрос - как из процедуры обработки, для которой входящим параметром является риббоновый контрол-кнопка, поменять значение другого контрола?
Вот, собственно, процедура по кнопке риббона Загрузить .
Код: vbnet
1.
2.
3.
Sub SelectRs(control As IRibbonControl)
    Form1.Show
End Sub



Из всего того, что я написала выше, хотелось бы сделать нечто такое:
Код: vbnet
1.
2.
3.
4.
5.
6.
Sub SelectRs(control As IRibbonControl)
    ' Запуск формы для выбора параметров загрузки данных
    Form1.Show
    ' Установка default-значений
    MyRibbon.Control("chb_Bak").Value = True
End Sub



Пока у меня тут монолог =D Надеюсь, кто-нибудь присоединится в ближайшем будущем или мне придет светлая мысль в голову, и проблема-таки решится.
...
Рейтинг: 0 / 0
Получить доступ к контролу риббона в Run-Time
    #39345830
JustNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну что сказать... приятно поговорить с хорошим человеком :P

Задачу я взяла измором. А все невнимательность!
Итак, чтобы вернуть переменной ribbon-a указатель на сам риббон, можно-таки воспользоваться кодом отсюда

Для удобства и красоты добавила отдельный модуль, содержащий все необходимые процедуры (см. ссылку).
процедуры для возврата связи с риббоном из ссылки
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Option Explicit
#If VBA7 Then
Public Declare PtrSafe Sub CopyMemory Lib "kernel32" _
    Alias "RtlMoveMemory" (ByRef destination As Any, ByRef Source As Any, ByVal length As LongPtr)
#Else
Public Declare Sub CopyMemory Lib "kernel32" _
    Alias "RtlMoveMemory" (ByRef destination As Any, ByRef Source As Any, ByVal length As Long)
#End If

Public Sub InvalidateRibbon(ByRef ctrl As IRibbonControl)
    RestoreRibbon
    MyRibbon.Invalidate
End Sub
Sub AddNameForRibbonPointer()
    Application.Names.Add Name:="RibbonPointer", RefersTo:="=&#208;&#224;&#241;&#239;&#232;&#241;&#224;&#237;&#232;&#229;!$A$1", Visible:=False
End Sub
Sub RestoreRibbon()
    If MyRibbon Is Nothing Then
#If VBA7 Then
        Dim lPointer As LongPtr
        lPointer = CLngPtr([RibbonPointer])
#Else
        Dim lPointer As Long
        lPointer = CLng([RibbonPointer])
#End If
        If lPointer <> 2029 Then _
            CopyMemory ObjPtr(MyRibbon), lPointer, LenB(lPointer)
    End If
End Sub




Процедура инициализации риббона выглядит так:
Код: vbnet
1.
2.
3.
4.
5.
Sub MyRibbonInit(ribbon As IRibbonUI)
    Set MyRibbon = ribbon
    Call AddNameForRibbonPointer
    Names("RibbonPointer").Value = ObjPtr(MyRibbon)
End Sub



Ссылка на эту процедуру в XML по событию onLoad:
Код: xml
1.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="MyRibbonInit">



В код процедуры-обработчика кнопки Загрузить написала так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub Загрузить(control As IRibbonControl)
    ' Освежаем риббон и ставим значения по умолчанию
    If MyRibbon Is Nothing Then _
        Call InvalidateRibbon(control)
    If Not MyRibbon Is Nothing Then
        Cells(4, 4) = "Все"
        MyRibbon.InvalidateControl ("comboBox3")
    End If
    ' (далее все действия по кнопке)
End Sub



Всем спасибо! Особенно автору этого кода, который мне и помог собственно :)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Получить доступ к контролу риббона в Run-Time
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]