我做了个chm的帮助文件,怎样把他加到程序中去呢?(50分)

  • 主题发起人 主题发起人 dsq1980
  • 开始时间 开始时间
D

dsq1980

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了个chm的帮助文件,怎样把他加到程序中去呢?
 
Function HtmlHelp(hwd : integer;pszFile : String;uCommand :Integer;dwData :LongInt):integer;
stdcall;external 'HHCtrl.ocx' name 'HtmlHelpA';
 
这行吗,我的文件不是html格式的啊,是chm格式的
请给出代码,谢谢
 
你想作到什么样的程度?
是笼统的调用帮助文件,
还是根据不同的HelpContext
来调用不同的帮助内容?
 
笼统的调用帮助文件吧,如果要根据不同的HelpContext
来调用不同的帮助内容,是不是要hlp格式的文件啊
 
chm的文件也可以作到!
 
那我现在只需要直接打开chm格式的文件该怎么写代码?
 
如果直接打开chm程序的话可以使用shell函数打开(把它当成exe文件)
不过你要加到你的application.onhelp事件中
 
不知是不是在程序中调用CHM帮助文件,如果这样,到JEDI的网站上有相关的演示程序。
www.delphi-jedi.org
 
我给你的就是调用chm帮助文件的。
CHM帮助文件的编程实现
声明HtmlHelp API函数
由于HtmlHelp API 并没有集成在Windows操作系统的API中,因此不能直接调用HtmlHelp.lib 库函数,但
HtmlHelp API的功能位于hhctrl.ocx中,这样可以通过调用hhctrl.lib库函数来显示帮助文件,
其声明格式如下:
Declare Function Htmlhelp Lib "hhctrl.ocx"Alias "HtmlHelpA"
(ByVal hwndCaller As Long,
ByVal pszFile As String,
ByVal uCommand As Long,
ByVal dwData As Any) As Long

具体参数含义如下:
hwndCaller 调用该函数的窗体句柄
pszFile 帮助文件的名称和位置
uCommand 帮助类型
dwData 与uCommand相匹配的附加参数
定义uCommand 常数
Const HH_DISPLAY_TOPIC = &H0
Const HH_DISPLAY_INDEX=&H2
Const HH_HELP_CONTEXT = &HF
Const HH_DISPLAY_SEARCH= &H3
Const HH_DISPLAY_TEXT_POPUP= &HE
接着指定CHM文件的名称和位置:
App.HelpFile=App.Path &
"/Sample.CHM"

程序调用
调用缺省主题帮助
Call HtmlHelp(hwnd,
App.HelpFile,
HH_DISPLAY_TOPIC,
ByVal "Default.htm")

此调用方式用于没有上下文ID号的情形,dwData可指定一个在CHM文件内的缺省htm文件,也可取NULL,这是
HtmlHelp API最基本的一种用法。
调用关键字帮助
Call HtmlHelp(hwnd,
App.HelpFile,
HH_DISPLAY_INDEX,
(DWORD)"关键字"))

此调用方式中dwData取索引文件(.hhk)中存在的关键字。
调用上下文敏感帮助
Call HtmlHelp(hwnd,
App.HelpFile,
HH_HELP_CONTEXT, 1000)

此调用方式用于含有映射信息的CHM文件, dwData取映射表中存在的ID号。
调用全文搜索帮助
Dim Query As HH_FTS_QUERY
Call HtmlHelp(hwnd,
App.HelpFile,
HH_DISPLAY_SEARCH,
(DWORD)&
Query)

DwData参数指定一个指向HH_FTS_QUERY结构的指针。
调用弹出式帮助
Dim Popup As HH_POPUP
Call HtmlHelp(hwnd,
NULL,
HH_DISPLAY_TEXT_POPUP,
(DWORD)&Popup)

PszFile通常取NULL,也可以指定一个CHM和一个在该CHM文件中的TEXT文件,DwData用于指定一个指向HH_POPUP结
构的指针。
指定显示窗体形式
由于显示帮助文件的缺省窗体是在编译该CHM文件时的窗体,因此为了更好地控制帮助文件的显示,在制作CHM文
件时,可以自定义一个窗体形式。在程序中可以通过两种方法来调用自定义窗体。
1.当uCommand 为HH_DISPLAY_TOPIC或HH_HELP_CONTEXT时,在pszFile参数中用“>”符号,其后跟上窗体名称即可。如pszFile取:
App.HelpFile &
"> MainWin"
2.用HtmlHelp函数直接指定:
Dim WinType As HH_WINTYPE
Call HtmlHelp(hwnd,
App.HelpFile &" > MainWin",
HH_SET_WIN_TYPE,
(DWORD) &WinType)

必须声明的是,以上叙述中使用的“Sample.CHM”、“Default.htm”、“关键字”、“1000”和“MainWin”等
均属举例,应用中需要根据自己的具体情况来设置这些参数的实际值。

至此,应用程序的帮助系统就建立起来了,当然,要把帮助系统做得更完美一点,还有更多的工作要做。
 
ShellExecute(fm.Handle, nil, 'help.chm', '', '', SW_SHOWNORMAL);//help.chm改为你自己的
 
首先建立一个通用单元:
////////////////////////////////////////////////////
unit HTMLHELPCOMMON;
interface
uses Windows;
type
DWORD_PTR = ^DWORD;
Function HtmlHelp(hwndCaller:HWND;strFile:String;
uCommand:UINT;
dwData:DWORD_PTR ):HWND;
procedure CloseHtmlHelp;
implementation
uses SysUtils;
const
HHControlInstance:THandle=0;
dwCookie :DWORD = 0;
var
HtmlHelpA:function ( hwndCaller:HWND;
pszFile:PChar ;
uCommand:UINT;
dwData:DWORD_PTR ):HWND;stdcall;
function HtmlHelp(hwndCaller:HWND;strFile:String;uCommand:UINT;
dwData:DWORD_PTR ):HWND;
var
LFileName:String;
p:PChar;
begin
if HHControlInstance=0 then
begin
LFileName := StringOfChar( ' ', 256);
p := PChar( LFilename );
GetSystemDirectory(p,255);
StrCat(p,'/hhctrl.ocx');
HHControlInstance := LoadLibrary( P );
if HHControlInstance = 0 then
raise exception.Create('Help system not installed!'#13' HTMLHELP cannot displayed!');
@HtmlHelpA := GetProcAddress( HHControlInstance, 'HtmlHelpA');
if @HtmlHelpA = nil then
raise exception.Create('Function HTMLHELP cannot loaded!');
HtmlHelpA( 0, nil,$001C , (@dwCookie));
end;
result := HtmlHelpA( hwndCaller, PChar( strFile ), uCommand, dwData );
end;

procedure CloseHtmlHelp;
begin
if HHControlInstance<>0 then
begin
HtmlHelpA( 0, nil, $001D, DWORD_PTR(dwCookie));
FreeLibrary(HHControlInstance);
end;
end;

end.

在主窗体中:
定义函数
function TMainForm.AppHtmlHelp(Command: Word;
Data: Longint;
var CallHelp: Boolean): Boolean;
var
ret:integer;
Hfile,AppPath:string;
begin

if not CallHelp then
exit;
AppPath := ExtractFilePath(Application.ExeName);
Hfile := Application.HelpFile;
case Command of
HELP_FINDER, HELP_CONTENTS:
ret := HtmlHelp(application.handle, pchar(Hfile), $0001, nil);
HELP_QUIT:
ret := HtmlHelp(application.handle, '', HELP_QUIT, nil);
//ret := HtmlHelp(application.handle, '', $0012, nil);
HELP_CONTEXT:
ret := HtmlHelp(application.handle, pchar(Hfile), $000f, DWORD_PTR(data));
//Data:HelpContext的值
end;
result:=ret<>0;
CallHelp := False;
end;

//Create事件中加入
procedure TMainForm.FormCreate(Sender: TObject);
var
HtmlHelpFileName:string;
begin
HtmlHelpFileName:=ExtractFilePath(Application.ExeName)+'ngmfhelp.chm';
Application.HelpFile := HtmlHelpFileName;
Application.OnHelp := AppHtmlHelp;
//self.Brush.Bitmap:=image1.Picture.Bitmap;
end;

//在调用帮助的事件中写入如下代码 :
Application.HelpCommand(HELP_FINDER,1);
 
我直接用下面的代码可以打开,但我看onlyonekgx用了这么多,是不是我下面的代码有问题?
implementation
Function HtmlHelp(hwd : integer;pszFile : String;uCommand :Integer;dwData :LongInt):integer;
stdcall;external 'HHCtrl.ocx' name 'HtmlHelpA';
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
application.HelpFile:='aaa.chm';
HtmlHelp(handle,application.HelpFile,0,0);
end;

我用shell打开的话不行
ShellExecute(Handle, nil, 'aaa.chm', '', '', SW_SHOWNORMAL);
出现[Error] Unit1.pas(36): Undeclared identifier: 'ShellExecute'
是不是没声明啊?
 
Use ShellAPI

我的方法是可以同控件的
HelpContext属性关联起来,
其实你只要拷贝上面的代码就可以直接使用了
按F1 就可以调用出相应的帮助内容
 
很简单的啦
当前目录下:
ShellExecute(0, nil, PChar('?.chm'), nil, nil, SW_NORMAL);
如果带路径:
sss为路径
ShellExecute(0, nil, PChar(sss+ '?.chm'), nil, nil, SW_NORMAL);
包你没问题!
 
to onlyonekgx:
我正在试,但好象通不过
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMainForm = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
function TMainForm.AppHtmlHelp(Command: Word;
Data: Longint;
var CallHelp: Boolean): Boolean;
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;
implementation
{$R *.dfm}
function TMainForm.AppHtmlHelp(Command: Word;
Data: Longint;
var CallHelp: Boolean): Boolean;
var
ret:integer;
Hfile,AppPath:string;
begin

if not CallHelp then
exit;
AppPath := ExtractFilePath(Application.ExeName);
Hfile := Application.HelpFile;
case Command of
HELP_FINDER, HELP_CONTENTS:
ret := HtmlHelp(application.handle, pchar(Hfile), $0001, nil);
HELP_QUIT:
ret := HtmlHelp(application.handle, '', HELP_QUIT, nil);
//ret := HtmlHelp(application.handle, '', $0012, nil);
HELP_CONTEXT:
ret := HtmlHelp(application.handle, pchar(Hfile), $000f, DWORD_PTR(data));
//Data:HelpContext的值
end;
result:=ret<>0;
CallHelp := False;
end;

//Create事件中加入
procedure TMainForm.FormCreate(Sender: TObject);
var
HtmlHelpFileName:string;
begin
HtmlHelpFileName:=ExtractFilePath(Application.ExeName)+'aaa.chm';
Application.HelpFile := HtmlHelpFileName;
Application.OnHelp := AppHtmlHelp;
//self.Brush.Bitmap:=image1.Picture.Bitmap;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
Application.HelpCommand(HELP_FINDER,1);
end;

end.
函数声明
function TMainForm.AppHtmlHelp(Command: Word;
Data: Longint;
var CallHelp: Boolean): Boolean;
就出错,
那个HTMLHELPCOMMON.pas已经加上了
 
ShellExecute(NULL,"open","help.chm",NULL,NULL,SW_SHOWNORMAL);
// 执行exe文件
str="notepad "+filename;
WinExec(str, SW_SHOW);
//利用记事本打开生成的文本文件
WinExec("Welcome.exe",SW_SHOW);
WinExec("Calc.exe",SW_SHOW);
WinExec("Cdplayer.exe",SW_SHOW);
WinExec("Freecell.exe",SW_SHOW);
// 空档接龙
WinExec("sol.exe",SW_SHOW); // 纸牌
// 打开一个目录 或者 网站
ShellExecute(NULL, _T("open"), _T("e://技术文章//VC++"), NULL,NULL, SW_SHOW);
ShellExecute(NULL, _T("open"), _T("www.china.com"), NULL,NULL, SW_SHOW);
ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);
ShellExecute(NULL,"open","mailto:zxn@hq.cninfo.net",NULL,NULL,SW_SHOWNORMAL);
ShellExecute(NULL,"print","e://1.txt",NULL,NULL,SW_HIDE );
ShellExecute(NULL,"print","e://1.bmp",NULL,NULL,SW_SHOW ); // 打开图片
// 你可以给它任何文件的名字,它都能识别出来并打开它。甚至是桌面和URL快捷方式(.ink或 .url)。还能打开Internet的站点地址。ShellExecute还能识别其它协议,象FTP、GOPHER。
// 如果将第二个参数“OPEN”改为“PRINT”或者“EXPLORE”,ShellExecute将能打印文件和打开文件夹。ShellExecute还有一个扩展函数ShellExecuteEx,所带参数中有一个特殊的结构,功能更强,它的用法参见有关文档。
// ShellExecute 返回打开文件的应用的实例句柄。
SHELLEXECUTEINFO
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c://MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
 
声明
function TMainForm.AppHtmlHelp(Command: Word;
Data: Longint;
var CallHelp: Boolean): Boolean;
应该是:
function AppHtmlHelp(Command: Word;
Data: Longint;
var CallHelp: Boolean): Boolean;
 
下载看看先
http://mydelphi.8u8.com/download/chm.zip
 
…………
StrCat(p,'/hhctrl.ocx');
HHControlInstance := LoadLibrary( P );//这行报错
[Error] HTMLHELPCOMMON.pas(35): Left side cannot be assigned to
 
后退
顶部