|
Вопрос # 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;
-
- implementation
- const
- 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;
- begin
- Inherited;
- HHHandle:=0;
- // dynamic library loading to avoid exceptions on program start
- HHHandle:=LoadLibrary('HHCTRL.OCX');
- if HHHandle<>0 then
- HtmlHelp := GetProcAddress(HHHandle, 'HtmlHelpA');
- // Here the help system is switched to HTMLHelp
- Application.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);
- begin
- Handled:=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]:
Усё работает.
Спасибо!!!!!!!!!!!!!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|