Как создать MsgBox с флажком «Больше не спрашивать» или «Больше не спрашивать» в VB6?

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

Я унаследовал некоторый код VB6, и в указанном коде есть несколько вызовов MsgBox, многие из которых отображают сообщения, которые конечные пользователи, вероятно, сочтут очень раздражающими через короткое время (например, «Печать завершена», «Запись добавлена» и т. д.)

Я хотел бы добавить стандартный пользовательский интерфейс управления флажком в MsgBox, говорящим: «Больше не спрашивайте меня об этом», чтобы при нажатии кнопки «ОК» сохранялась настройка, которая позволяет программе знать, вы знаете. .чтобы никогда больше не спрашивать об этом. Довольно стандартное управление, идея довольно понятна.

Я хотел бы знать, каков лучший способ сделать это в VB6. Существует очевидный способ просто создать новую форму для этого типа msgboxen и заменить старый вызов MsgBox на .Show в этой форме, но есть ли у гуру VB6 на Stack Overflow лучший способ?

заранее спасибо


person Community    schedule 24.06.2009    source источник


Ответы (4)


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

Я делал это в своем собственном приложении много раз. Одна вещь, о которой следует подумать... предположим, что пользователь устанавливает флажок "больше не показывать мне это". На мой взгляд, должен быть способ сбросить настройки. Поскольку форма окна сообщения больше не будет отображаться, я добавил это в форму конфигурации (для своего приложения).

Одна вещь, которую вы, возможно, захотите рассмотреть, — это подкласс функции MSGBOX. Вы можете создать в своем приложении функцию с аналогичным списком параметров, но с парой дополнительных. Если дополнительные параметры отсутствуют, просто вызовите vba.MsgBox (чтобы получить стандартное поведение). Если вы передадите дополнительные параметры, вместо этого вы можете вызвать свою новую форму.

person George Mastros    schedule 24.06.2009
comment
хороший момент о возможности отменить настройку «не беспокоить меня больше». - person ; 24.06.2009
comment
Спасибо - это то, что я понял, был ответ, и вы изложили его намного лучше, чем я мог. Надеюсь, это станет каноническим ответом в Google, а не какой-то хромой веткой форума 7-летней давности. :) - person ; 24.06.2009
comment
@GSerg: Ваш ответ хорош, и я проголосовал за него. Но, честно говоря, я бы сначала использовал этот ответ из-за всех проблем, связанных с использованием недокументированных/неподдерживаемых API. - person Oorang; 25.06.2009

Ну... Вы не совсем правы ребята ;)

Начиная с Win2000 существует функция SHMessageBoxCheck, которая выполняет обманывать. Декларация VB6:

Private Declare Function SHMessageBoxCheck Lib "shlwapi" Alias "#185" (ByVal hWnd As Long, ByVal lpszText As String, ByVal lpszTitle As String, ByVal dwType As VbMsgBoxStyle, ByVal iDefault As Long, ByVal lpszId As String) As Long

Все остальное по ссылке :)

person GSerg    schedule 24.06.2009
comment
Хорошо, это круто. :-) Но есть довольно вопиющая проблема. Это видимо уже устарело? В документах говорится, что он может отсутствовать в версиях Windows после Server2003. Кто-нибудь пробовал это на Vista или w7? - person Karl E. Peterson; 25.06.2009
comment
+1 За безвозмездное использование awesome :) Подтверждаю, в Висте все еще работает. Только что проверил, работает нормально. Но похоже, что ключ, в котором находятся значения, перемещен в HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\DontShowMeThisDialogAgain. Очевидно, что это будет иметь значение для всех, кто хочет прочитать/изменить эти ключи для восстановления сообщений. Я чувствую себя обязанным дать все обычные предупреждения об использовании недокументированных API:) - person Oorang; 25.06.2009
comment
Еще одна интересная вещь, которую я заметил, заключается в том, что, несмотря на то, что не все флаги стилей поддерживаются, все они работают в Vista. Можете ли вы подтвердить, что все они работают на XP? - person Oorang; 25.06.2009
comment
Еще одна вещь, которую я заметил, заключается в том, что в документации указано, что если пользователь вышел из диалогового окна, vbCancel возвращается, даже если кнопка «Отмена» не была возможной. В Vista кнопка x недоступна, если нет опции отмены. - person Oorang; 25.06.2009
comment
@GSerg: вы должны объявить iDefault как VbMsgBoxResult. (Извините за спам в комментариях. Я пытался объединить, но закончились символы.) - person Oorang; 25.06.2009
comment
Хм, одна вещь, которая выглядит так, как будто она не поддерживается, это то, что появится кнопка справки, но не похоже, что есть способ привязать ее к чему-либо. - person Oorang; 25.06.2009
comment
Другая проблема заключается в том, что вам нужно следить за случайно перекрывающимися идентификаторами. Поскольку у вас нет возможности узнать, какие другие приложения используют этот API, даже если вы запустите проверку реестра, чтобы убедиться, что вы не выбрали идентификатор, который уже отключен. У вас нет возможности убедиться, что какое-то приложение не выбрало конфликтующий идентификатор, отключив свое сообщение, отключив ваше (или наоборот). Если эта проблема не может быть решена, я не думаю, что буду использовать это. - person Oorang; 25.06.2009
comment
Оранг: используйте GUID, чтобы избежать коллизий. - person GSerg; 25.06.2009

Если вы предоставляете такую ​​функциональность, может потребоваться «включение» отображения окна сообщений.
т. е. у пользователя должна быть возможность снова увидеть окно сообщений, используя некоторые настройки.

Вместо этого вы можете использовать строку состояния для отображения уведомлений ИЛИ иметь метку с сообщениями уведомлений и отключить ее через несколько секунд.

person shahkalpeshp    schedule 24.06.2009

Это было мое грязное решение:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
myfile = Workbooks.Application.ActiveWorkbook.Path & "\noprompt.txt"
If Dir(myfile) <> "" Then Exit Sub
exportData = MsgBox("Export data?" & vbCrLf & "Select Cancel (or × top right) to prevent this prompt from displaying again.", vbYesNoCancel, "Close Workbook")
If exportData = vbYes Then
    Call ExportValues 'a separate function...
ElseIf exportData = vbCancel Then
    'create file noprompt.txt
    Open myfile For Output As #1
    Write #1, "Delete this file to restore prompt to Export Data when workbook is closed."
    Close #1
    Exit Sub
ElseIf exportData = vbNo Then
    Exit Sub

End If


End Sub

Документация для моего приложения объясняет, что удаление файла восстанавливает подсказку.

person markinboone    schedule 11.09.2015