CSHelp
.topic 10000
Delphi supports a central property to hold the name of the help file: The property Application.helpfile.
You can either set the property manually at run time or you can specify it directly in the Delphi IDE under "Project Options":
Resulting in our first problem
When you click Browse in the dialog shown above, Delphi not only saves the file name but the full path as well.
But when your application is installed on another computer, the path may differ.
It would be better to specify only the file name without a path or use a relative path name like ".\help\myhelpfile.hlp"
If you do so, you have to place your help file in the same directory as your application is. This is generally a good idea! If your application uses more help files than only one, you may want to bundle them in a separate sub-directory, as the relative path name above illustrates.
Resulting in a secondary problem
If you do not specify a fully qualified path name for your help file, the help file is assumed to be in the current directory or in a directory relative to the current. When your application starts, the current directory is usually the application directory, of course. At the beginning, this condition is true. But the current directory may change while your application is running. What happens then? Correct! The help file is not found.
Making it always work
Fortunately, you can change the Application.helpfile property at run time as well.
The best place to do this, is the OnCreate event of your main form:
Add the following code to this event (myhelpfile.hlp has to be replaced with your real help file name):
procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.helpfile :=
extractfilepath(application.exename) + 'myhelpfile.hlp';
end;
This defines the help file including a fully qualified path (assumed that your help file is in the same directory as your application) and works in any case, whether the current directory has changed or not.
.topic 10100
Well, your Delphi application now knows that is has a help file. Fine. But how can you display the help file?
Delphi provides you with a method called
Application.Helpcommand(command, data).
This method encapsulates all help file calls. You can call the table of contents, display a specific topic, search for a keyword and much more.
Example:
procedure TFrmHelpman.mHelpContentsClick(Sender: TObject);
begin
Application.HelpCommand(HELP_FINDER, 0);
end;
The Command parameter must match one of the predefined Windows API constants and Data must be set accordingly.
The following topic explains the available parameters. The next chapter discusses almost the same, but from a more practical point of view. It tells you the how to does.
See also
Parameters of Application.HelpCommand
.topic 10200
The online help of Delphi describes the method Application.HelpCommand in a short sentence:
"Provides quick access to any of the Help commands in the WinHelp API.
function HelpCommand(Command: Word; Data: Longint): Boolean;"
This is not much, isn't it? Well, let's examine the WinHelp API. The Winhelp API defines the following constants for Command. Depending on Command, you must support an appropriate Data parameter as well. Don't worry, the following description illustrates the usage with a code example for each.
The list of available parameters:
HELP_COMMAND
Don't mistake this constant with the general "HelpCommand" function of Delphi. This constant has an underscore between help and command. It is used to execute a macro. The Data parameter is a pointer to a string that specifies the macro. A macro must also be used to display a specific topic by topic ID.
Code example to display a specific topic
Code example for another macro
HELP_CONTENTS
Displays the so-called "default topic" or the very first topic of your help file, if the "default topic" is not explicitly defined. It does not display the table of contents of a Winhelp file as its name suggests. It comes from 16 bit times when Windows help files did not have an extra table of contents but a topic instead, that displayed an overview and links to all other topics. This old "contents" topic is still alive. If the table of contents of a help file is missing, this topic is displayed when you open the help file.
Code example how to display the default topic
HELP_CONTEXT
Displays a topic by using its help context number. This is exactly what Delphi does automatically when it displays context sensitive help. The Data parameter is an integer value that represents the help context number.
Code example for context sensitive help
HELP_CONTEXTPOPUP
Displays a topic by using its help context number. This is exactly what Delphi does automatically when it displays context sensitive help. The Data parameter is an integer value that represents the help context number.
Code example
HELP_FINDER
This command actually displays the table of contents of a Windows 95 help file. The Data parameter is zero.
Code example
HELP_FORCEFILE
Ensures that WinHelp is displaying the correct Help file. If the incorrect Help file is being displayed, WinHelp opens the correct one; otherwise, there is no action.
Code example
HELP_HELPONHELP
Displays help on how to use a help file. This command forces Winhelp to open the appropriate topics of its own help file, Winhelp.hlp. The Data parameter is zero.
Code example
HELP_INDEX
This command is obsolete. Use HELP_FINDER instead.
HELP_KEY
This command searches for a single keyword:
· If the given keyword does not match any keyword of the help file, the keyword index is displayed.
· If there is only one topic, that specifies the keyword, the topic is displayed.
· If more topics than only one specify this keyword, a list of matching topics is displayed.
The Data parameter is a pointer to a string that contains the keyword to look for.
Code example for HELP_KEY
HELP_MULTIKEY
Displays the topic specified by a keyword in an alternative keyword table. Winhelp knows two types of keywords.
· K-keywords are normal keywords defined by K-footnotes. These keywords are displayed in the keyword index on the Index tab. You can also create links to other topics by using the KLink macro and K-keywords.
· A-keywords are hidden keywords defined by A-footnotes. These keywords are not displayed in the keyword index but used for context sensitive help. When you press F1 in the Delphi IDE, Delphi searches for an A-keyword matching the text the cursor is in or the selected property name in the Object Inspector. You can also create links to other topics by using the ALink macro and A-keywords.
If this keyword functionality does not satisfy you, you can define other keywords in your help file by additional footnotes (e.g. B-footnotes like Delphi did in version 2, C-footnotes and so on). The HELP_MULTIKEY command lets you access these keywords as the HELP_KEY command lets you access the normal K-keywords.
HELP_PARTIALKEY
This command works the same way as HELP_KEY.
Code example
HELP_QUIT
Closes a help file. The Data parameter is zero.
Code example
HELP_SETCONTENTS
This command is obsolete.
HELP_SETINDEX
This command is obsolete.
HELP_SETWINPOS
Sets the position and size of a help window. The Data parameter is a pointer to a THelpWinInfo structure.
Code example
.topic 1100
The following example displays the topic "howtoregister" of your help file. You may want to use it in an about dialog when your application is a demo version only. The macro "JI()" is short for "JumpID". For a complete list of available macros please refer to the help of the Microsoft help workshop (hcw.hlp).
var
command: array[0..255] of Char;
begin
command := 'JI(howtoregister)';
application.helpcommand(HELP_COMMAND, Longint(@command));
end;
You may find it easier to use the Delphi method Application.HelpJump instead.
See also:
More information about Winhelp macros
.topic 1010
Example, how to display the about box of the current help file. It uses the Winhelp macro "About()" which has no parameters.
procedure TForm1.ShowHelpAbout;
var
command: array[0..255] of Char;
begin
command := 'About()';
application.helpcommand(HELP_COMMAND, Longint(@command));
end;
If you are curious how this about box looks, click here.
See also:
More information about Winhelp macros
.topic 1020
This example displays the default topic. The data parameter is simply zero in this case:
begin
application.helpcommand(HELP_CONTENTS, 0);
end;
.topic 1030
This example displays the "table of contents" of a Windows 95 help file:
procedure TFrmHelpman.mHelpContentsClick(Sender: TObject);
begin
Application.HelpCommand(HELP_FINDER, 0);
end;
Remember: a Windows 95 (98/NT4/2000) help file consists of two files! If the table of contents is missing, Winhelp just displays the so-called default topic instead.
.topic 1040
Display context sensitive help from a HelpContext number. The topic is displayed in the main window of your help file. To display the context sensitive help as a popup topic, use HELP_CONTEXTPOPUP.
procedure TForm1.WhatsthisClick(Sender: TObject);
var
ihc: longint;
begin
if (Sender is TWincontrol) or (Sender = TMenuitem) then
begin
ihc := TWincontrol(Sender).HelpContext;
application.helpcommand(HELP_CONTEXT, ihc);
end
else showmessage('No context sensitive help available');
end;
You may find it easier to use the Delphi method Application.HelpContext instead.
By the way, this is the HelpContext property in the Delphi IDE:
See also
Command parameter HELP_CONTEXTPOPUP
About context sensitive help
.topic 1050
Display context sensitive help from a HelpContext number in a popup window.
procedure TForm1.WhatsthisClick(Sender: TObject);
var
ihc: longint;
begin
if (Sender is TWincontrol) or (Sender = TMenuitem) then
begin
ihc := TWincontrol(Sender).HelpContext;
application.helpcommand(HELP_CONTEXTPOPUP, ihc);
end
else showmessage('No context sensitive help available');
end;
See also
Command parameter HELP_CONTEXTPOPUP
About context sensitive help
.topic 1060
This example closes the help file if it is open. The data parameter is zero in this case:
begin
application.helpcommand(HELP_QUIT, 0);
end;
.topic 1070
This example displays the "help on help" topics from Winhelp.hlp.
procedure TForm1.mHelpHowtousehelp(Sender: TObject);
begin
Application.HelpCommand(HELP_HELPONHELP, 0);
end;
.topic 1080
This example searches for a single keyword.
procedure TForm1.Button1Click(Sender: TObject);
var
keyword: string;
Command: array[0..255] of Char;
begin
keyword := Edit1.text;
StrLcopy(Command, pchar(keyword), SizeOf(Command) - 1);
Application.helpcommand(HELP_KEY, Longint(@Command));
end;
.topic 1090
1. A non-working example?
This example should set the position and size of a help window. The following code should be correct. However, I never got it to work (if you do, please tell me how):
procedure TForm1.Button1Click(Sender: TObject);
var
hwi: THelpWinInfo;
begin
with hwi do
begin
wStructSize := SizeOf(hwi);
x := 0;
y := 0;
dx := 512;
dy := 512;
wMax := SW_SHOWNORMAL;
end;
Application.HelpCommand(HELP_SETWINPOS, LongInt(@HWi));
Application.HelpCommand(HELP_CONTENTS, 0);
end;
2. A working example:
Fortunately, there is also a help macro available that we can use to set the size and position of a help window. The following code is correct and works (in all cases, I hope):
procedure TForm1.Button1Click(Sender: TObject);
var
command: array[0..255] of Char;
begin
command := 'PW(0, 0, 512, 512, 1, "main")';
application.helpcommand(HELP_COMMAND, Longint(@command));
end;
What it does
The code example above uses the HELP_COMMAND constant to execute a macro. The macro we use here is "PositionWindow" or - short - "PW". It defines the upper left corner (x1, y1) as (0,0) and the lower right corner (x2, y2) as (512,512).
The following parameter is the integer constant for "SW_SHOWNORMAL". Winhelp does not recognize the string "sw_shownormal" in the macro string.
The last parameter is the name of the window.
One word about the coordinates of a help window
Te position and size of a help window always relates to a virtual screen size of 1024 x 1024 pixel, regardless of the screen resolution. If you set the size to (0, 0, 1024, 512), the help window would cover exactly the upper half of the screen.