| 
| 
 | Вопрос # 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™ В приложении - компонент для работы с СНМ-файлами. Нарыл где-то в интернете, давно. Приложение:Переключить в обычный режим unit HHComp;{This is freeware Delphi unit which allow to use HTMLHelp instead of usual Windows Help  intercepting OnHelp event. With this component you can still use HelpContext properties of the components but THHComp redirect help request to the HTMLHelp API. Only one component per programm can be used.  Copyright (c) 2003 Ainars Skangals Version 1.20 This component is provided "as is" without warranty of any kind,  either expressed or implied.}interface uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type  THtmlHelp=Function(hwndCaller : HWND; pszFile: PChar; uCommand : Integer;            dwData : DWORD) : HWND; stdcall;   TTCardEvent=procedure(wParam: WPARAM; lParam: LPARAM) of object;    THHComp = class(TComponent)  private    { Private declarations }    FHelp,    FHelp1:String;    HHHandle:THandle;    HtmlHelp:THtmlHelp;    FOnTCardEvent: TTCardEvent;    FOldEvent: TMessageEvent;  protected    { Protected declarations }    procedure Loaded; override;    procedure CatchCardMessage(var Msg: TMsg; var Handled: Boolean);  public    { Public declarations }    Function ShowContents:Integer;    Function ShowIndex:Integer;    Function ShowHelp(Command: Word; Data: Longint; var CallHelp: Boolean): Boolean;    Destructor Destroy; override;  published    { Published declarations }    Property HelpFile:String read FHelp write FHelp;    Property OnTCardMessage:TTcardEvent Read FOnTCardEvent write FOnTCardEvent;  end; procedure Register; implementationconst  HH_DISPLAY_TOPIC  = $0000;  HH_DISPLAY_TOC    = $0001;  HH_DISPLAY_INDEX  = $0002;  HH_HELP_CONTEXT   = $000F;  HH_CLOSE_ALL      = $0012; function THHComp.ShowContents:Integer;begin  if HHHandle<>0 then   Result:=HtmlHelp(Application.Handle,PChar(FHelp1),HH_DISPLAY_TOC,0);end; function THHComp.ShowIndex:Integer;begin  if HHHandle<>0 then   Result:=HtmlHelp(Application.Handle,PChar(FHelp),HH_DISPLAY_INDEX,0);end; function THHComp.ShowHelp(Command: Word; Data: Longint; var CallHelp: Boolean): Boolean;begin  Result:=False;  if FHelp<>'' then   if HHHandle<>0 then    HtmlHelp(Application.Handle,PChar(FHelp1),HH_HELP_CONTEXT,Data);  CallHelp:=False;  Result:=true;end; procedure THHComp.Loaded;beginInherited;HHHandle:=0;// dynamic library loading to avoid exceptions on program startHHHandle:=LoadLibrary('HHCTRL.OCX');  if HHHandle<>0 then     HtmlHelp := GetProcAddress(HHHandle, 'HtmlHelpA');// Here the help system is switched to HTMLHelpApplication.OnHelp:=ShowHelp;if Assigned(Application.OnMessage) then FOldEvent:=Application.OnMessage else FOldEvent:=nil; Application.OnMessage:=CatchCardMessage;FHelp1:=ExtractFilePath(Application.exename)+FHelp;end; procedure THHComp.CatchCardMessage(var Msg: TMsg; var Handled: Boolean);beginHandled:=false;   if Msg.Message=WM_TCARD then begin    Handled:=true;    if assigned(FOnTCardEvent) then FOnTCardEvent(Msg.wParam,Msg.lParam);    end else    if assigned(FOldEvent) then FOldEvent(Msg,Handled);end; destructor THHComp.Destroy;begin // Automatically close help window if any HtmlHelp(0,PChar(FHelp1),HH_CLOSE_ALL,0); if HHHandle<>0 then begin  HtmlHelp(0,PChar(FHelp1),HH_CLOSE_ALL,0);  FreeLibrary(HHHandle);  end; inherited;end; procedure Register;begin  RegisterComponents('Install', [THHComp]);end; 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]:Усё работает. Спасибо!!!!!!!!!!!!!
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |