|
|
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
To [Лох Позорный ] Про пальчики и название топика 1. добавляешь в проект модуль класса, например clsFormMode следующего содержания: ----------------- Option Explicit Private currentMode As Long 'текущий режим Private prevMode As Long 'предыдущий режим Event ViewModeChanged(prevMode As Long, currentMode As Long) Property Let setViewMode(tMode As Long) If currentMode <> tMode Then prevMode = currentMode currentMode = tMode 'испускаем событие об изменении режима просмотра RaiseEvent ViewModeChanged(prevMode, currentMode) End If End Property Private Sub Class_Initialize() currentMode = -1 ' тут по желанию - (-1) для желающих отловить загрузку prevMode = -1 End Sub ----------------- 2. Далее в модуле любимой формы 2.а) объявляешь прерменную Private WithEvents myModeRaiser As clsFormMode 2.б) оформляешь OnTimer: Private Sub Form_Timer() myModeRaiser.setViewMode = Me.CurrentView End Sub 2.в) подписываешься на события любимого класса Private Sub myModeRaiser_ViewModeChanged(prevMode As Long, currentMode As Long) 'ЭТО МЕСТО ОТЛОВА 'Тут любимые действия при смене режима MsgBox "Было:" & CStr(prevMode) & " Стало:" & CStr(currentMode) End Sub 2.с) Не забыть выставить частоту TimerInterval в любимое значение ------------------------------------------------------ 3) Можно оправиться и покурить. С Приветом, Виктоша ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 17:20:14 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
Если уж делать модуль класса - то логично в нем и ловить событие Timer от формы. Это так, к слову о пальчиках. И все равно получается не обработка переключения, а периодическая проверка текущего режима. Разница все-таки есть. Это к слову о названии топика. З.Ы. В 97-м такая конструкция не заработает. Не умеет 97-й RaiseEvent делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 17:48:34 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
ЛППонимаю, что вопрос запрещенный, но все-таки - зачем это понадобилось? Просто интересно. Дык, сделал как-то пользователям форму - в режиме формы вводятся данные, переключаемся в табличный вид, работает удобственный поиск, а-ля Alt-буква в нортоне, только без Alt. Им это зело понравилось, поэтому сейчас приходится так делать все новые формы. Причем в табличном виде добавление/изменение запрещено. Не помню почему, возможно, именно по названной Сергеем Гавриловым причине, но пришлось идти по пути написания специальных кнопок панелей и пунктов меню. А это неудобно. 2 Victosha ОнКуррент - хорошо, но не всегда работает. Таймер - неплохо, но прежде, чем он заметит переключение режима, пользователь может успеть на что-то нажать, и изменения записи либо не произойдут, когда нужно, либо наоборот. Модуль класса - на этапе разработки, во всяком случае, очень плохо. Любая неотловленная ошибка - он от формы "отваливается", а иногда после нескольких раз глючит сам акцесс... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 18:07:49 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
To [Лох Позорный ] Да, в 97м ЭТО (RaiseEvent) не сработает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 18:09:43 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
Geo, и часто у тебя бывает подобное сочетание параметров? Пустой источник данных + запрет на добавление? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 18:12:49 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
2Темный Запрет на удаление/изменение - при каждом запуске формы, и при переходе в табличный режим. Формы без записей тоже бывают. Люди ж еще фильтрами пользуются... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 18:17:51 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
удаление, изменение и все? Или все-таки еще и добавление? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 18:31:17 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
2 Гео А не проще ли тебе сделать две независимые (под)формы? Одна для ввода данных, в режиме обычной формы, другая (табличная) для просмотра уже введенных с пушистым поиском будет болтаться в примечании. Имхо конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 19:18:47 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
To [Geo] В обчем, на сабклассинг потихонечку... [тут почикано....] >Таймер - неплохо, но прежде, чем он заметит переключение режима, > пользователь может успеть на что-то нажать, и изменения записи либо не > произойдут, когда нужно, либо наоборот. Это от частоты зависит > Модуль класса - на этапе разработки, во всяком случае, очень плохо. > Любая неотловленная ошибка - он от формы "отваливается", а иногда после > нескольких раз глючит сам акцесс Ошибки - отдельно, глючит - отдельно... Ну да - в тех трех притопах, что я изобрАзить пытался не хватает инициализации и освобождения... Из заявленных требований следует примерно вот что - A) либо городить огород с состояниями формы (через клиентский класс) городить - это пробовать надо и вряд ли читаемо в итоге будет. Типа нет записей - включаем таймер, обнаружились - отключаем и ждем Текущую... Б) Создать и подвязать к форме самодельное popup - меню c нужными кнопками, если недостаточно, то еще и обычное меню, обвязать все это классом а-ля см ранее, с нужным к-вом Private WithEvents tControl as Office.CommandButton ... etc После чего ловить Click от tControl и распоряжаться им по своему усмотрению Может кто чего лучше предложит? С уважением ко Всем, Виктоша ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 19:42:12 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
У меня классное предложение! Забить и оставить как есть! Кому это неудобно? Пользователям? А что лучше: жмакнуть на кнопочку с выпадающим списком или жмакнуть на отдельную кнопку, которая включит нужный режим? Вопрос риторический... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 19:53:43 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
Тема, как будто, закрыта, потому заранее извиняюсь сразу перед всеми. Из того класса (выше по флейму) , пока получилась вот такая штука: Модуль класса (clsFormMode) Option Compare Database Option Explicit Private Const CSEP As String = "[Event Procedure]" Private Const CDEFTIMERINT As Long = 300 ' Private currentMode As Long ' Private prevMode As Long ' Private WithEvents tForm As Form ' форма, за которой следим Private sourceTimerInt As Long ' исходный интервал таймера в форме Event ViewModeChanged(prevMode As Long, currentMode As Long) Sub Init(uForm As Form) On Error Resume Next Set tForm = uForm With tForm 'Подписка на события формы sourceTimerInt = .TimerInterval .OnCurrent = CSEP .OnApplyFilter = CSEP 'считываем стартовый режим setViewMode = .CurrentView ' End With SetTimer 'Просто установим таймер - ,ближайший Current его выключит End Sub Private Sub SetTimer() ' включает "свой" таймер On Error Resume Next If sourceTimerInt = 0 Or sourceTimerInt > CDEFTIMERINT Then tForm.TimerInterval = CDEFTIMERINT End If tForm.OnTimer = CSEP End Sub Private Sub ClearTimer() 'Отписываемся от таймера On Error Resume Next With tForm .OnTimer = vbNullString .TimerInterval = sourceTimerInt ' End With End Sub Private Property Let setViewMode(tMode As Long) ' If currentMode <> tMode Then prevMode = currentMode currentMode = tMode RaiseEvent ViewModeChanged(prevMode, currentMode) End If End Property Private Sub Class_Initialize() currentMode = -1 prevMode = -1 End Sub Private Sub Class_Terminate() Call Terminate End Sub Private Sub tForm_ApplyFilter(Cancel As Integer, ApplyType As Integer) 'события происходит до фактической смены источника, ' не знаем, будут ли записи - включаем таймер SetTimer End Sub Private Sub tForm_Current() 'если сюда попали - таймер точно не нужен ClearTimer setViewMode = tForm.CurrentView End Sub Private Sub tForm_Timer() ' здесь оказываемся только при пустом источнике setViewMode = tForm.CurrentView End Sub Private Sub Terminate() 'финальная очистка ClearTimer Set tForm = Nothing End Sub '-------------------------------------------------- Далее в форме: Private WithEvents oV As clsFormMode Private Sub Form_Close() Set oV = Nothing End Sub Private Sub Form_Load() Set oV = New clsFormMode oV.Init Me End Sub Private Sub oV_ViewModeChanged(prevMode As Long, currentMode As Long) MsgBox "Было: " & CStr(prevMode) & " Стало:" & CStr(currentMode) End Sub '------------------------------------------ Плюсы - работает, и выглядит не настолько уродливо, как мне поначалу казалось. Минусы - переопределяет таймер, тем самым создает проблему протокола его совместного использования, если форма (или другой управляющий ею класс ) сама подписана на таймер. Например, если форма "по таймеру" желает посылать почтовый привет администратору, - может получиться не здорово сразу для всех. Виктоша. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2004, 04:55:46 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, но почему "Минусы - переопределяет таймер"? Если форма сама обрабатывает это событие - то сначала вызовется обработчик твоего класса, потом обработчик формы. Проверять лениво, но вроде должно быть так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2004, 15:05:05 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
To [Лох Позорный] >Если форма сама обрабатывает это событие - то сначала вызовется >обработчик твоего класса, потом обработчик формы. >Проверять лениво, но вроде должно быть так. Так и будет. В этом и проблема. В общем случае это не только проблема таймера, но с ним она "яснее". Таймер выделяется среди прочих событий своей "чужеродностью". По отношению к прочим событиям слушатели пассивны. От них (Слушателей) не зависит - произойдут ожидаемые события или нет. По отношению к таким событиям слушатели изначально равноправны и должны делиться чем и как умеют. Таймер - по существу ресурс (в данном случае совместно используемый). По отношению к таймеру - МОЖНО ЗАДАВАТЬ ТЕМП. Это значит, что он МОЖЕТ нести в себе ЗАДАЧНЫЕ активности типа "Прочитать" файлик с ftp, опубликовать что-либо в web, статус формы почитать и т.д. - Всякие РЕГЛАМЕНТНЫЕ действия навесить, происходящие по расписанию. Алгоритмические активности, если есть такое слово. Но, поскольку, физически в каждый данный момент ОН (таймер) один (если не лезть в WIN API), то возникает тема ПРОТОКОЛА СОВМЕСТНОГО ИСПОЛЬЗОВАНИЯ ОБЩЕГО ресурса. В принципе "пару строчек" поменять в том коде, НО. Тогда возникает Таймер С Договором О Правилах Его Использования. По причине потенциального наличия множества РЕГЛАМЕНТОВ, требующих СВОЕГО темпа течения времени. Пока шибко некогда, но, кажется, что к кнопкам привязаться и правильнее и красившЕЕ во ВСЕХ отношениях. Может выберу ... Виктоша ЗЫ Пардону за многословие... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2004, 16:21:35 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
2Victosha >физически в каждый данный момент ОН (таймер) один (если не лезть в WIN API), а хоть и лезть в Win API - все-равно будет 1 таймер на 1 hwnd. Но это так - к слову. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2004, 16:44:12 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
забираю свои слова назад :( Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2004, 16:55:50 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
To [Senin Viktor] Вообще-то это уже чуть другая тема, да и в таймерах я не силен. Но. Не вполне я уверен в правоте собственных утверждений вообще, даже по отношению к Access, поскольку все это умственно. А про таймеры в частности - я имел в виду NT-евые waitable timers. Сходу не видно, почему их не может быть больше одного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2004, 17:08:03 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
Может быть это еще кому-то интересно... 1) Ставим ссылку на библиотеку Office 2) Создаем форму Модуль класса формы: Option Compare Database Option Explicit 'кнопка перейти к виду формы Private WithEvents toFormVBtn As Office.CommandBarButton 'кнопка перйти к виду таблицы Private WithEvents toTblVBtn As Office.CommandBarButton Private Sub findButtons() 'процедура привязки к стандартым кнопкам смена вида формы 'идентификаторы взяты для officeXP 'для 2000 идентификаторы не проверял Set toFormVBtn = CommandBars.FindControl(Id:=502) Set toTblVBtn = CommandBars.FindControl(Id:=498) End Sub Private Sub ClearButtons() 'отвязка от кнопок Set toFormVBtn = Nothing Set toTblVBtn = Nothing End Sub Private Sub Form_Close() 'при закрытии формы отвяжем кнопки Call ClearButtons End Sub Private Sub Form_Load() 'при загрузке формы подвяжем кнопки. Call findButtons End Sub Private Sub toFormVBtn_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) 'Собственно перехват нажатия кнопки прехода к виду формы MsgBox "Нажата кнопка - Прейти к виду формы" End Sub Private Sub toTblVBtn_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) 'аналогично для кгопки "перейти к табличному виду" MsgBox "Нажата кнопка - перейти к виду таблицы" End Sub 3) Вот, собственно, и все. ------------------------------------------------- Обсуждение А) Мне это нравится гораздо больше чем все предыдущее. Б) Полной уверенности в надежности все-таки нет. См. замечания Geo по поводу "отваливающихся" переменных класса. В моей практике наблюдалась специфическая подкрутка этой проблемы, связанная с потерей указателей на свойства и методы OLE-объекта при подъеме приложения из свопа. Будут ли замечания или комментиарии? С Уважением, Виктоша ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2004, 21:41:24 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
Круто! Замечание - таким образом не определить, в каком режиме форма была изначально открыта. Конечно же это лечится проверкой режима собственно при открытии. Также не отследить программную смену режима, придется не забывать при каждой такой программной смене выполнять нужные действия. Жалко, что нет у формы соответствующего события. Было б событие - не было б этих геморроев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2004, 22:30:04 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
Это далеко не "универсальный" сбособ, т.к. переключение режима может производиться - через меню; - через специальные кнопки в "своих" панелях инструментов; - кнопками на форме; - макросами autokeys или др. В общем-то мысль интересная, но, коль скоро задача простыми и качественными способами не решается, не забивай голову, я ее с другой стороны обойду. Сейчас я пользуюсь private sub form_dirty(...) if me.currentview<>1 then ... Не очень удобно, с одной стороны. С другой - в некоторых формах хочется по изменению режима отображения что-то делать с полями (например, менять источник данных (controlsource)), но бог с ним, буду дальше ручками для каждой такой формы рисовать панели. Спасибо большое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2004, 01:51:44 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
To [Лох Позорный], [Geo] Ok Спасибо, Пардону за назойливость... -) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2004, 02:52:21 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
2 Гео Это далеко не "универсальный" сбособ... Разумеется. "Универсальный" способ - это событие у формы. Все остальное - от лукавого. Если события нет - то его нет, как ни крути. переключение режима может производиться - через меню; - через специальные кнопки в "своих" панелях инструментов; - кнопками на форме; - макросами autokeys Через меню, контестные меню и стандартные кнопки в тулбарах - решение Виктоши. В общем-то единственная проблема была - отловить именно эти, неотлавливаемые по другому события. А свои кнопки, макросы, и прочее программистское словоблудие - в программистском словоблудии и выполняй всю работу. Это требует написания всего одной функции по переключению режимов. но лучше бы было событие 2 Виктоша Еще раз сенькс. В смысле - круто. Приятное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2004, 04:12:13 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
Поначалу на замечания возникла такая реакция - скомбинировать 1) и 2) Однако ( почесав в затылке) предложение 2) (с подвязанными кнопками) (почти) снимается (то есть совсем сырец...). Хотя мне оно определенно нравится возможностью отменить нажатие кнопки, что вносит доп. уровень управления. Доп. причина для снятия - возможно, кнопок должно быть больше - надо на контекстных меню еще поискать по вложенным формам... предложение с тем, что было названо clsFormMode во первых, покрывает заказанные потребности не требуя динамических связей с доп. библиотеками, и, в этом смысле, оно "круче". И, хотя подвязка к таймеру, на мой взгляд, не вполне эстетична, все-таки приемлема, с учетом вариантов обхода проблем (если они - проблемы - есть в конкретном случае). Про обходы - второй вариант - б) слушать таймер ДРУГОЙ формы - это совсем просто. Рассказ о том, что что-то в Dirty проверяется значит только одно - реальные потребности существенно уже "спектра возможностей". Это больше похоже не на отлов переключений, а косвенное выполнение действий скрытых в режиме таблицы кнопок. Для меня любобытно вот что - я не первый день, как будто, в клавиши тюкаю, а вот не возникало у меня потребности - видимо, в консерватории что-то править надо. Для начала научиться морды в топики вставлять. -) С Уважением, Виктоша ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2004, 04:54:10 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
Вот у меня та же проблемма. Нужно отловить переключение, но не знаю как. Потому что был у меня такой случай: пользователь нечаяно нажал Ctrl + > и форма вышла из текущего режима. Это всё! Конец работе! А что делать? Поискал на форуме решение, вроде не нашел. Вот решил возобновить чужой вопрос, может за пол-года какое-нибудь решение нашлось все-таки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2004, 13:40:30 |
|
||
|
Можно отловить переключение режима отображения формы таблица/простая форма?
|
|||
|---|---|---|---|
|
#18+
пользователь нечаяно нажал Ctrl + > и форма вышла из текущего режима. Это всё! Конец работе! Мизантропичные варианты: Оторвать программисту руки - за то, что не запретил переход формы в другие режимы Оторвать пользователю руки и пришить вместо них ноги - чтоб не кликал куда не попадя Чуть менее мизантропичный вариант: Оствить пользователю руки и ноги, но выломать из клавиатуры Ctrl ---------------------------------------------------------------------------------------- Поискал на форуме решение, вроде не нашел Кто здесь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2004, 13:48:26 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32579457&tid=1673376]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 346ms |

| 0 / 0 |
