Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 306

/ вопрос открыт /

Доброго времени суток.
Как сделать так, чтобы при клике на кнопку запускался компилированный HTML-файл справки.

Илья Бабаков Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Илья Бабаков (статус: Посетитель)
Вопрос отправлен: 10 февраля 2007, 17:05
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Роман

Здравствуйте, Илья Бабаков!Чтобы справка была доступна в программе, нужно указать программе на файл .hlp. Самый простой способ размещения файла справки - в той же папке, где находится исполняемый файл. Определить для приложения файл справки можно так: открыв проект (приложения) в Delphi и выбрав меню "Project" -> "Options" -> "Application", вписать название файла справки в поле ввода "Help file". При этом нужно указать название файла без пути. Когда WinHelp пытается найти справочный файл, одна из просматриваемых директорий - та, где расположен исполняемый файл программы. Другой способ - в обработчик события OnCreate главной формы программы вставить строку:

Application.HelpFile:=ExtractFilePath(Application.ExeName) + "MyHelp.hlp";
где MyHelp.hlp - название файла справки.
Чтобы из меню в программе вызвать оглавление справки, нужно воспользоваться функцией

Application.HelpCommand(HELP_FINDER, 0);
Чтобы перейти к одной из определенных нами тем справки, нужно вызвать функцию
Application.HelpJump('MyTopic'),
где MyTopic - идентификатор темы.
Один из способов вызова справки - нажатие клавиши F1. Можно организовать вызов контекстной справки при нажатии на F1, когда активным является тот или иной элемент управления. Для этого соответствующей теме справки нужно присвоить номер, а затем этот номер присвоить свойству HelpContext элемента управления. Чтобы задать номера для тем справки, нужно открыть проект справки в HelpWorkshop и нажать кнопку "Map" в правой части окна. Нажимаем в диалоговом окне "Add", вводим идентификатор темы и произвольный номер (например, 1 :) ), повторяем это для всех нужных тем (каждой - свой номер), закрываем окно и нажимаем в очередной раз "Save and Compile". Затем в Delphi, в окне инспектора объектов, присваиваем нужные номера нужным элементам управления (напоминаю, свойство HelpContext).

Ответ отправил: Роман (статус: 5-ый класс)
Время отправки: 10 февраля 2007, 23:07
Оценка за ответ: 3

Ответ #2. Отвечает эксперт: min@y™

В приложении - компонент для работы с СНМ-файлами. Нарыл где-то в интернете, давно.

Приложение:
  1. unit HHComp;
  2. {This is freeware Delphi unit which allow to use HTMLHelp instead of usual Windows Help
  3. intercepting OnHelp event. With this component you can still use HelpContext properties
  4. of the components but THHComp redirect help request to the HTMLHelp API.
  5. Only one component per programm can be used.
  6. Copyright (c) 2003 Ainars Skangals
  7. Version 1.20
  8. This component is provided "as is" without warranty of any kind,
  9. either expressed or implied.
  10. }
  11. interface
  12.  
  13. uses
  14. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
  15.  
  16. type
  17. THtmlHelp=Function(hwndCaller : HWND; pszFile: PChar; uCommand : Integer;
  18. dwData : DWORD) : HWND; stdcall;
  19.  
  20. TTCardEvent=procedure(wParam: WPARAM; lParam: LPARAM) of object;
  21.  
  22.  
  23. THHComp = class(TComponent)
  24. private
  25. { Private declarations }
  26. FHelp,
  27. FHelp1:String;
  28. HHHandle:THandle;
  29. HtmlHelp:THtmlHelp;
  30. FOnTCardEvent: TTCardEvent;
  31. FOldEvent: TMessageEvent;
  32. protected
  33. { Protected declarations }
  34. procedure Loaded; override;
  35. procedure CatchCardMessage(var Msg: TMsg; var Handled: Boolean);
  36. public
  37. { Public declarations }
  38. Function ShowContents:Integer;
  39. Function ShowIndex:Integer;
  40. Function ShowHelp(Command: Word; Data: Longint; var CallHelp: Boolean): Boolean;
  41. Destructor Destroy; override;
  42. published
  43. { Published declarations }
  44. Property HelpFile:String read FHelp write FHelp;
  45. Property OnTCardMessage:TTcardEvent Read FOnTCardEvent write FOnTCardEvent;
  46. end;
  47.  
  48. procedure Register;
  49.  
  50. implementation
  51. const
  52. HH_DISPLAY_TOPIC = $0000;
  53. HH_DISPLAY_TOC = $0001;
  54. HH_DISPLAY_INDEX = $0002;
  55. HH_HELP_CONTEXT = $000F;
  56. HH_CLOSE_ALL = $0012;
  57.  
  58. function THHComp.ShowContents:Integer;
  59. begin
  60. if HHHandle<>0 then
  61. Result:=HtmlHelp(Application.Handle,PChar(FHelp1),HH_DISPLAY_TOC,0);
  62. end;
  63.  
  64. function THHComp.ShowIndex:Integer;
  65. begin
  66. if HHHandle<>0 then
  67. Result:=HtmlHelp(Application.Handle,PChar(FHelp),HH_DISPLAY_INDEX,0);
  68. end;
  69.  
  70. function THHComp.ShowHelp(Command: Word; Data: Longint; var CallHelp: Boolean): Boolean;
  71. begin
  72. Result:=False;
  73. if FHelp<>'' then
  74. if HHHandle<>0 then
  75. HtmlHelp(Application.Handle,PChar(FHelp1),HH_HELP_CONTEXT,Data);
  76. CallHelp:=False;
  77. Result:=true;
  78. end;
  79.  
  80. procedure THHComp.Loaded;
  81. begin
  82. Inherited;
  83. HHHandle:=0;
  84. // dynamic library loading to avoid exceptions on program start
  85. HHHandle:=LoadLibrary('HHCTRL.OCX');
  86. if HHHandle<>0 then
  87. HtmlHelp := GetProcAddress(HHHandle, 'HtmlHelpA');
  88. // Here the help system is switched to HTMLHelp
  89. Application.OnHelp:=ShowHelp;
  90. if Assigned(Application.OnMessage) then
  91. FOldEvent:=Application.OnMessage else FOldEvent:=nil;
  92. Application.OnMessage:=CatchCardMessage;
  93. FHelp1:=ExtractFilePath(Application.exename)+FHelp;
  94. end;
  95.  
  96. procedure THHComp.CatchCardMessage(var Msg: TMsg; var Handled: Boolean);
  97. begin
  98. Handled:=false;
  99. if Msg.Message=WM_TCARD then begin
  100. Handled:=true;
  101. if assigned(FOnTCardEvent) then FOnTCardEvent(Msg.wParam,Msg.lParam);
  102. end else
  103. if assigned(FOldEvent) then FOldEvent(Msg,Handled);
  104. end;
  105.  
  106. destructor THHComp.Destroy;
  107. begin
  108. // Automatically close help window if any
  109. HtmlHelp(0,PChar(FHelp1),HH_CLOSE_ALL,0);
  110. if HHHandle<>0 then begin
  111. HtmlHelp(0,PChar(FHelp1),HH_CLOSE_ALL,0);
  112. FreeLibrary(HHHandle);
  113. end;
  114. inherited;
  115. end;
  116.  
  117. procedure Register;
  118. begin
  119. RegisterComponents('Install', [THHComp]);
  120. end;
  121.  
  122. end.


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 12 февраля 2007, 08:39
Оценка за ответ: 2


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 12 февраля 2007, 18:26; участников в обсуждении: 2.
Илья Бабаков

Илья Бабаков (статус: Посетитель), 12 февраля 2007, 15:54 [#1]:

min@y™ .Спасибо за внимание.
Чё делать с кодом???
Роман, также спосибо за внимание, но мне надо как-бы запустить готовый Скомпилированный HTML-файл справки.
Роман

Роман (статус: 5-ый класс), 12 февраля 2007, 16:16 [#2]:

Используйте ShellExecute(

HWND hwnd, // handle to parent window
LPCTSTR lpOperation, // pointer to string that specifies operation to perform
LPCTSTR lpFile, // pointer to filename or folder name string
LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters
LPCTSTR lpDirectory, // pointer to string that specifies default directory
INT nShowCmd // whether file is shown when opened
);(см Help в Delphi)
Пр: ShellExecute(0,'explore','C:\WINDOWS',nil,nil,SW_SHOWNORMAL);
Или так
function ExecuteFile(const FileName, Params, DefaultDir: string;

ShowCmd: Integer): THandle;
var

zFileName, zParams, zDir: array[0..79] of Char;

begin

Result := ShellExecute(Application.MainForm.Handle, nil,
StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),
StrPCopy(zDir, DefaultDir), ShowCmd);
end;
Пр: executeFile('maker.exe','text_file','c:\maker', SW_SHOWNORMAL);
Роман

Роман (статус: 5-ый класс), 12 февраля 2007, 16:33 [#3]:

А вообще если это справка к вашей программе то делайте как написано в моём первом ответе, а в onclick нужной кнопки пошите (как и указано в ответе) Application.HelpCommand(HELP_FINDER, 0);
И всё. А ShellExecute служит для запуска вообще любых программ из вашей программы.
Илья Бабаков

Илья Бабаков (статус: Посетитель), 12 февраля 2007, 17:39 [#4]:

Не могу разобраться с ShellExecute.
function ExecuteFile не работает???
Наверно старею.
Илья Бабаков

Илья Бабаков (статус: Посетитель), 12 февраля 2007, 18:26 [#5]:

Усё работает.
Спасибо!!!!!!!!!!!!!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:01
Выполнено за 0.03 сек.