Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2014, 17:19   #1
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию Привязать справку CHM к форме UserForm

Здравствуйте, товарищи

Оказывается, тема создания справки для VBA-проекта Word не раскрыта, тем более для современных версий

Как я понял, не получится использовать встроенные средства UserForm (WhatThisButton, WhatThisHelp, HelpContextID) вместе с созданной своими руками справкой в формате CHM. Или можно?

Остается вызывать справку программно, через HtmlHelpA. С простейшим вызовом разобрался, но хотелось бы организовать выдачу всплывающих подсказок и подсказок типа «что это?». Еще, интересуют макросы для доступа к элементам файла справки, например к текстам всплывающих подсказок.

Что есть на данный момент:
Код:
Option Explicit: Option Base 0: Option Compare Binary
#If VBA7 Then
    Private Declare PtrSafe Function HtmlHelp Lib "Hhctrl.ocx" Alias "HtmlHelpA" (ByVal hWndCaller As Long, ByVal pszFile As String, ByVal uCommand As Long, ByVal dwData As Long) As Long
#Else
    Private Declare Function HtmlHelp Lib "Hhctrl.ocx" Alias "HtmlHelpA" (ByVal hWndCaller As Long, ByVal pszFile As String, ByVal uCommand As Long, ByVal dwData As Long) As Long
#End If
Private Const HH_DISPLAY_TOPIC = &H0 ' вызов по имени раздела
Private Const HH_DISPLAY_TOC = &H1
Private Const HH_DISPLAY_INDEX = &H2
Private Const HH_DISPLAY_SEARCH = &H3
Private Const HH_SET_WIN_TYPE = &H4
Private Const HH_GET_WIN_TYPE = &H5
Private Const HH_GET_WIN_HANDLE = &H6
Private Const HH_GET_INFO_TYPES = &H7
Private Const HH_SET_INFO_TYPES = &H8
Private Const HH_SYNC = &H9
Private Const HH_ADD_NAV_UI = &HA
Private Const HH_ADD_BUTTON = &HB
Private Const HH_GETBROWSER_APP = &HC
Private Const HH_KEYWORD_LOOKUP = &HD
Private Const HH_DISPLAY_TEXT_POPUP = &HE
Private Const HH_HELP_CONTEXT = &HF ' вызов по Context ID
Private Function c_HelpFile() As String
    c_HelpFile = ThisDocument.Path & Application.PathSeparator & "Справка.chm"
End Function
Public Function HELP_Show() As Long ' вызов справки
    HELP_Show = HtmlHelp(0, c_HelpFile, HH_DISPLAY_TOPIC, 0)
End Function
Public Function HELP_Context(ByVal Context As Long, Optional ByVal WindowHandle As Long = 0) As Long
' вызов контекстной справки
    If Context <= 0 Then Exit Function
    HELP_Context = HtmlHelp(WindowHandle, c_HelpFile, HH_HELP_CONTEXT, Context)
End Function
Public Function HELP_PopUp(ByRef Form As MSForms.UserForm) As Long
' вызов всплывающей подсказки для активного элемента формы
' ??????????????????????????????????
End Function
Public Function HELP_WhatsThis (ByRef Form As MSForms.UserForm) As Long
' вызов подсказки «что это» для активного элемента формы
' ??????????????????????????????????
End Function
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 19.07.2014, 13:04   #2
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

ну Вашу тему надо раскачивать... вдруг мне что пригодится
то что есть и выложено как опробовать?
я бы ещё на http://www.sql.ru/ спросил
Ципихович Эндрю вне форума Ответить с цитированием
Старый 19.07.2014, 13:04   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

ну Вашу тему надо раскачивать... вдруг мне что пригодится
то что есть и выложено как опробовать?
я бы ещё на http://www.sql.ru/ спросил
Ципихович Эндрю вне форума Ответить с цитированием
Старый 19.07.2014, 21:24   #4
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
...то что есть и выложено как опробовать?...
Создаете справку в формате CHM (доки туча), и вперед...

Еще немного нарыл. Можно работать через shell:
Код:
Public Sub HELP_CMD_Open()  ' открыть файл справки
    Call Shell("cmd /cstart " & c_HelpFile)
End Sub

Public Sub HELP_Explorer_Open()  ' открыть файл справки
    Call Shell("explorer.exe " & c_HelpFile)
End Sub

' hh.exe

Public Sub HELP_HH_Open() ' открыть файл справки
    Call Shell("hh.exe " & c_HelpFile)
End Sub

Public Sub HELP_HH_Browser() ' открыть файл справки в браузере
    Call Shell("hh.exe -browser " & c_HelpFile)
End Sub

Public Sub HELP_HH_Context(ByVal ContextID As Long) ' вызов контекстной справки
    Call Shell("hh.exe -mapid " & CStr(ContextID) & " " & c_HelpFile)
End Sub

Public Sub HELP_HH_Address(ByVal Address As String) ' вызов справки по адресу
' Address - вход: имя страницы в формате: <файл>[#<якорь>]
' файл должен содержать путь, указанный при создании справки
    Call Shell("hh.exe " & c_HelpFile & "::/" & Address)
End Sub
Макросы на заказ и готовый пакет - http://mtdmacro.ru/

Последний раз редактировалось Вождь; 19.07.2014 в 22:04.
Вождь вне форума Ответить с цитированием
Старый 28.07.2014, 18:12   #5
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Да уж, с документацией по теме глухо, именно для Word Так и не разобрался, отчего не открывается справка, если chm-файл указать в свойствах VBA-проекта.

Сделал через хук клавиатуры, но решение мне не нравится, из-за нестабильности - пару раз аварийно закрывался Word. Собранный код прилагаю:
Код:
#If VBA7 And Win64 Then
    Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
        (ByVal idHook As LongLong, ByVal lpFn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As LongLong) As LongLong
    Declare PtrSafe Function CallNextHookEx Lib "user32" _
        (ByVal hHook As LongPtr, ByVal nCode As LongLong, ByVal wParam As LongLong, lParam As Any) As LongLong
    Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As LongLong
    Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As LongLong
    Dim myHook As LongLong
#Else
    Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
        (ByVal idHook As Long, ByVal lpFn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Declare Function CallNextHookEx Lib "user32" _
        (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Declare Function GetCurrentThreadId Lib "kernel32" () As Long
    Dim myHook As Long
#End If

' SetWindowsHookEx / idHook
Const WH_KEYBOARD% = &H2
Const WH_MOUSE% = &H7
' KeyboardProc / Code
Const HC_ACTION = 0
Const HC_NOREMOVE = 3
' KeyboardProc / wParam (Virtual-Key Codes)
Const VK_HELP = &H2F ' HELP key
Const VK_F1 = &H70 ' F1 key

' размещаем в модуле формы
'Sub UserForm_Initialize()
'    HELP_HookKeyboard_On
'End Sub
'Sub UserForm_Terminate()
'    HELP_HookKeyboard_Off
'End Sub

Public Sub HELP_HookKeyboard_On()
    myHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0, GetCurrentThreadId)
End Sub

Public Sub HELP_HookKeyboard_Off()
    Call UnhookWindowsHookEx(hHook:=myHook)
End Sub
    
#If VBA7 And Win64 Then
Public Function KeyboardProc( _
        ByVal Code As LongLong, ByVal wParam As LongLong, lParam As LongLong) As LongLong
#Else
Public Function KeyboardProc( _
        ByVal Code As Long, ByVal wParam As Long, lParam As Long) As Long
#End If
' перехват событий клавиатуры
    If Code <> HC_ACTION Then
    'ElseIf (lParam And (2 ^ 30)) <> 0 Then ' 30й бит = до того: 0-отпущена, 1-нажата
    'ElseIf (lParam And (2 ^ 31)) = 0 Then ' 31й бит = сейчас: 0-отпущена, 1-нажата
    Else
        Select Case wParam
            Case VK_HELP, VK_F1: StatusBar = "F1"
        End Select
    End If
    KeyboardProc = CallNextHookEx(myHook, Code, wParam, ByVal lParam)
End Function
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA. Как работать с изображениями на форме? (UserForm) mozart2012 Помощь студентам 0 22.01.2013 17:45
как сделать чтобы chm файл открывался на форме kate158 Общие вопросы Delphi 1 02.04.2012 15:12
Открыть chm справку в нужном месте Человек_Борща Общие вопросы Delphi 3 10.02.2011 22:52
подключить справку Mikhail91 Общие вопросы C/C++ 0 25.03.2010 00:11
Как привязать событие или макрос к динамическому объекту (commandbutton) в форме? ekesar Microsoft Office Excel 7 09.12.2008 09:13