如何按F1键显示帮助文件(*.CHM)格式.(50分)

  • 主题发起人 主题发起人 hj007008
  • 开始时间 开始时间
H

hj007008

Unregistered / Unconfirmed
GUEST, unregistred user!
如何按F1键显示帮助文件(*.CHM)格式.
 
在加50分
 
注册热键
winexec('*.chm', sw_shownormal)
 
我的笨方法:
在菜单上建一个帮助,把快捷键设为F1,菜单的帮助项点击就执行下以代码:

ShellExecute(0, nil, pchar(ExtractFilePath(Application.Exename)+'HELP.chm'), nil, nil, SW_NORMAL);
 
上面的方法比较简单,想专业一点 旧用HtmlHelp.pas
 
Delphi并不支持HTML HELP帮助系统,它仍然使用WinHelp。不过调用Windows系统目录System32下的HHCTRL.OCX,利用其中的HtmlHelpA函数接口可以自行实现HTML HELP帮助。
公共模块代码如下:


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.


?
两个函数分别初始化和释放调用接口。其它模块只须按约定调用即可。例如:
HtmlHelp( handle, htmlhelpfilename+'::/welcome.htm',$0000, nil);
显示htmlhelpfilename对应的帮助文件的welcome页面。
上下文敏感帮助需要借用Delphi对WinHelp的支持。当用户按 F1 键时,程序将自动触发OnHelp事件,截获它,编写自己的处理代码即可。


... ...
Application.HelpFile := htmlhelpfilename;
tmpOnHelp := Application.OnHelp;
Application.OnHelp := AppHtmlHelp;
... ...
?
function TForm1.AppHtmlHelp(Command: Word; Data: Longint;
var CallHelp: Boolean): Boolean;
var ret:integer;Hfile:string;
begin
if not CallHelp then exit;
AppPath := ExtractFilePath(Application.ExeName);
Hfile := AppPath + Application.HelpFile;
case Command of
HELP_FINDER, HELP_CONTENTS:
ret := HtmlHelp(handle, pchar(Hfile), $0001, nil);
HELP_QUIT:
ret := HtmlHelp(0, '', $0012, nil);
HELP_CONTEXT:
ret := HtmlHelp(handle, pchar(Hfile), $000f, DWORD_PTR(data));
end;
result:=ret&amp;lt;&amp;gt;0;
?
CallHelp := False;
end;


这样,我们就有另一种方法调用帮助文件,与传统WinHelp调用方法一样:


application.helpcommand(HELP_FINDER, 0);
application.helpcommand(HELP_quit, 0);


... ...
 
应该是以上的一些方法,因为Delphi 6依然不直接支持 Chm 格式。
 
留下你地e_mail,我发个例子给你!
 
wangxing0123456@sina.com
 
HHControlInstance := LoadLibrary( P );
这句话出错。我用的delphi6
left side cannot be assigned to .

 
hj007008:我已将CHM 帮助例子发给了你,注意查收!
按F1键:
procedure Tmain_rc_Form.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = VK_F1 then
begin
//调用例子中函数
end;
end;
 
怎么没有收到了
有没有发错我地信箱:
wingxing0123456@sina.com
 
我也想要
bill_max@sina.com
 
hj007008:再发!
 
hj007008:你的邮箱可能有问题,再发失败!
 
我也想要
liuru@sina.com
 
sian 的邮箱多次传送失败!换个邮箱吧。
 
多人接受答案了。
 
后退
顶部