powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Закрытие окна крестиком :)
7 сообщений из 7, страница 1 из 1
Закрытие окна крестиком :)
    #32729887
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только не смейтесь - у меня вопрос по закрытию окна.
Обнаружил давеча, что большинство моих юзеров считают закрытие окна по нажатию на крестике - нормальной операцией в результате которой все внесенные изменения должны быть сохранены. В отличие от нажатия кнопки Cancel.
Я будучи в полной уверенности, что нажатие крестика - то же самое, что и кнопка Cancel, не обрабатываю сию ситаевину.
А теперь вниманиеЮ знатоки - вопрос: где же правда? И стоит ли определять как юзер закрыл окно - через крестик или по Cancel и вести себя по разному. Или достаточно поставить на QueryUnload запрос "сохранить изменения али нет"?
Не хочется отслеживать в каждой форме изменения по каждому полю. Много кода. Может кто подскажет более красивое решение?
...
Рейтинг: 0 / 0
Закрытие окна крестиком :)
    #32729912
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все что ты хотел сделать в кнопке Cancel, следует делать в событии выгрузки формы, а в Cancel следует поместить только одну функцию - Unload.
...
Рейтинг: 0 / 0
Закрытие окна крестиком :)
    #32729943
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuriy GoodzТолько не смейтесь - у меня вопрос по закрытию окна.
Обнаружил давеча, что большинство моих юзеров считают закрытие окна по нажатию на крестике - нормальной операцией в результате которой все внесенные изменения должны быть сохранены. В отличие от нажатия кнопки Cancel.
Я будучи в полной уверенности, что нажатие крестика - то же самое, что и кнопка Cancel, не обрабатываю сию ситаевину.
А теперь вниманиеЮ знатоки - вопрос: где же правда? И стоит ли определять как юзер закрыл окно - через крестик или по Cancel и вести себя по разному. Или достаточно поставить на QueryUnload запрос "сохранить изменения али нет"?
Не хочется отслеживать в каждой форме изменения по каждому полю. Много кода. Может кто подскажет более красивое решение? Открываем Word, редактируем документ, жмем на X, Word переспрашивает "сохранять изменения ?" Так что, увы...
Но, ИМХО вам нужно "поставить на QueryUnload запрос "сохранить изменения али нет"? - это как простой вариант. Как более сложный - таки отслеживать изменения по контролам, считать некий CRC и на основании его определять спрашивать о сохранении изменений или нет.

В принципе в подсчете CRC нет ничего особо сложного. Пишется некий метод, куда передается сама форма. В методе происходит обход по всем контролам и если они редактируемы - высчитывается некоторая контрольная сумма.
Сценарий примерно такой:

Загрузили форму
m_lngCRC = CalculateCRC(Me)

QueryUnload
IF CalculateCRC(Me) <> m_lngCRC THEN
MsgBox "Сохранить изменения ?"
END IF

Save (там где вы сохраняете)
m_lngCRC = CalculateCRC(Me)

Конечно в реализации CalculateCRC есть трудности. Рекурсивность из-за контейнеров, некоторые проблемы с радиокнопками, но в целом - не так сложно
...
Рейтинг: 0 / 0
Закрытие окна крестиком :)
    #32731612
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Посмотрев на QueryUnload повынимательнее обнаружил там переменную UnloadMode. Типа сразу понятно, куда юзер тыкнул. Таким образом пожно именно на нажатие крестика задавать дурацкие вопросы.

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim i As Byte
If UnloadMode = vbFormControlMenu Then
i = MsgBox("Вы действительно хотите выйти?", vbQuestion + vbYesNo)
If i <> vbYes Then Cancel = True
End If
End Sub


Конечно для полного саксеса и сатисфая нужно все-таки анализировать были изменения или нет..так что вариант с использованием CRC - классная идея. Только я не до конца ею проникся.
Алексей, можно подробнее? Или какой-нибудь существующий пример CalculateCRC? Чего там все-таки вычислять?
...
Рейтинг: 0 / 0
Закрытие окна крестиком :)
    #32731707
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы при запуске формы1 сделал ее клон , а при выходе из формы1 через for each обошел клон, например, все текстовые поля и сравнил бы их значения со значениями на рабочей форме(форма1).
...
Рейтинг: 0 / 0
Закрытие окна крестиком :)
    #32732047
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuriy Goodz..так что вариант с использованием CRC - классная идея. Только я не до конца ею проникся.
Алексей, можно подробнее? Или какой-нибудь существующий пример CalculateCRC? Чего там все-таки вычислять? Готового примера под рукой нет. Смысл такой :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Function CalculateCrc(ByRef p_oForm As Form) As Long
    Dim oCtrl As Control
    Dim oTextBox As TextBox
    CalculateCrc =  0 
    For Each oCtrl In p_oForm.Controls
        If TypeOf oCtrl Is TextBox Then
            Set oTextBox = oCtrl
            CalculateCrc = CalculateCrc + CalculateCrcForString(oTextBox.Text)
        End If
    Next
End Function
Private Function CalculateCrcForString(p_strString As String) As Long
 'Расчет CRC по одному из стандартных алгоритмов 
End Function

Фактически рассчитывается контрольная сумма, на основе данных контролов, лежащих на форме.
В методе CalculateCrcForString нужно выполнить расчет контрольной суммы для строки. В интернете есть алгоритмы.
Вот пример расчета CRC для файлов. Не проверял
...
Рейтинг: 0 / 0
Закрытие окна крестиком :)
    #32734951
Yuriy Goodz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фенкс. Буду пробовать.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Закрытие окна крестиком :)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]