|
|
|
| Народ, подскажите, как ограничить количество команд в контекстном миню форм. Точнее хотелось бы убрать команду переключения в режим конструктора. Как режим сводной таблицы и прочего сделать неактивными знаю, но убрать команду конструктора не знаю. | |
|
| |
|
|
|
| а войти Настройка - "Контекстные меню" - "Форма" - "Режим формы - Заголовок" и его грохнуть?
или достучаться по этому пути програмно | |
|
| |
|
|
|
| Сделать собственное меню (вместо стандартного)
В него напихать что нужно и не пихать что не нужно | |
|
| |
|
|
|
| Вот об этом и речь. Всегда обходил этот вопрос, а сейчас стало интересно. Можно ли как говорит кот убрать стандартное и сделать свое, с напиханных чем не нужно и убранным нужным. Примерчик бы хотелось. Вроде как модуль писать какой-нибудь. Например по дереву контекст Добавить, Изменить, Удалить - это все для меня высший пилотаж. Не видел нигде в доступном для понимания издании. Если не трудно плиз примерчик. | |
|
| |
|
|
|
| Ничего писать не надо.
Через меню "Сервис"-"Настройка" открываете диалог. Кнопкой "Создать" создаете новую панель инструментов и напихиваете команды, а затем щелкаете кнопку "Свойства" и меняете тип на "Контекстное меню". Имя своего конт. меню указываете в св-вах формы. | |
|
| |
|
|
|
| Блин. Вот я лошара. Так просто, что и подумать об этом не мог. Все башку ломал как это они делают??? А оно... Спасибо. | |
|
| |
|
|
|
| Подскажите плиз по контексту.Как набирать команды в свое контекстное меню и устанавливать его на форму понятно. Но мне надо что бы там были не виндовские и аксовские команды, а мои. ну типа удалить, изменить, добавить и на кнопках контекста собственный код. Что-то не получается до этого меню в конструкторе добраться. | |
|
| |
|
|
|
| Диалог "Настройка" - вкладка "Панели инструментов" - установить флажок на строке "Контекстные меню". Откроется окно "контекстные меню". Все ваши в категории "Настраиваемый". Раскрываете свое меню и тащите туда команду "Специальная". В ее свойстве "Действие" нужно либо указать имя макроса, либо =ИмяФункции()
ЗЫ. Кстати, кто знает как удалить чвое контекстное меню? | |
|
| |
|
|
|
| Зы: варианты:
1. Руками: поменять тип на "панель инструментов", затем удалить.
2. CommandBars("ИМЯ").Delete | |
|
| |
|
|
|
|
Руками: поменять тип на "панель инструментов", затем удалить.
| Вот как раз руками и не получается. При щелчке правой кнопкой мыши на имени контекстного меню - никакой реакции. | |
|
| |
|
23 Кб. |
|
| => | |
|
| |
|
36 Кб. |
|
| Сначала это =>,
затем то, что выше. | |
|
| |
|
|
|
| Lukas, а вы сами пробовали это сделать для строки "Контекстные меню"? У меня открываются свойства для "Строка меню". | |
|
| |
|
124 Кб. |
|
| Конечно пробовал.
:)
В форме свойств, самый верхний комбобокс,
там можно выбрать нужное, затем менять свойства. | |
|
| |
|
|
|
| Получилось! | |
|
| |
|
|
|
| За инструкцию удаления лишних меню спасибо. В ходе многочисленных экспериментов их у меня довольно много получилось. | |
|
| |
|
4 Кб. |
|
| До кучи кинул... с картинкой.
заинтересует - поболтаем :)
При отладке все ненужное отрезать.
Function PopUp_DelPosRecount(NamePopUpMenu$, KodPosition&, frmName$)
Dim MenuItem As Object
Dim cmb As Object
On Error Resume Next
Application.CommandBars(NamePopUpMenu).Delete ' Delete any existing popup menu.
With Application.CommandBars.Add(Name:=NamePopUpMenu, Position:=5, _
MenuBar:=False, Temporary:=True)
With .Controls.Add(Type:=1) ' создание меню
.Caption = "Удалить позицию"
.faceID = 536 'значок "крестик"
.OnAction = "=DeletePositionFromInvoice(" & KodPosition& & ",'" & frmName & "')"
End With
With .Controls.Add(Type:=1)
.Caption = "Перенумеровать позиции счета"
.faceID = 11 ' значок "нумерованый список"
.OnAction = "=RecountPositionInInvoice('" & frmName & "')"
End With
With .Controls.Add(Type:=1)
.Caption = "Повторить строку"
.faceID = 136 ' значок "нумерованый список"
.OnAction = "=CopyRowInvoice('" & frmName & "')"
End With
End With
Application.CommandBars(NamePopUpMenu).ShowPopup
' Display the popup menu.
On Error GoTo 0
End Function
|
| |
|
| |
|
|
|
| Только обязательно сделайте копию файла!!!
ChangeProperty "StartupShowDBWindow", dbBoolean, False
ChangeProperty "StartupShowStatusBar", dbBoolean, False
ChangeProperty "AllowBuiltinToolbars", dbBoolean, False
ChangeProperty "AllowFullMenus", dbBoolean, False
ChangeProperty "AllowBreakIntoCode", dbBoolean, False
ChangeProperty "AllowSpecialKeys", dbBoolean, False
ChangeProperty "AllowBypassKey", dbBoolean, False | |
|
| |
|
|
|
| Че-та интересное. Но много незнакомых команд. | |
|
| |
|
|
|
| Function ChangeProperty(strPropName As String, varPropType As Variant, varPropValue As Variant) As Integer
Dim dbs As Database, prp As Property
Const conPropNotFoundError = 3270
Set dbs = CurrentDb
On Error GoTo Change_Err
dbs.Properties(strPropName) = varPropValue
ChangeProperty = True
Change_Bye:
Exit Function
Change_Err:
If err = conPropNotFoundError Then ' Свойство не найдено.
Set prp = dbs.CreateProperty(strPropName, varPropType, varPropValue)
dbs.Properties.Append prp
Resume Next
Else
' Неизвестная ошибка.
ChangeProperty = False
Resume Change_Bye
End If
End Function | |
|
| |
|
|
|
| Незнакомые - поскольку, может, не часто работал с объектом КоммандБар :)
У него свои метОды
Но, все - спереди!
в референсах ничего подключать не надо. | |
|
| |
|
|
|
| Видимо еще не дорос. Но вырасту однозначно. Сейчас освоил контекст. И создавать и удалять. Однако веЗДЧ!
Но вот вопрос. Создал контекст (предположим для одного списка в форме) Там меню Удалить, Изменить, Добавить. Но для работы контекста приходится делать макрос, в котором запускается соответствующая функция. Функции прописываю в отдельном модуле, а вот с макросами получается, что для каждой команды и для каждого списка на форме или различных формах приходится делать новый. Что-то тут не то.
Можно ли как-то из контекстной команды запускать что бы не макрос, а функцию из модуля. А то количество макросов растет.
Чую, что что-то не то делаю. С одной стороны работает и ладно. Но с другой стороны... Большое количество макросов никак не влияет на что-то там? | |
|
| |
|
|
|
| Не нужны макросы. Вместо имени мвкроса в поле "Действие" пишите =ИмяФункции() (знак "=" обязательно). | |
|
| |
|
25 Кб. |
|
| >>... =ИмяФункции() (знак "=" обязательно)
Я уже не помню точно, что, где, когда, но равно не всегда обязательно. =>
Функция OpenList описана паблик в "общем" модуле. | |
|
| |
|
|
|
| Ай спасибо! Поднялся еще на одну ступеньку. | |
|
| |
|
|
|
| Стоп. Йожык, это случаем не мой ли предыдущий вопрос? Использовать не самодельный контекст из макросов, а коммандбар, что бы эти макросы избежать...
Че-та рассмотрел внимательнее твой код, пока не допер как в моем случае быть. Плиз немного подробнее о том что вижу.
Этот контекст для формы. Мне же нужно обрабатывать таблу через список. Удалить, изменить и т.д. | |
|
| |
|
|
|
| Ответ ли это на твой вопрос - не знаю.
Пример, который я привел - у меня работает в табличной форме и, кроме того, только в одном поле. По остальным полям выскакивает стандартное контекстное меню.
NamePopUpMenu - это переменная с именем контекстного меню.
При событии открытии Формы можно прописать свойство формы "контекстное меню" заданное имя. Если таких форм несколько, то создание меню можно вынести в отдельную процедуру модуля (что и видно из кода), где имя формы - параметр.
Для твоего случая
1 Хорошо бы для начала дернуть стандартную процедуру прохода циклом по любому меню
2 научиться отключать пункты этого меню,
3 добавлять пункты этого меню, если они отсутствуют.
Я до сих пор стараюсь не модифицировать встроенные меню Акссесс, а создаю каждый раз новые (со свойством Temporary:=True) время жизни которых определяется временем жизни сессии.
Мне это дает сомнительную, может быть, но свободу
- Временные не плодятся.
- избавляюсь от проверок на наличие/отсутствие
Главное меню базы у меня строиться из дерева, источник которой - таблица на сервере.
Это хорошо тем, что для каждого меню прописана роль. И если у пользователя сменилась роль, то ему достаточно переавторизоваться - структура отображаемого для него меню измениться. Без наличия сервера - меню - нет.
Редактирую я его тоже - визуально. По-своему :)
http://hiprog.com/forum/files/10211-20120316131948.gif
Ну и так далее.
К чему я так много пишу на посторонние темы? :)
Если тебе надо распространять 5 баз, то можешь делать теми способами, что предложены выше.
Я же обновления базы ставлю более чем на 50 машин и не менее двух раз в день. Естественно, что копировать базы с новым меню не буду.
Поэтому все, что может жить на сервере - живет на сервере. Все, что шевелится от запросов до модулей - подбирается с сервера из текстовых файлов (сохраненных объектов, в виде текстовых файлов)
Я не проверял, будет ли форма, сохраненная в виде текстового файла иметь новонаписанное для нее меню. Полагаю, по простоте душевной, что нет. Поэтому пишу процедуру его создания....
для этого в базе создал модуль с именем BuildMenu
Готовые рецепты вряд ли будут. Еще о меню писал здесь:
http://hiprog.com/forum/read.php?id_forum=1&id_theme=10211&page=1 | |
|
| |
|
|
|
| Спасибо. Но это слишком глобально. Мне бы просто с контекстом справиться, что бы для каждого элемента на форме свой был. Хорошо бы кодом прописать, а не макросом. Но вот это и не получается.
На счет обновлений - идеи однако, шаманские. | |
|
| |
|
|
|
| шайтанама!
Йож, жжошь! | |
|
| |
|
|
|
| С наступающим! | |
|
| |
|
|
|
| Ответ:
Sub ViewCMB()
Dim cmb As Object
Dim сButton As Object
Set cmb = Application.CommandBars("Form View Popup")
For Each сButton In cmb.Controls
Debug.Print сButton.Caption
If сButton.Caption = "&Конструктор форм" Then
Stop
сButton.Enabled = False
End If
Next
End Sub
|
Можно вешать на открытие формы.
На закрытие - наверно, следует возвращать отъенебленное. Удачи
Можно узнавать имя комьпютера или пользователя на запуске базы... Да чего я, разберешься ;)
ЗЫ если англоязычная - можно универсально обращаться к индексу контрола. | |
|
| |