Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Контекст
 
 автор: Гоблин   (13.05.2012 в 09:08)   личное сообщение
 
 

Народ, подскажите, как ограничить количество команд в контекстном миню форм. Точнее хотелось бы убрать команду переключения в режим конструктора. Как режим сводной таблицы и прочего сделать неактивными знаю, но убрать команду конструктора не знаю.

  Ответить  
 
 автор: kot_k_k   (14.05.2012 в 09:10)   личное сообщение
 
 

а войти Настройка - "Контекстные меню" - "Форма" - "Режим формы - Заголовок" и его грохнуть?

или достучаться по этому пути програмно

  Ответить  
 
 автор: Дядя Федор   (14.05.2012 в 10:14)   личное сообщение
 
 

Сделать собственное меню (вместо стандартного)
В него напихать что нужно и не пихать что не нужно

  Ответить  
 
 автор: Гоблин   (14.05.2012 в 13:20)   личное сообщение
 
 

Вот об этом и речь. Всегда обходил этот вопрос, а сейчас стало интересно. Можно ли как говорит кот убрать стандартное и сделать свое, с напиханных чем не нужно и убранным нужным. Примерчик бы хотелось. Вроде как модуль писать какой-нибудь. Например по дереву контекст Добавить, Изменить, Удалить - это все для меня высший пилотаж. Не видел нигде в доступном для понимания издании. Если не трудно плиз примерчик.

  Ответить  
 
 автор: Анатолий (Киев)   (14.05.2012 в 14:40)   личное сообщение
 
 

Ничего писать не надо.
Через меню "Сервис"-"Настройка" открываете диалог. Кнопкой "Создать" создаете новую панель инструментов и напихиваете команды, а затем щелкаете кнопку "Свойства" и меняете тип на "Контекстное меню". Имя своего конт. меню указываете в св-вах формы.

  Ответить  
 
 автор: Гоблин   (14.05.2012 в 15:28)   личное сообщение
 
 

Блин. Вот я лошара. Так просто, что и подумать об этом не мог. Все башку ломал как это они делают??? А оно... Спасибо.

  Ответить  
 
 автор: Гоблин   (09.02.2013 в 19:38)   личное сообщение
 
 

Подскажите плиз по контексту.Как набирать команды в свое контекстное меню и устанавливать его на форму понятно. Но мне надо что бы там были не виндовские и аксовские команды, а мои. ну типа удалить, изменить, добавить и на кнопках контекста собственный код. Что-то не получается до этого меню в конструкторе добраться.

  Ответить  
 
 автор: Анатолий (Киев)   (11.02.2013 в 13:24)   личное сообщение
 
 

Диалог "Настройка" - вкладка "Панели инструментов" - установить флажок на строке "Контекстные меню". Откроется окно "контекстные меню". Все ваши в категории "Настраиваемый". Раскрываете свое меню и тащите туда команду "Специальная". В ее свойстве "Действие" нужно либо указать имя макроса, либо =ИмяФункции()

ЗЫ. Кстати, кто знает как удалить чвое контекстное меню?

  Ответить  
 
 автор: Lukas   (11.02.2013 в 14:29)   личное сообщение
 
 

Зы: варианты:
1. Руками: поменять тип на "панель инструментов", затем удалить.
2. CommandBars("ИМЯ").Delete

  Ответить  
 
 автор: Анатолий (Киев)   (11.02.2013 в 15:13)   личное сообщение
 
 


Руками: поменять тип на "панель инструментов", затем удалить.

Вот как раз руками и не получается. При щелчке правой кнопкой мыши на имени контекстного меню - никакой реакции.

  Ответить  
 
 автор: Lukas   (11.02.2013 в 15:24)   личное сообщение
23 Кб.
 
 

=>

  Ответить  
 
 автор: Lukas   (11.02.2013 в 15:30)   личное сообщение
36 Кб.
 
 

Сначала это =>,
затем то, что выше.

  Ответить  
 
 автор: Анатолий (Киев)   (11.02.2013 в 17:59)   личное сообщение
 
 

Lukas, а вы сами пробовали это сделать для строки "Контекстные меню"? У меня открываются свойства для "Строка меню".

  Ответить  
 
 автор: Lukas   (11.02.2013 в 19:57)   личное сообщение
124 Кб.
 
 

Конечно пробовал.
:)
В форме свойств, самый верхний комбобокс,
там можно выбрать нужное, затем менять свойства.

  Ответить  
 
 автор: Анатолий (Киев)   (12.02.2013 в 13:27)   личное сообщение
 
 

Получилось!

  Ответить  
 
 автор: Гоблин   (13.02.2013 в 09:40)   личное сообщение
 
 

За инструкцию удаления лишних меню спасибо. В ходе многочисленных экспериментов их у меня довольно много получилось.

  Ответить  
 
 автор: Йожык   (11.02.2013 в 21:24)   личное сообщение
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

  Ответить  
 
 автор: helena   (13.02.2013 в 09:41)   личное сообщение
 
 

Только обязательно сделайте копию файла!!!

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

  Ответить  
 
 автор: Гоблин   (15.02.2013 в 08:53)   личное сообщение
 
 

Че-та интересное. Но много незнакомых команд.

  Ответить  
 
 автор: helena   (15.02.2013 в 09:18)   личное сообщение
 
 

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

  Ответить  
 
 автор: Йожык   (15.02.2013 в 14:37)   личное сообщение
 
 

Незнакомые - поскольку, может, не часто работал с объектом КоммандБар :)
У него свои метОды
Но, все - спереди!

в референсах ничего подключать не надо.

  Ответить  
 
 автор: Гоблин   (17.02.2013 в 09:57)   личное сообщение
 
 

Видимо еще не дорос. Но вырасту однозначно. Сейчас освоил контекст. И создавать и удалять. Однако веЗДЧ!
Но вот вопрос. Создал контекст (предположим для одного списка в форме) Там меню Удалить, Изменить, Добавить. Но для работы контекста приходится делать макрос, в котором запускается соответствующая функция. Функции прописываю в отдельном модуле, а вот с макросами получается, что для каждой команды и для каждого списка на форме или различных формах приходится делать новый. Что-то тут не то.
Можно ли как-то из контекстной команды запускать что бы не макрос, а функцию из модуля. А то количество макросов растет.
Чую, что что-то не то делаю. С одной стороны работает и ладно. Но с другой стороны... Большое количество макросов никак не влияет на что-то там?

  Ответить  
 
 автор: Анатолий (Киев)   (18.02.2013 в 14:09)   личное сообщение
 
 

Не нужны макросы. Вместо имени мвкроса в поле "Действие" пишите =ИмяФункции() (знак "=" обязательно).

  Ответить  
 
 автор: Lukas   (18.02.2013 в 19:57)   личное сообщение
25 Кб.
 
 

>>... =ИмяФункции() (знак "=" обязательно)
Я уже не помню точно, что, где, когда, но равно не всегда обязательно. =>
Функция OpenList описана паблик в "общем" модуле.

  Ответить  
 
 автор: Гоблин   (19.02.2013 в 11:00)   личное сообщение
 
 

Ай спасибо! Поднялся еще на одну ступеньку.

  Ответить  
 
 автор: Гоблин   (17.02.2013 в 10:06)   личное сообщение
 
 

Стоп. Йожык, это случаем не мой ли предыдущий вопрос? Использовать не самодельный контекст из макросов, а коммандбар, что бы эти макросы избежать...
Че-та рассмотрел внимательнее твой код, пока не допер как в моем случае быть. Плиз немного подробнее о том что вижу.
Этот контекст для формы. Мне же нужно обрабатывать таблу через список. Удалить, изменить и т.д.

  Ответить  
 
 автор: Йожык   (18.02.2013 в 00:35)   личное сообщение
 
 

Ответ ли это на твой вопрос - не знаю.
Пример, который я привел - у меня работает в табличной форме и, кроме того, только в одном поле. По остальным полям выскакивает стандартное контекстное меню.
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

  Ответить  
 
 автор: Гоблин   (18.02.2013 в 08:46)   личное сообщение
 
 

Спасибо. Но это слишком глобально. Мне бы просто с контекстом справиться, что бы для каждого элемента на форме свой был. Хорошо бы кодом прописать, а не макросом. Но вот это и не получается.
На счет обновлений - идеи однако, шаманские.

  Ответить  
 
 автор: Gыwи   (21.02.2013 в 10:46)   личное сообщение
 
 

шайтанама!

Йож, жжошь!

  Ответить  
 
 автор: Йожык   (22.02.2013 в 14:58)   личное сообщение
 
 

С наступающим!

  Ответить  
 
 автор: Йожык   (19.02.2013 в 11:40)   личное сообщение
 
 

Ответ:

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


Можно вешать на открытие формы.
На закрытие - наверно, следует возвращать отъенебленное. Удачи
Можно узнавать имя комьпютера или пользователя на запуске базы... Да чего я, разберешься ;)
ЗЫ если англоязычная - можно универсально обращаться к индексу контрола.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList