Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как правильно вывести HelpFile F1/Меню Help и т.д. / 6 сообщений из 6, страница 1 из 1
04.03.2013, 18:48
    #38173711
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вывести HelpFile F1/Меню Help и т.д.
Использовал такой код:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
 Private Sub Form_Load()
   App.HelpFile = App.Path & "\" & "proga.chm"

...
Private Sub HelpHelp_Click()
    App.HelpFile = App.Path & "\" & "proga.chm"
    SendKeys "{F1}"
End Sub



И вот случайно обнаружил, что на Висте он не работает - ни F1, ни SendKeys (ну да, проскакивало где-то что с SendKeys проблемы на 7-ках и прочих). Т.е. выводится стандартный help системы, а не мой.

В одном месте такой код (не особо раньше следил за универсальностью), и он работает
Код: vbnet
1.
2.
3.
4.
5.
6.
Private Sub HelpMenu_Click()
    App.HelpFile = App.Path & "\" & "proga.chm"
    If IsProgaRun("Zagolovok helpa") = False Then 'чтоб не плодить много окон help-а
        Shell "hh.exe " & App.HelpFile, vbNormalFocus
    End If
End Sub



IsProgaRun("Zagolovok helpa") -проверяет есть ли окно с уникальным именем в заголовке, т.е. в данном случае запущен ли уже файл helpа.
Хотя опять же, "Zagolovok helpa" я два года как поменял, а в забытом этом коде (второй вариант) этого сделать забыл, так что окна плодятся при многократном вызове.

Т.е. вопросы
1) Как грамотно выводить Help. Из меню и по F1. И с учетом Виста и выше.
2) Чтоб окна Help не плодились. При этом один желательный момент. Приложение состоит из нескольких exe и в каждом есть кнопка <Help>. А файл один. Желательно чтоб не плодились и при нажатии help в разных компонентах.

Второй код (если об нем помнить при замене заголовка) в принципе решает проблему, но не с F1.
...
Рейтинг: 0 / 0
04.03.2013, 19:43
    #38173781
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вывести HelpFile F1/Меню Help и т.д.
Вообще-то не уверен что проблема сильно актуальна.
Фигня с Help происходит только на Висте,
а на семерке все работает нормально.
Если учесть, что за 3 года ни один пользователь не обратил внимание на эту проблему, а почти очевидно что все у кого была виста переходят на 7-8 (чего нельзя сказать про XP), м.б. и не стоит заморачиваться.
...
Рейтинг: 0 / 0
04.03.2013, 23:33
    #38173972
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вывести HelpFile F1/Меню Help и т.д.
Дмитрий77И вот случайно обнаружил, что на Висте он не работает - ни F1, ни SendKeys...Т.е. выводится стандартный help системы, а не мой.
А что самое интересное, проблема на этой Висте самоустранилась после перезагрузки, видимо глюк конкретной системы.
...
Рейтинг: 0 / 0
05.03.2013, 00:41
    #38174009
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вывести HelpFile F1/Меню Help и т.д.
Единственное, вот эту свою ересь
Код: vbnet
1.
2.
3.
    If IsProgaRun("Zagolovok helpa") = False Then 'чтоб не плодить много окон help-а
        Shell "hh.exe " & App.HelpFile, vbNormalFocus
    End If


(а SendKey "F1" там не работает, ибо вызывается из меню трея при скрытой форме, поэтому и намутил давно)

Поменял на более грамотный код:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Public Const HH_DISPLAY_TOPIC = &H0            '  WinHelp equivalent
Public Declare Function HTMLHelp Lib "hhctrl.ocx" Alias "HtmlHelpA" _
 (ByVal hWnd As Long, ByVal lpHelpFile As String, ByVal wCommand As Long, dwData As Any) As Long

...
Private Sub HelpMenu_Click()
  HTMLHelp 0, App.Path & "\" & "proga.chm", HH_DISPLAY_TOPIC, ByVal "Introduction.htm"
End Sub



кот. также как App.HelpFile + F1
обеспечивает единичность helpa и авто/закрытие его вместе с вызвавшим приложением
...
Рейтинг: 0 / 0
11.07.2013, 07:36
    #38327560
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вывести HelpFile F1/Меню Help и т.д.
Дмитрий77кот. ...обеспечивает ...и авто/закрытие его вместе с вызвавшим приложением
Вообще тут обнаружил что когда пользуешься HTMLHelp Lib "hhctrl.ocx" очень не лишне делать следующий код:
Код: vbnet
1.
2.
3.
4.
Private Sub Form_Unload(Cancel As Integer)
  HTMLHelp 0, vbNullString, HH_CLOSE_ALL, ByVal 0
...
End Sub


Потому как если не делать, то оно при закрытии App еще и краш обеспечить может.

А с другой стороны, такие команды как HH_INITIALIZE command и HH_UNINITIALIZE command лучше вообще не делать чеб там в msdn не говорилось, т.к. с этими командами Help запускается в потоке приложения (а не в другом) и можно схлопотать вот такой вариант:

1) Запускаем
Код: vbnet
1.
Form2.Show vbModal

2) Запускаем help
3) Закрываем vbModal
4) Запускаем опять
Код: vbnet
1.
Form2.Show vbModal


И УСЕ. Имеем HelpWindow.Enabled=false


У меня тут вопрос возник:
Например у меня в дереве хэлпа такая структура:

>>Some function (показывает страницу somefunction.htm)
>>>Some function Settings (показывает ту же самую страницу somefunction.htm)
>>>Some Function Subitem2 (показывает страницу Subitem2.htm - уникально )
>>>Some Function Subitem2 (показывает страницу Subitem3.htm - уникально )

Если я вызываю
Код: vbnet
1.
HTMLHelp 0, App.Path & "\" & "myhelp.chm", HH_DISPLAY_TOPIC, ByVal "Subitem2.htm"

то help однозначно показывает:
>>>Some Function Subitem2 (показывает страницу Subitem2.htm - уникально )

А если вызываю
Код: vbnet
1.
HTMLHelp 0, App.Path & "\" & "myhelp.chm", HH_DISPLAY_TOPIC, ByVal "somefunction.htm"


то при первом вызове может показать
>>Some function (показывает страницу somefunction.htm)
а может
>>>Some function Settings (показывает ту же самую страницу somefunction.htm)
(по принципу кратчайшего пути до ближайшего узла)
А если эту команду повторить, то показывает следующий узел, т.е.
>>>Some function Settings (показывает ту же самую страницу somefunction.htm)

А я например хочу (желательно), чтоб сразу показала последний вариант.
Как однозначность добавить (при сохранении условия что одна и та же страница отображается в двух пунктах)?

Как вариант могу вызвать команду два раза подряд, тогда точно попаду в цель, но как то это неправильно.

Да еще, а VB6 своими средствами не умеет контекстную справку показывать?
Чтоб не просто вывести первую страницу help, а тыкнуться в заданную (в завис. от контекста/окна/вкладки с кот. в данный момент работает пользователь)?
...
Рейтинг: 0 / 0
11.07.2013, 16:52
    #38328408
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно вывести HelpFile F1/Меню Help и т.д.
Дмитрий77А я например хочу (желательно), чтоб сразу показала последний вариант.
Как однозначность добавить (при сохранении условия что одна и та же страница отображается в двух пунктах)?

Как вариант могу вызвать команду два раза подряд, тогда точно попаду в цель, но как то это неправильно .

Ну, я на этом кривом варианте и остановился пока.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub CommandHelp_Click()
  Dim helpTopic As String
  Dim i As Long
  Dim iter As Long 'сколько раз вызвать команду, чтоб попасть точно в "нижний" узел
  iter = 1
  Select Case TreeView1.SelectedItem.Key
    Case "Function1":
      helpTopic = "Function1.htm"
    Case "Function2":
      helpTopic = "Function2.htm"
    Case "Function3":
      helpTopic = "Function3.htm"
      iter = 2
...
  For i = 1 To iter
    HTMLHelp 0, App.Path & "\" & "myhelp.chm", HH_DISPLAY_TOPIC, ByVal helpTopic
  Next
End Sub



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

Вообще, конечно формат .chm то устаревший. Причем он может глючить на некоторых системах (например если юзер чрезмерно и тупо увлекается установкой всяких Мозил и Firefox-ов, настройки которых могут нарушать функционирование ОС).
Но я чуть полазил по MSDN, посмотрел какие форматы help используются в других программах и понял что ничего лучше и новее то и нет, потому как то что используется в родной справке виндов начиная с висты не очень удобно и в целом разработчиками софта принято на вооружение не было.
Есть еще варианты "хэлп в онлайн в IE", хэлп в pdf - но от них честно говоря подташнивает.
Посему поразмыслив малость решил оставить chm.

Что, хэлпы никто не пишет? Типа юзер итак разберется.
Тема простая, но никто так и не ответил.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как правильно вывести HelpFile F1/Меню Help и т.д. / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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