Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
Помогите с кодом. Нужно, чтобы была проверка на внесенные изменения перед закрытием или отменой формы (форма для ввода данных) и выдавать окно сообщения сохранить изменения: да/нет/отмена, если юзер нажал:
1) закрыть форму - кнопка «X» на форме.
2) по привычке на Esc.
Не могу никак справиться с событиями: «Form_BeforeUpdate», «Form_Undo», «Form_Unload» - состояние "Me.Dirty" получается словно морковка, привязанная впереди у ослика.

И это еще только при том учете, если юзер заполнил форму как надо - без повторяющихся значений в полях, что тоже не знаю как заранее вынести на проверку, чтобы форма не уходила с записи и позволяла юзеру дать возможность исправить за собой ошибку.

Код пытаюсь использовать такой:
+

Dim intClose As Integer '1-да(сохраняем данные при закрытии), 2-нет(отмена изменений при закрытии), 3-отмена(режим ожидания)
Dim intEsc As Integer '1-да(сохраняем изменения), 2-нет(отмена изменений), 3-отмена(режим ожидания)
'------------------------------------------------
Private Sub Form_BeforeUpdate(Cancel As Integer)
  Dim ctrl As control

  Set ctrl = Screen.ActiveControl

  If Me.Dirty = True Then 'если были внесены изменения
    Select Case MsgBox("Сохранить изменения?", vbYesNoCancel + vbQuestion, "Info. Form_BeforeUpdate")
      Case vbYes 'сохранение изменений
        If ПроверкаНаЗаполнение = True Then 'если все ок
          intClose = 1
        Else 'если косяк, стоим на месте в режиме ожидания исправлений
          intClose = 3
        End If

      Case vbNo 'отмена изменений - как тут правильно сделать отмену???
        intEsc = 2
        intClose = 2
        Me.Undo
'        Me.Dirty = False

      Case vbCancel 'режим ожидания
        intClose = 3
        Cancel = False
        ctrl.SetFocus
        Me.Dirty = True
        ctrl.SetFocus
    End Select

End Sub
'------------------------------------------------
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  Dim ctrl As control
  
  Set ctrl = Screen.ActiveControl
  
  Select Case KeyCode
    ...
    Case vbKeyEscape
      If Me.Dirty = True Then
        Select Case MsgBox("Сохранить изменения?", vbYesNoCancel + vbQuestion, "Info. Form_KeyDown")
          Case vbYes 'сохранение изменений
            If ПроверкаНаЗаполнение = True Then 'если все ок
              intEsc = 1
            Else
              intEsc = 3
            End If

          Case vbNo 'отмена изменений
            intEsc = 2
            Me.Undo
'            Me.Dirty = False

          Case vbCancel 'режим ожидания
            intEsc = 3
            ctrl.SetFocus
            Me.Dirty = True
            ctrl.SetFocus
        End Select
      Else
        DoCmd.Close acForm, Me.Name, acSaveNo
      End If
  End Select

End Sub
'------------------------------------------------
Private Sub Form_Undo(Cancel As Integer)

  Select Case intEsc
    Case 1
      If (ПроверкаНаЗаполнение = True) Then 'если все ок
        DoCmd.RunCommand acCmdSaveRecord
        ...
      Else 'остаться на текущей записи и исправить запись
        Cancel = True
      End If

    Case 2 'отмена изменений
      Cancel = False

    Case 3 'остаться на текущей записи
      Cancel = True
  End Select

End Sub
'------------------------------------------------
Private Sub Form_Unload(Cancel As Integer)
  Dim ctrl As control

  Set ctrl = Screen.PreviousControl
  
  Select Case intClose
    Case 1 'сохранение изменений
      Cancel = False

    Case 2 'отмена изменений - как тут сделать отмену изменений???
      Cancel = False

    Case 3 'режим ожидания
      Cancel = True
      ctrl.SetFocus
      Me.Dirty = True
      ctrl.SetFocus
'    Case Else
'      Cancel = False
  End Select
  
End Sub


В общем без помощи опытных мне не справиться.
31 июл 17, 22:11    [20689694]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4664
nataxa23,
не понял зачем кнопка "отмена"
а прочие Ваши "хотелки" не понимаю (если Вы не сохраняете изменения происходит отмена.Проверку полей производите на BeforeUpdate соответствующих полей с отменой события при нарушении валидности-курсор остается в поле пока не будут внесены корректные данные )
Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.Dirty = True Then
    Dim intResponse As Integer
    intResponse = MsgBox("данные изменились,сохранить?", vbYesNo, "заголовок окна")
        If intResponse = vbNo Then
            Cancel = True
            Me.Undo
        End If
    End If
End Sub
31 июл 17, 23:20    [20689773]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
sdku
не понял зачем кнопка "отмена"

На форме нет никакой кнопки "отмена", а вот на клавиатуре привычная клавиша «Esc» есть. Поэтому я использую "vbKeyEscape" в событии «Form_KeyDown», чтобы отловить попытку отмены данных.
Прежде, чем делать отмену хорошо бы предварительно выдавать запрос о сохранении данных, если таковые юзер начал вносить и по какой то причине нажал Esc.
sdku
а прочие Ваши "хотелки" не понимаю

Закрытие формы - кнопка «X» на форме - аналогичная тема, если были изменения, перед закрытием формы сделать запрос юзеру хочет ли он их сохранить:
1) да - если хочет.
2) нет - если не хочет, то закрыть без сохранения.
3) отмена - форма стоит в режиме ожидания дальнейших действий юзера.

По моему это самая обычная рядовая ситуация!?!
1 авг 17, 20:48    [20692912]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4664
nataxa23
...Закрытие формы - кнопка «X» на форме - аналогичная тема, если были изменения, перед закрытием формы сделать запрос юзеру хочет ли он их сохранить:..
Приведенная выше процедура, каким бы способом Вы не закрывали форму,выдаст запрос на сохранение изменений, если они были.
2 авг 17, 00:04    [20693257]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4664
вдогонку:создайте программу,которой сможет пользоваться даже дурак, и только он будет ей пользоваться. Если редактирование формы не закончено зачем её закрывать???? И вообще зачем редактировать,кому не попадя, сохранённые записи, лишаясь честной истории и нарушая, вплоть до краха, работоспособность БД ??
2 авг 17, 00:21    [20693278]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 123
обычно создается временная таблица, в которую переносятся данные которые нужно изменить, в форме обрабатываются данные из этой таблицы и обрабатывается только операция сохранения при закрытии формы (корректно измененные/добавленные данные (после проверки естественно) переносятся уже в основные таблицы).
2 авг 17, 12:35    [20694595]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
sdku
Приведенная выше процедура, каким бы способом Вы не закрывали форму,выдаст запрос на сохранение изменений, если они были.

Если убрать весь приведенный мной код к форме и использовать Ваш пример, то в сообщении о сохранении данных при выборе "не сохранять", последовательно уже выдается стандартное сообщение об ошибке от аксеса о невозможности сохранить запись:
Картинка с другого сайта.
Т.е. он все равно пытается сохранить данные, даже при условии, что был применен Me.Undo. На мой взгляд это действительно ошибка и она логична, потому что это получается уже попытка сохранить пустую запись. Мне нужно, чтобы при выборе "не сохранять" форма закрывалась так как если бы юзер ничего не вводил изначально (ну мало ли - передумал в конце концов и закрыл форму), т.е. отменить все что было введено, чтобы форма при закрытии не орала как дура тупая.

И потом, если после моего сообщения сразу вылазит стандартное сообщение акса как на скриншоте, то мое предварительное сообщение о сохранении из Вашего примера получается "не в кассу", согласитесь.

sdku
вдогонку:создайте программу,которой сможет пользоваться даже дурак, и только он будет ей пользоваться.

Не понятен Ваш совет. Если Вы можете что то предложить дайте пожалуйста конкретный пример.

sdku
Если редактирование формы не закончено зачем её закрывать????

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

Я не утверждаю, что выложенный мой код оптимальный, я пытаюсь найти способ и сделать возможность направлять юзера при работе с формой делать выбор, что ему нужно, если он нажал закрыть или же клавишу Esc, но данные при этом еще не сохранил.
Кстати Ваш пример на клавишу Esc не реагирует. Каким образом тогда с этим быть?

Я не знаю как Вы, но я много и часто сталкивалась с юзерами, которые тыкают мышкой без разбору, а потом начинают жаловаться, что якобы программа работает неправильно. Именно для этого, на мой взгляд, необходимо выдавать юзеру соответствующий запрос, чтобы программа выполняла требования согласно выбору юзера, а именно, если на форме были изменения и юзер их не сохранил - вначале выдать запрос о сохранении.
Я в общем то не пытаюсь изменить концепцию креста на форме и клавиши Esc для отмены заполненных полей. Я пытаюсь сделать предварительный запрос на продолжение соответствующих действий в зависимости от того, что выберет юзер.
В случае, когда юзер нажал "X" на форме для закрытия формы выдать запрос о сохранении изменений, если они были внесены:
1) если да - сохранить и закрыть форму.
2) если нет - вертать все в зад и закрыть форму.
3) отмена - форма в режиме ожидания. В случае, если юзер хочет продолжить работать с записью дальше.

В случае, когда юзер нажал "Esc" выдать запрос о сохранении изменений, если они были внесены:
1) если да - просто сохранить.
2) если нет - вертать все в зад.
3) отмена - форма в режиме ожидания.

sdku
И вообще зачем редактировать,кому не попадя, сохранённые записи, лишаясь честной истории и нарушая, вплоть до краха, работоспособность БД ??

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

И напоследок еще что мне не понятно, Вы советуете:
sdku
Проверку полей производите на BeforeUpdate соответствующих полей

но, когда я в «Form_BeforeUpdate» вызываю свою процедуру по проверке на пустые поля, отлавливаю их и выдаю сразу юзеру сообщение об этом, то по возврату обратно и уже завершению BeforeUpdate аксес все равно выдает мне ошибку. В итоге получается, что мое сообщение для юзера срабатывает преждевременно, затем аксес возмущается уже своим сообщением. В этом случае я не понимаю как правильно осуществляется обработка ошибок?
2 авг 17, 14:01    [20694927]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4664
nataxa23,

К сообщению приложен файл (tmp2.rar - 18Kb) cкачать
2 авг 17, 16:50    [20695605]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4664
nataxa23
....Если бы все юзеры были роботами и выполняли строго определенные движения при работе, программистам много чего не пришлось бы продумывать... и тогда код был бы значительнее проще..
Все косяки юзверей предусмотреть (предугадать-самых светлых мозгов не хватит) не возможно в принципе, и задачу разработчика,я лично, вижу в том,чтоб не позволить ввести не корректные данные (а для этого достаточно встроенных средств АКСА условий на значение,маски ввода или собственных проверок в коде-пусть юзвери изобретают сотни новых косяков)
2 авг 17, 17:10    [20695679]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
sdku,
спасибо за пример, но в нем я не вижу, чтобы форма так же предварительно реагировала на клавишу Esc - это первое.
Второе - сообщение акса как на моем же скриншоте у Вас так же выводится после того как в сообщении о сохранении изменений выбираешь "нет", даже при условии, что все поля заполнены и заполнены как было нужно. Это то, о чем писала в посте выше.
Я не вижу тогда в Вашем случае смысла вообще выводить юзеру свое сообщение о сохранении изменений, если при пользовательском отказе сохранять данные, будет выводиться данное аксовское назойливое сообщение. Это бессмыслица какая то.
Больше того, если первое поле пройти мимо и ничего не заполнять а заполнить только второе, форма при выводе сообщение о сохранении данных в Вашем примере если выбирать "да", сохраняет запись как ни в чем не бывало, что является косяком.
Самое обидное для меня в Вашем примере - это то, что нет возможности сделать приостановление закрытия формы, если понимаешь, что где то что то пропустил при заполнении. В моей ситуации заполнение полей в порядке очередности нет, т.е. юзер может в принципе что то где то упустить, а поскольку сообщение уже висит сделать его отмену в Вашем случае нельзя.
sdku
Все косяки юзверей предусмотреть (предугадать-самых светлых мозгов не хватит) не возможно в принципе

Согласна, но в данном случае - это самое обычная и распространенная ситуация.
Если реально нет возможности найти для этого решение, честно говоря для майкрософта это агромная и тупая косячина, которую они не удосужились продумать для тех кто программирует на бейсике в аксе.
sdku
и задачу разработчика,я лично, вижу в том,чтоб не позволить ввести не корректные данные (а для этого достаточно встроенных средств АКСА условий на значение,маски ввода или собственных проверок в коде-пусть юзвери изобретают сотни новых косяков)

Я как раз и пытаюсь делать преждевременную проверку, например перед сохранением или добавлением новой записи, но в ситуациях с Esc и закрытием формы преждевременную проверку делать у меня не получается без назойливых аксесовских сообщений. И самое главное с тем кодом, который у меня сейчас, я не могу никак осилить один момент - это при закрытии формы не сохранять введеные данные, если юзер выбрал "нет". В процедуре "Form_BeforeUpdate" указываю Me.Undo -> форма все равно закрывается со всеми заполненными данными.

По поводу проверок, единственное до чего я пока что еще не добралась, это до проверки на повторяющееся значение, что тоже для меня загадка.
2 авг 17, 21:15    [20696256]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4664
nataxa23
sdku,
Второе - сообщение акса как на моем же скриншоте у Вас так же выводится после того как в сообщении о сохранении изменений выбираешь "нет", даже при условии, что все поля заполнены и заполнены как было нужно. Это то, о чем писала в посте выше.
просмотрел пример-при переходе на другую запись ,(хоть новая, хоть редактирование) никаких сообщений при нажатии кнопки "нет" не выводится (за исключением случая закрытия формы сочетанием alt+f4 ,без предварительного сохранения записи.Вывод-перед закрытием формы сочетанием клавиш запись надо сохранять)
2 авг 17, 21:52    [20696333]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
sdku
Вывод-перед закрытием формы сочетанием клавиш запись надо сохранять)

Я не закрываю форму сочетанием клавиш, я говорю о нажатии на крестик.
2 авг 17, 22:51    [20696438]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
sdku
закрытия формы сочетанием alt+f4

Не знаю кто так осуществляет закрытие форм по нажатию на alt+f4, но у меня тогда после сообщения закрывается весь аксес, т.е. полностью все приложение. Не знаю кто как лично я такого не делаю, когда работа идет с формами внутри приложения, бред какой то я такое впервые слышу, чтобы какой нить юзер работая с формой пытался закрывать ее в глобальном смысле для всего приложения неважно будь это аксес или же др.приложение.
2 авг 17, 22:59    [20696456]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4664
nataxa23,
дошло-Вы закрываете форму не сохранив изменения и ACCESS очень даже логично задает вопрос закрывать форму или нет т.к. не понятно что делать с новыми данными (ведь процедура выполняется перед сохранением записи а при нажатии на крестик она выполняется внутри события закрытие которое и выводит сообщение. Вижу только один вариант: в событии выгрузка если Dirty=true вывести сообщение о необходимости сохранения записи и отменить событие
2 авг 17, 23:48    [20696551]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4664
вдогокнку: насчет alt+f4 закрывает акс,но перед этим закрывает открытые объекты
2 авг 17, 23:56    [20696564]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
sdku
Вижу только один вариант: в событии выгрузка если Dirty=true вывести сообщение о необходимости сохранения записи и отменить событие

а у Вас получается в событии "Form_Unload" Dirty=true???
3 авг 17, 18:11    [20698849]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
sdku,
Больше того, если Dirty=true, то при нажати на крестик, он не идет сразу в событие "Form_Unload", он вначале идет в событие "Form_BeforeUpdate".
Если состояние формы Dirty=true/false было бы возможно определить так как Вы предлагаете, у меня бы давно не возникало бы вопросов на эту тему. Посмотрите в моем изначальном посте мой код, именно по этой причине я разместила свой MsgBox в событии "Form_BeforeUpdate", а не в "Form_Unload". И бы было мне счастье, наверное, если бы не одно но... - в моем сообщении при выборе отказаться от сохранения ("нет"), данные все равно молча сохраняются в базе (ну это конечно при условии, что все поля заполнены и заполнены без ошибок).
3 авг 17, 18:27    [20698882]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4664
nataxa23,
Насчет "Form_Unload" я действительно был не прав-прошу прощения, а вот в нижесказанном уверен.
Успехов Вам в изменении логики, заложенной в ACCESS программистами Microsoft
(кстати юзер наткнувшись пару раз на сообщение, в дальнейшем, будет делать все правильно,чтоб его не получать)
sdku
Вы закрываете форму не сохранив изменения и ACCESS очень даже логично задает вопрос закрывать форму или нет т.к. не понятно что делать с новыми данными
3 авг 17, 19:28    [20699012]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
sdku
Успехов Вам в изменении логики, заложенной в ACCESS программистами Microsoft

Дело не в том, что пытаюсь изменить логику программистов Microsoft.
Я пытаюсь понять почему не получается на этапе закрытия через крестик отменить на форме введенные данные в процессе заполнения, до момента сохранения. Что за концепция такая странная???
Мне так же не понятен принцип бегающего состояния Dirty.

Еще мне не понятен процесс отслеживания ошибок аксеса, т.к. своими сообщениями он сбрасывает внесенные данные, но при этом переходит к запросу с выбором закрытия формы, что для меня тупо.
Если с проверкой на пустые поля я еще могу как то заранее отследить и не дать допустить юзеру ошибку, то вкупе всего вышеизложенного я не пойму как и где мне реализовать проверку на повторяющиеся значения своих двух полей, а проверка мне нужна.
3 авг 17, 21:11    [20699120]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nikolay_magagin
Member

Откуда: Псков
Сообщений: 154
Конечно может мои рассуждения туповаты.
Как только вносится любой символ в таблицу (форму), строковая запись по факту начинает существовать, но одновременно существует в виртуальном значении, что возможно блокирует одномоментное участие строки по передаче внесенных/измененных данных. Для примера попробуйте внести новые данные в таблицу, затем отменить ввод, затем еще новую запись. Вы заметите, что ID будет показывать только цифры 1 и 3. Цифра 2 отображаться не будет, это отмененный ввод. Другой пример: откройте одновременно таблицу и форму созданную на ее основе. При изменении данных где либо, они изменяться в другой, лишь после перехода на следующую запись. Поэтому ситуацию с выплывающим окном я понимаю так: сохранить - снятие блокировки с текущей записи; отмена - снятие блокировки с текущей записи и удаление текущей записи. Все остальные действия дают сохранение.
Для удаления повторов создайте запрос на удаление записи, где группируются возможные повторы, условие для ID last/first/max/min, подсчитываются количество повторяющихся записей с условием на отображение >1. Если будете запускать из формы, перед запросом не забудьте задать сохранить запись.
3 авг 17, 23:58    [20699341]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
Вакшуль Сергей
Member

Откуда: Харьков
Сообщений: 376
nataxa23
Помогите с кодом. Нужно, чтобы была проверка на внесенные изменения перед закрытием или отменой формы (форма для ввода данных) и выдавать окно сообщения сохранить изменения: да/нет/отмена, если юзер нажал:
1) закрыть форму - кнопка «X» на форме.
2) по привычке на Esc.

Могу предложить направление.

Как я понял, вы хотите, чтобы по нажатию крестика форма закрывалась молча только в том случае, если ее св-во Dirty = false, но если Dirty = true, то предложить диалог. Но реализовать не можете, событийная модель Access против вас.
Попробуйте компромисс.
Суть в том, что как только форма переходит в режим редактирования (Dirty = true), блокируйте кнопку закрытия формы. Таким образом пользователь окажется в ситуации, когда ему нужно или сохранить запись или отказаться от изменений(нажать ESC). Как только он сделает одно из двух, кнопка закрытия окна станет снова доступной.

Как я сказал, это просто направление. Во вложении пример, сделанный на скорую руку. Просто для демонстрации идеи. В режиме tabbed интерфейса он не работает. Надеюсь, доработаете, если будет нужно.

nataxa23
2) по привычке на Esc.

ESC для меня это или отмена изменений или выход без сохранения. Без вариантов.
Я не встречал в Windows программ, которые бы на ESC реагировали диалогом. Встретил бы - оторопел.

К сообщению приложен файл (db_nataxa23.7z - 24Kb) cкачать
4 авг 17, 03:05    [20699397]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
Вакшуль Сергей
Могу предложить направление.

Как я понял, вы хотите, чтобы по нажатию крестика форма закрывалась молча только в том случае, если ее св-во Dirty = false, но если Dirty = true, то предложить диалог. Но реализовать не можете, событийная модель Access против вас.
Попробуйте компромисс.
Суть в том, что как только форма переходит в режим редактирования (Dirty = true), блокируйте кнопку закрытия формы. Таким образом пользователь окажется в ситуации, когда ему нужно или сохранить запись или отказаться от изменений(нажать ESC). Как только он сделает одно из двух, кнопка закрытия окна станет снова доступной.

Как я сказал, это просто направление. Во вложении пример, сделанный на скорую руку. Просто для демонстрации идеи. В режиме tabbed интерфейса он не работает. Надеюсь, доработаете, если будет нужно.

АГРОМНЕЙШЕЕ спасибище за Вашу идею. Она оказалась очень для меня приемлемой.
Не много изменила идею вывода сообщения. Для клавиши Esc, если изменений не было - форма молча закрывается, если же юзер ее нажал, а данные не были сохранены, вывожу предварительное сообщение-запрос об очищении данных и тогда юзер уже сам выберет, что ему нужно - очищать форму или продолжать дальше работать с тем что он там на вводил. А для крестика на форме сообщение стало за ненадобностью т.к. на основе Вашего примера я блокирую кнопку пока юзер не сохранит данные - это отличная идея на мой взгляд, раз Microsoft не позволяет при закрытии осуществить для юзеров запрос на подтверждение действий, если вдруг данные не были предварительно сохранены.
Без Вашего примера через функцию WinAPI я бы честно говоря не справилась. Для меня это уже довольно сложноватая тема.
В связи с этим, мое мнение конечно, я считаю, что со своей идеологией Microsoft не совсем прав и должен был тогда хотя бы дать возможность работать с этими кнопками на самой форме в отдельном порядке как то, а не упрощенно вкл\выкл в режиме Конструктора в макете.
Заметила правда такую вещь, в Вашем примере, с чем может быть связано то, что на скриншоте:
Картинка с другого сайта.
Правда если мышкой поводить по кнокам, то все отображается нормально.

И еще хотела бы только уточнить, не догадалась что значит:
Вакшуль Сергей
В режиме tabbed интерфейса он не работает

Что за режим Вы имели в виду?

А и еще попутный вопрос есть, который висит надо мной как "домоклов меч", поскольку тема касается проверок на форме. Проверку на пустые поля я делаю перед сохранением данных, а так же перед добавлением новых. Но как сделать проверку на повторяющиеся значения в поле?
У меня таких полей два. Форма заносит данные на основе запроса, который строится из 2-х таблиц. Одно поле из одной таблицы, и другое поле из второй. Если значение повторяется в первом поле, аксес выдает свое сообщение с ошибкой и возможность внести правку у юзера еще есть, а вот когда значение повторяется во втором поле, аксес после сообщения об ошибке (3022) в полях самой формы начинает затирать данные (#Ошибка) и последовательно забрасывать другими сообщениями, типа ошибка 3021 - "Текущая запись отсутствует", ну и т.д. и т.п..., пошло, поехало.
По хорошему нужна предварительная проверка на повторяющиеся значения, как это сделать, аксес же как то отлавливает?
В процедуре Form_Error при ошибке возможности прервать дальнейшие "телодвижение" например через Cancel нет:
+

Private Sub Form_Error(DataErr As Integer, Response As Integer)

  Select Case DataErr
    Case 2169
'      Response = acDataErrContinue 'игнор стандартное сообщение Microsoft Access
'      MsgBox "В данное время сохранение объекта невозможно." & vbCrLf & vbCrLf & _
'              "В приложении обнаружена ошибка при попытке сохранения записи." & vbCrLf & _
'              "Если закрыть объект, выполненные изменения будут потеряны.", _
'              vbCritical, "Info. Ошибка № 2169"
'-------------
    Case 3314
      Response = acDataErrContinue
      intClose = 2
      MsgBox "Значение поля не может быть пустым.", vbCritical, "Info. Ошибка № 3314"
'-------------
    Case 3020
      Response = acDataErrContinue
      MsgBox "Update или CancelUpdate без AddNew или Edit.", vbCritical, "Info. Ошибка № 3020"
'-------------
    Case 3021
      Response = acDataErrContinue
      MsgBox "Текущая запись отсутствует.", vbCritical, "Info. Ошибка № 3021"
'-------------
    Case 3022
      Response = acDataErrContinue
      intClose = 2
      MsgBox "Вы ввели значение, которое уже существует в другой записи." & vbCrLf & _
              "Проверте значения в полях «Номер» и повторите попытку.", _
              vbCritical, "Info. Ошибка 3022"
  End Select
    
End Sub

4 авг 17, 22:40    [20702132]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
Вакшуль Сергей
Member

Откуда: Харьков
Сообщений: 376
nataxa23,
nataxa23
Заметила правда такую вещь, в Вашем примере, с чем может быть связано то, что на скриншоте:

ну, перерисовка окна подглючивает. Решается через Application.Echo
Функцию SetCloseBox подправил, с этим теперь все ок. См.вложение. Но идеала, к сожалению, все равно нет - форму по-прежнему можно закрыть и через ALT+F4 и через системное меню окна формы. Наверно и тут можно решить вопрос через API. Я просто в эту сторону не смотрел. Думал, вы покапаете.

tabbed интерфейс - имел ввиду вот такой вид:
https://support.office.com/en-us/article/Guide-to-the-Access-2010-user-interface-CD8ECA71-78A1-484F-897B-FC80B1AC77EC#__toc252879451
тоже не рыл в этом направлении.

nataxa23
А и еще попутный вопрос есть, который висит надо мной как "домоклов меч", поскольку тема касается проверок на форме

я видел, что вы на этот счет писали, но, если честно, мне непонятно, что у вас не получается. Если нужно сделать проверку, написать запрос или воспользоваться Dlookup, чтобы проверить, а есть ли в таблице повторяющиеся данные по определенному полю, так сделайте такой запрос. В чем проблема?

К сообщению приложен файл (db_nataxa23.7z - 24Kb) cкачать
5 авг 17, 00:06    [20702247]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
Вакшуль Сергей
Member

Откуда: Харьков
Сообщений: 376
Сделал еще один вариант. Во вложении.
Так мне нравится больше. Спасибо Олегу Osmor-у за код API 13967471.

Все кнопки в заголовке формы на момент редактирования убираются. Теперь пользователь не сможет закрыть форму ни крестиком, ни кликом в системном меню в крайнем левом углу, ни двойным кликом в крайнем левом углу. Сочетание клавиш CTRL+F4 также заблокировано.
Минус только один - если редактирование начато в момент, когда форма развернута на весь экран, то крестик окажется доступным пользователю.

Описание нужного поведения формы вынес в класс CaptionBarButtonsHandler

К сообщению приложен файл (db_nataxa23.7z - 32Kb) cкачать
5 авг 17, 02:52    [20702334]     Ответить | Цитировать Сообщить модератору
 Re: Отследить изменения на закрытие и отмену формы  [new]
nataxa23
Member

Откуда: Москва
Сообщений: 122
Вакшуль Сергей,
Спасибо Вам еще раз за идею с функцией WinAPI и тем, кто в свое время так же реализовывал эту тему.
Вакшуль Сергей
Но идеала, к сожалению, все равно нет - форму по-прежнему можно закрыть и через ALT+F4 и через системное меню окна формы

Если в параметрах аксеса текущей базы данных параметры окна документа изменить настройку "перекрывание окон" на "вкладки", то при использовании формы, раз она всплывающая как у меня проблем вроде нет:
1) поведение крестика работает как надо, даже если форму развернуть во весь экран - это хорошо.
2) если правым кликом мыши в левом углу на пиктограмке (значке) формы смотреть в контекстном меню, то форма в режиме занесения данных отображает недоступным закрытие формы - это тоже хорошо.
Вакшуль Сергей
Сделал еще один вариант. Во вложении.
Так мне нравится больше. Спасибо Олегу Osmor-у за код API 13967471.

Все кнопки в заголовке формы на момент редактирования убираются. Теперь пользователь не сможет закрыть форму ни крестиком, ни кликом в системном меню в крайнем левом углу, ни двойным кликом в крайнем левом углу. Сочетание клавиш CTRL+F4 также заблокировано.
Минус только один - если редактирование начато в момент, когда форма развернута на весь экран, то крестик окажется доступным пользователю.

В приципе гор.клавиша ALT+F4 - это же попытка закрыть всю оболочку аксеса, соответственно если открыта хоть одна какая-либо форма, то здесь акс уже пытается вначале закрыть форму(-ы), а затем всю оболочку. Поэтому это идея имеет свои плюсы и минусы, правда я еще пока не нашла какие.
Пока что я остановилась на Вашем конкретно примере, т.к. в моей ситуации мне нужны кнопки свернуть/развернуть на форме, т.к. в настройках акса у меня для базы используется вариант со вкладками. Ваш вариант в моей ситуации получается идеальным. Но вариант с наибольшими ограничениями я не исключаю и так же приму к сведению.
К слову о минусах, при использовании в настройках акса параметры окна текущей базы - "вкладки", то в этом случае минус уже будет не крестиком, а сдвойным щелчком по форме, если она развернута в режиме внесения данных, то при двойном клике по форме она возвращается в свой режим окна Normal.
В общем тот кто хорошо разбирается с WinAPI быстро для себя найдут оптимальный вариант.
5 авг 17, 19:46    [20702842]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить