ich bin vor Kurzem von Borland Delphi auf Lazarus umgestiegen und muss sagen, dass ich echt begeistert bin: Gute IDE, jede Menge nützliche Features.
Hier im Forum habe ich auch bereits einige nützliche Tipps gefunden und ich hoffe, ihr könnt mir auch bei folgendem Problem helfen.
Ich habe meine vorhandenen Projekte (sofern nötig) nach Lazarus portiert. Nun verwende ich allerdings auch Hilfedateien im CHM-Format und da habe ich einige Probleme bei der Einbindung.
Wie ich gelesen habe, können die Komponenten THTMLHelpDatabase und THTMLBrowserHelpViewer verwendet werden. Ich habe auch bereits die der IDE beiliegende Beispielanwendung getestet - funktioniert einwandfrei. Das Problem ist nur, dass die Hilfetexte als einzelne Webseiten in einem Ordner vorliegen müssen. Ich habe keine Möglichkeit gefunden, eine fertig zusammengepackte CHM-Datei anzusprechen.
Da die Anwendung nur unter Windows laufen soll, habe ich mir überlegt, die Hilfe per Aufruf der hh.exe einzubinden. Unter Verwendung der ShellExecute-Funktion oder TProcess-Komponente klappt das auch problemlos. Wenn ich allerdings der Formulareigenschaft HelpContext einen Wert zuweise, damit ein bestimmtes Thema auch durch Drücken der Taste F1 angezeigt werden kann, dann funktioniert das natürlich nicht.
Zu diesem Zweck wollte ich einen HelpHook definieren und im Applikationsobjekt registrieren.
Das Problem ist nun Folgendes:
Wenn ich ein Hilfethema durch Klicken einer Schaltfläche aufrufen möchte, passiert überhaupt nichts.
Wenn ich F1 drücke, wird zwar der Hook aktiv, die EventHandler-Methode bekommt jedoch nur unsinnige Werte übergeben - der Parameter Command ist 0 und der Parameter Data irgendwas um 32 Mio.
Code: Alles auswählen
unit unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls;
type
THelpHandler = class
private
FChmFile: String;
FOldHelpEvent: THelpEvent;
function HandleEvent(Command: Word; Data: PtrInt; var CallHelp: Boolean): Boolean;
public
constructor Create(AChmFile: String);
destructor Destroy; override;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
HelpHook: THelpHandler;
implementation
constructor THelpHandler.Create(AChmFile: String);
begin
FChmFile := AChmFile;
FOldHelpEvent := Application.OnHelp;
Application.OnHelp := @HandleEvent;
end;
destructor THelpHandler.Destroy;
begin
Application.OnHelp := FOldHelpEvent;
inherited Destroy;
end;
function THelpHandler.HandleEvent(Command: Word; Data: PtrInt; var CallHelp: Boolean): Boolean;
begin
Result := True;
ShowMessage(IntToStr(Command));
ShowMessage(IntToStr(Data));
// Aufruf von hh.exe mit Parametern
CallHelp := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HelpContext := 1001;
HelpHook := THelpHandler.Create('Hilfe.chm');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
HelpHook.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.HelpContext(1001);
end;
initialization
{$I unit1.lrs}
end.
Ich hoffe mir kann jemand einen Tiupp geben.
Vielen Dank schonmal und viele Grüße
Kay
PS: Ich verwende Lazarus 0.9.28.2 mit FPC 2.2.4 auf Windows XP (SP3).