Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Как узнать открыто меню или нет ?  [new]
nukri
Member

Откуда: Москва
Сообщений: 392
В общем делаю себе динамическое меню ... но хотелосб бы узнать, как проверять открыто оно или нет ... и если да то удалять ...
13 авг 04, 01:22    [878911]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Galustov
Member

Откуда:
Сообщений: 369
В каком смысле "открыто или нет"? Меню какого типа: как стандартное вверху или контекстное?
по-подробнее опиши
13 авг 04, 06:42    [878963]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Hummer
Member

Откуда:
Сообщений: 2583
' проверка на существование указанного меню
Public Function IsExistCB(Optional cbname As String) As Boolean
Const ERR_CMDBAR_EXISTS   As Long = 5
Dim strname As String
On Error GoTo MyError
strname = CommandBars(cbname).Name
MyError:
If err = ERR_CMDBAR_EXISTS Then
    IsExistCB = False
ElseIf err <> 0 Then
    IsExistCB = False
    MSGBOX "Ошибка: " & err.Number & err.Description, vbCritical, "Внимание!"
Else
    IsExistCB = True
End If
End Function
13 авг 04, 09:12    [879089]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Иван FXS
Member

Откуда:
Сообщений: 2092
А не грубовато ли это - поминать имя ... сорри, "дергать" Error?

У меня для таких дел прикопана специальная функция-утилитка:
Public Function Seek_Name_in_Collection(c, Name As String) As Object
     Dim x As Object
For Each x In c
      If x.Name = Name Then
        Set Seek_Name_in_Collection = x
        GoTo End_SFP
    End If
Next
Set Seek_Name_in_Collection = Nothing
End_SFP: End Function
- понятно дело, если имена элементов колекции "называются" почем-то не ".Name", - она не поможет ...
13 авг 04, 09:34    [879122]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
nukri
Member

Откуда: Москва
Сообщений: 392
Подробнее

У меня открываются разные - верхние меню (сделаные мною программно) - в зависимости от того, какой пользователь вошел в систему.

Вот и хочу сделать так, что при смене юзера (это дело у меня уже сделано), я программа удаляла все меню сделанные предыдущим и строила новое в зависимости от прав юзера ...
Спасибо
13 авг 04, 09:46    [879152]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Hummer
Member

Откуда:
Сообщений: 2583
Ну так имена известны? - Какие проблемы удалять.

2 Иван FXS
Уважаемый - перебор элементов по коллекции не есть быстрое решение:) Слышали про конструкцию try catch что-нибудь?:)
13 авг 04, 09:47    [879157]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
nukri
Member

Откуда: Москва
Сообщений: 392
Через Error я сделал ... но как-то грубовато получается

вот такую функцию ...типа

if Менюшка1.isLoaded then ....

Или я много хочу )
13 авг 04, 09:50    [879165]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Hummer
Member

Откуда:
Сообщений: 2583
Ну ёбтыть - если не нравится быстрый способ НОРМАЛЬНОЙ проверки объекта на существование - переберайте всю коллекцию.

Что значит менюшка загружена????
Это объект Access - такой же, как и таблицы к примеру.
Можно его сделать темповым - тогда при выходе он будет удалён. Вы же не говорите - таблица загружена - говорите - существует.
13 авг 04, 09:56    [879177]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Иван FXS
Member

Откуда:
Сообщений: 2092
Hummer
Слышали про конструкцию try catch что-нибудь?:)

- слышал ... кажется ... только ... не в Аццессе и не в VBA :-(
13 авг 04, 10:46    [879427]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Иван FXS
Member

Откуда:
Сообщений: 2092
Hummer
перебор элементов по коллекции не есть быстрое решение:)
- а почему, кстати оно "не быстрое"? Их что, надо куда-то при этом загружать (куда они итак уже не загружены) ... чтобы у каждого проверить СВОЙСТВО (.Name)??
13 авг 04, 10:49    [879437]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Hummer
Member

Откуда:
Сообщений: 2583
2 Иван FXS
Ну и что? Генерация определённой ошибки в Аксесе и её отлов - есть не что иное, как эта же самая конструкция. Почему это грубое решение?

Ну раз не нарвится, давайте медленно так ползать по коллекциям.
13 авг 04, 10:50    [879441]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Hummer
Member

Откуда:
Сообщений: 2583
2 Иван FXS
Поймите, вы организуете цикл скажем по 100 элементам и только у 99-го это свойство совпадёт - это что, быстро?
Я просто генерю ошибку и её отлавливаю - поймал - нет объекта, нет ошибки есть объект - побыстрее будет, не так ли?:)
13 авг 04, 10:53    [879451]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
nukri
Member

Откуда: Москва
Сообщений: 392
А есть команда VBA, которая закрывает все открытые меню ?
14 авг 04, 11:27    [881950]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Иван FXS
Member

Откуда:
Сообщений: 2092
Hummer
2 Иван FXS
Поймите, вы организуете цикл скажем по 100 элементам и только у 99-го это свойство совпадёт - это что, быстро?
Я просто генерю ошибку ...

- очлюбопытно ... а СИСТЕМА - чтобы обнаружить, что Вы "сгенерили ошибку" - разве не будет "организовывать цикл скажем по 100 элементам"?

И вообще ... быстрота, говорят, нужна только при ловле блох ...

Ваша конструкция НЕКРАСИВА, поскольку использует on error НЕ ПО НАЗНАЧЕНИЮ!
14 авг 04, 21:23    [882298]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Иван FXS
Ваша конструкция НЕКРАСИВА, поскольку использует on error НЕ ПО НАЗНАЧЕНИЮ!

Ну и что, что не по назначению? Есть множество решений разных задач, которые можно признать красивыми и элегантными именно потому, что они используют что-нибудь не по назначению.
14 авг 04, 21:28    [882305]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Hummer
Member

Откуда:
Сообщений: 2583
2 Иван FXS
Это почему не по назначению-то?:)
А какое у неё назначение?:)

Книжки умные почитайте, прежде чем что-то кому-то доказывать:)
15 авг 04, 15:08    [882595]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
xax_nv
Member

Откуда: Нижневартовск
Сообщений: 928
IMHO вы забыли про того, кто задал вопрос.
15 авг 04, 17:55    [882744]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
автор
Ваша конструкция НЕКРАСИВА, поскольку использует on error НЕ ПО НАЗНАЧЕНИЮ!


а мне понравился вариант "дергать за ошибку"

проверяешь только то что нада.
15 авг 04, 20:04    [882898]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
nukri
У меня открываются разные - верхние меню (сделаные мною программно) - в зависимости от того, какой пользователь вошел в систему.

Вот и хочу сделать так, что при смене юзера (это дело у меня уже сделано), я программа удаляла все меню сделанные предыдущим и строила новое в зависимости от прав юзера ...

А меню всегда строятся автоматически? Или юзер имеет возможность своими действиями строить меню по своему желанию? Если первое, то я бы строил все меню сам (на этапе создания mdb), а юзер при входе получал бы часть меню в невидимом виде в зависимости от его прав.

Нехорошо это - создавать объекты в файле во время работы программы... Во-первых, файл растет. Во-вторых, мультиюзерство не получится. Во-вторых, на mde не перейти.
15 авг 04, 21:28    [882934]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
nukri
Member

Откуда: Москва
Сообщений: 392
В общем на каждую смену юзера я делаю

Sub УдалитьВсеПанели()
Dim bar As Object
For Each bar In CommandBars
If (bar.BuiltIn = False) And (bar.Visible = True) Then
bar.Delete
End If
Next bar
End Sub

А потом открываю ему все, что нужно ....
15 авг 04, 22:38    [882952]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Hummer
Member

Откуда:
Сообщений: 2583
2 Владимир Саныч
Динамичекси созданное меню незначительно увеличивает размер фалй и распрекрасно работает в мде/аде.
Например, есть несколько ролей по функциональным группам пользователей в зависимости от должностей или положения в организации - описываем для каждого главное меню программы (в табличках) и строим табличку соответсвия ролей и меню. Всё, при входе идентифицируем пользователя и выдаём меню его группы.
15 авг 04, 22:56    [882960]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
nukri
Member

Откуда: Москва
Сообщений: 392
Hummer
2 Владимир Саныч
Динамичекси созданное меню незначительно увеличивает размер фалй и распрекрасно работает в мде/аде.
Например, есть несколько ролей по функциональным группам пользователей в зависимости от должностей или положения в организации - описываем для каждого главное меню программы (в табличках) и строим табличку соответсвия ролей и меню. Всё, при входе идентифицируем пользователя и выдаём меню его группы.



Именно так я и делал.
15 авг 04, 22:58    [882961]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
Hummer
Member

Откуда:
Сообщений: 2583
2 nukri
Ну и в чём проблема с удалением-то?
Зачем при каждой смене юзера удалть?:) Вы просто для КАЖДОГО юзера запускайте своего клиента.
15 авг 04, 23:16    [882968]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать открыто меню или нет ?  [new]
nukri
Member

Откуда: Москва
Сообщений: 392
Hummer
2 nukri
Ну и в чём проблема с удалением-то?
Зачем при каждой смене юзера удалть?:) Вы просто для КАЖДОГО юзера запускайте своего клиента.


Дело в том, что сидя за машиной один диспетчер может сменить другого ... и ему незачем запускать своего клиента ... просто нужно сменить ему панель ...
А самый простой способ не думать долго какие панели были запущены предыдущим клиентом - просто удалить все и построить все заново ...

можете быть ... это и "тупо в лоб" но следить за каждым открытым меню дольше ...

ИМХО

В любом случае Всем спасибо за советы!
16 авг 04, 00:09    [882977]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить