IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
Статьи по Delphi - Help файлы, Работа с Help файлами
yuansw
сообщение 21.09.2005 - 18:47
Сообщение #1


Черный человек
Иконка группы

Группа: Модераторы
Пользователь №: 9425
Сообщений: 729
Регистрация: 20.01.2005
Из: Междуреченск
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 11 раз(а)



Вариант использования HTML Help в Делфи

Код

// 1) После Uses... добавляешь:
const
 HH_DISPLAY_TOPIC = $0000;
 HH_HELP_FINDER = $0000; // WinHelp equivalent
 HH_GET_WIN_HANDLE = $0006;
 HH_DISPLAY_TEXT_POPUP = $000E;
   // display string resource id or text in a popup window
 HH_HELP_CONTEXT = $000F; // display mapped numeric value in dwData
 HH_HELP_CONTEXTMENU = $0010; // text popup help

// 2) Перед секцией Implementation добавляешь:

function HtmlHelp(
 hwndCaller: HWND;
 pszFile: string;
 uCommand: Integer;
 dwData: integer): HWND; stdcall; external 'hhctrl.ocx' name 'HtmlHelpA';

// 3) В разделе Private у класса формы добавляешь:

procedure WMHelp(var aMessage: TWMHelp); message WM_HELP;

// 4) В разделе implementation пишешь:

// Если смотрим помощь по пунктам меню
function GetMenuHelpContext(Menu: TMenu; aMessage: TWMHelp): Integer;
begin
 Result := 0;
 if (Menu <> nil) then
 begin
   Result := Menu.GetHelpContext(aMessage.HelpInfo.iCtrlId, true);
   if (Result = 0) then
     Result := Menu.GetHelpContext(aMessage.HelpInfo.hItemHandle, false);
 end;
end;

procedure TForm1.WMHelp(var aMessage: TWMHelp); // Предполагается, что класс
// формы называется TForm1
var
 Control: TWinControl;
 ContextId: integer;
 hlp: HWND;
begin
 if (aMessage.HelpInfo.iContextType = HELPINFO_WINDOW) then
 begin
   Control := FindControl(aMessage.HelpInfo.hItemHandle);
     // Ищем активный компонент
   while ((Control <> nil) and (Control.HelpContext = 0)) do
     Control := Control.Parent;
   if (Control = nil) then
     Exit;
   ContextId := Control.HelpContext; // Смотрим у него HelpContext
 end
 else
 begin
   ContextId := GetMenuHelpContext(Menu, aMessage); // Для меню
   if (ContextId = 0) then
     ContextId := GetMenuHelpContext(PopupMenu, aMessage);
 end;
 hlp := HtmlHelp(Handle, 'c:\WINDOWS\Help\joy.chm', HH_HELP_CONTEXT,
   ContextId);
 if (hlp = 0) then
   ShowMessage('Помощь не найдена!');
end;

// 5) вместо 'c:\WINDOWS\Help\joy.chm' - подставляешь свой CHM - файл.

Пример использования:
F1 в запущенной программе

Сообщение отредактировал yuansw - 28.09.2005 - 07:41
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
yuansw
сообщение 24.09.2005 - 01:05
Сообщение #2


Черный человек
Иконка группы

Группа: Модераторы
Пользователь №: 9425
Сообщений: 729
Регистрация: 20.01.2005
Из: Междуреченск
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 11 раз(а)



Вывод справочной информации

Чтобы вывести справочную информацию, которая находится в СНМ-файле, нужно воспользоваться ActiveX-компонентом (элементом управления) Hhopen, который входит в состав Windows и представляет собой специальную динамическую библиотеку (файл Hhopen.ocx).

Первое, что следует сделать, — установить компонент Hhopen на одну из вкладок палитры компонентов. Для этого надо из меню Component выбрать команду Import ActiveX Control. На экране появится окно Import ActiveX, в котором будут перечислены все зарегистрированные в реестре Windows компоненты. В окне Import ActiveX, в списке зарегистрированных компонентов, нужно выбрать строку hhopen OLE Control module и щелкнуть на кнопке Install. В результате этого на экране появится диалоговое окно Install, в котором программист может выбрать пакет (package — пакет, библиотека компонентов), в который будет добавлен устанавливаемый компонент. Компоненты, добавляемые программистом, "по умолчанию" добавляются в пакет dclusr. В результате щелчка на кнопке ОК выбранный компонент добавляется в пакет, и на экране появляется окно Package и запрос подтверждения процесса перекомпиляции пакета. По завершении процесса компиляции на экране появится окно, информирующее о том, что компонент добавлен в пакет и зарегистрирован . Значок компонента ньореп будет добавлен на вкладку ActiveX. В процессе компиляции будет создан файл представления компонента -- модуль HHOPENLib_TLIB.pas, который содержит описание методов, свойств и событий компонента.

Модуль представления можно увидеть, загрузив его в редактор кода из каталога \Delphi 7\Lib. Пролистав в окне редактора кода модуль HHOPENLib_TLIB.pas, который представляет собой интерфейс для доступа к элементу управления, можно найти описание класса THhopen

Код
THhopen = class(Telecontrol)
private
 FIntf: _DHhopen;
 function GetControlInterface: _DHhopen;
protected
 procedure CreateControl;
 procedure InitControlData; override;
public
 function OpenHelp(const HelpFile: WideString;
   const HelpSection: WideString): Integer;
 procedure CloseHelp;
 property ControlInterface: _DHhopen read GetControlInterface;
 property DefaultInterface: _DHhopen read GetControlInterface;
published
 property isHelpOpened: WordBool index 1
 read GetWordBoolProp
 write SetWordBoolProp
 stored False;
end;

Класс THhOpen предоставляет два метода: OpenHelp и CloseHelp.

Метод OpenHelp обеспечивает вывод справочной информации, метод close-Help — закрывает окно справочной системы.

У метода OpenHelp два параметра — имя файла справочной информации и имя раздела, содержимое которого будет выведено. В качестве имени раздела надо использовать имя HTML-файла, который применялся программой HTML Help Workshop в процессе создания СНМ-файла. Следует обратить внимание на то, что оба параметра должны быть строками widechar.

Следующая программа, ее диалоговое окно приведено на рис. 14.10, а текст — в листинге 14.2, демонстрирует использование ActiveX-компонента Hhopen для вывода справочной информации. Компонент Hhopen добавляется в форму обычным образом. Так как во время работы программы он не отображается, то его можно поместить в любое место формы.

Код
interface

uses
 Windows, Messages, SysUtils,
 Classes, Graphics, Controls,
 Forms, Dialogs, OleCtrls, HHOPENLibJTLB, StdCtrls;

type
 TForm1 = class(TForm)Label1: TLabel;
   Editl: TEdit; // файл справки
   Edit2: TEdit; //раздел справки (имя HTML-файла)
   Button1: TButton; // кнопка Справка
   Hhopen1: THhopen; // ActiveX-компонент Hhopen
   Label2: TLabel;
   Label3: TLabel;
   procedure ButtonlClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
{$R *.DFM}

// щелчок на кнопке Справка
procedure TForm1.Button1Click(Sender: TObject);
var
 HelpFile: string; // файл справки
 HelpTopic: string; // раздел справки
 pwHelpFile: PWideChar;
 // файл справки (указатель на строку WideChar)
 pwHelpTopic: PWideChar;
 // раздел (указатель на строку WideChar)
begin
 HelpFile := Edit1.Text;
 HelpTopic := Edit2.Text;
 // выделить память для строк WideChar
 GetMemfpwHelpFile, Length(HelpFile) * 2);
 GetMemfpwHelpTopic, Length(HelpTopic) * 2);
 // преобразовать Ansi-строку в WideString-строку
 pwHelpFile := StringToWideChar(HelpFile, pwHelpFile, MAX_PATH * 2)
 pwHelpTopic := StringToWideChar(HelpTopic, pwHelpTopic, 32);
 // вывести справочную информацию
 Form1.Hhopen1.OpenHelp(pwHelpFile, pwHelpTopic);
end;

end.


Вывод справочной информации выполняет процедура обработки события OnClick на кнопке Справка. Так как параметры метода OpenHelp должны быть строками widechar, то сначала выполняется преобразование ANSI-строки В строку WideChar.

Сообщение отредактировал yuansw - 28.09.2005 - 07:41
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
yuansw
сообщение 28.09.2005 - 07:39
Сообщение #3


Черный человек
Иконка группы

Группа: Модераторы
Пользователь №: 9425
Сообщений: 729
Регистрация: 20.01.2005
Из: Междуреченск
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 11 раз(а)



Доступ к справочной информации


Для того чтобы во время работы программы пользователь, нажав клавишу , мог получить справочную информацию, надо чтобы свойство HelpFile главного окна приложения содержало имя файла справочной системы, а свойство HelpContext числовой идентификатор нужного раздела. Вспомните, идентификаторы разделов справочной системы перечислены в разделе [MAP] файла проекта справочной системы.

Файл справочной системы приложения лучше поместить в ту папку, в которой находится файл исполняемой программы.

Для каждого компонента формы, например поля ввода, можно задать свой раздел справки. Раздел справки, который появляется, если фокус находится на компоненте, и пользователь нажимает клавишу , определяется значением свойства Heipcontext этого компонента. Если значение свойства HelpContext элемента управления равно нулю, то при нажатии клавиши появляется тот раздел справки, который задан для формы приложения.

Если в диалоговом окне есть кнопка Справка, то справочная информация выводится по-другому — для кнопки создается процедура обработки события onclick, которая обращением к функции winheip запускает программу Windows Help (файл Winhlp32.exe). При вызове функции winheip в качестве параметров указываются: идентификатор окна, которое запрашивает справочную информацию; имя файла справочной системы; константа, определяющая действие, которое должна выполнить программа Windows Help и уточняющий параметр.

Примечание

Идентификатор окна — это свойство Handle формы приложения. Свойство Handle доступно только во время работы программы, поэтому в списке свойств в окне Object Inspector его нет.

Если необходимо вывести конкретный раздел справки, то в качестве параметра, определяющего действие, используется константа HELP_CONTEXT. Уточняющий параметр в этом случае задает раздел справки, который будет выведен на экран.

Ниже, в качестве примера, приведена процедура обработки события Onclick для кнопки Справка (Button4) диалогового окна программы решения квадратного уравнения.

Код
// щелчок на кнопке Справка
procedure TForm1.Button4Click(Sender: TObject);
begin
 winhelp(Form1.Handle, 'sqroot.hip', HELP_CONTEXT, 1);
end;


HTML Help Workshop

Современные программы выводят справочную информацию в Internet-стиле — окно, которое используется для вывода справки, напоминает окно Internet Explorer. И это не удивительно, так как для вывода справочной информации используются компоненты, составляющие основу Microsoft Internet Explorer. Система отображения справочной информации является частью операционной системы, поэтому никакие дополнительные средства для вывода справочной информации не нужны.

Физически справочная информация находится в файлах с расширением chm. СНМ-файл — это так называемый компилированный HTML-документ. СНМ-файл получается путем компиляции (объединения) файлов, составляющих HTML-документ, который, как правило, состоит из нескольких HTML-файлов.

Процесс преобразования HTML-документа в справочную систему называют компиляцией. Исходной информацией для компилятора справочной системы являются HTML-файлы, файлы иллюстраций и файл проекта. В результате компиляции получается СНМ-файл, содержащий всю справочную информацию.

Наиболее просто создать справочную систему можно при помощи программы Microsoft HTML Help Workshop.

Чтобы создать справочную систему, нужно:

* подготовить файлы справочной информации;
* создать файл проекта;
* создать файл контекста (содержания);
* выполнить компиляцию.

Последние три из перечисленных выше шагов выполняются в программе HTML Help Workshop.

Закрытие файла помощи


При закрытии моего приложения окно помощи (если оно в это время открыто) автоматически не закрывается! Как мне сделать так, чтобы оно также закрывалось автоматически?

Попробуйте так:

Код
Application.HelpCommand(HELP_QUIT, 0);



Использование справки HTML Help


Код
unit uHtmlHelp;

interface
uses Windows;
function HtmlHelpA(hwndCaller: HWND; pszFile: PAnsiChar;
 uCommand: UInt; dwData: DWORD): HWND; stdcall; external 'hhctrl.ocx';

implementation

end.

unit SDIMAIN;
// Main Window
interface

uses........., uHtmlHelp, .....;

const
 HH_CLOSE_ALL = $0012;

 ......
 ......

function TSDIAppForm.FormHelp(Command: Word; Data: Integer;
 var CallHelp: Boolean): Boolean;
begin
 HtmlHelpA(handle, PChar(m_HelpFile), 15, Data);
 CallHelp := true;
end;

procedure TSDIAppForm.FormClose(Sender: TObject;
 var Action: TCloseAction);
begin
 ...........
 HtmlHelpA(handle, PChar(m_HelpFile), HH_CLOSE_ALL, 0);
end;

end.


Сообщение отредактировал yuansw - 28.09.2005 - 07:40
Перейти в начало страницы
Вставить ник
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 29.07.2025 - 08:58