Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Hilfe einbinden - klappt nur halb ?! (https://www.delphipraxis.net/45988-hilfe-einbinden-klappt-nur-halb.html)

moelski 16. Mai 2005 09:48


Hilfe einbinden - klappt nur halb ?!
 
Moin !

Ich versuche gerade eine Hilfe in meine Anwendung einzubauen. So irgendwie funzt das schon, aber nicht so recht.

Also, ich nutze folgendes:
Tutorial: http://www.dsdt.info/tutorials/htmlhelp/
Header bzw. Fix von hier: http://www.helpware.net/delphi/index.html
Popup Info hier: http://www.helpware.net/htmlhelp/how_to_whatsthis.htm
Achja und ich nutze D6.

Soweit so gut. Nun habe ich zum Erstellen von der CHM-Hilfe das Tool Help & Manual. Aber das ist sicherlich erstmal Nebensache. Nun verwende ich folgenden Code in meinem Projekt (biHelp ist auf True gesetzt!):

Delphi-Quellcode:
{Alle 'Whats This' und F1 Help_ContextPopup WinHelp-Ereignisse werden
hier ankommen}
procedure F1HelpEvent(ContextHelpID: Longint; X, Y: Integer);
var hhpopup: HH.THHPopup;
begin
  with hhpopup do begin
    // Größe dieser Struktur
    cbStruct := SizeOf(hhpopup);

    // Instanz-Handle für String-Ressource
    hinst := 0;

    // Enthält 0, eine Ressourcen-ID oder eine Topic-ID in
    // einer Textdatei
    idString := ContextHelpID;

    // Enthält den Text, der angezeigt werden soll, wenn idString 0 ist
    pszText := nil;

    // top center (in Pixeln) des Popup-Fensters
    pt := Point(x,y);

    // Textfarbe, verwende -1 für Standard; RGB-Wert (hier rot)
    clrForeground := COLORREF($000000FF);

    // Hintergrundfarbe, verwende -1 für Standard; RGB-Wert
    clrBackground := COLORREF(-1);

    // Anzahl an Leerzeichen zwischen Fensterrand und Text, -1 für
    // jeden Teil zum Ignorieren
    rcMargins := Rect(-1,-1,-1,-1);

    // Schrift: facename, point size, char set, BOLD ITALIC UNDERLINE
    pszFont := '';
  end;
  HtmlHelp(Form1.Handle,
    PChar(ExtractFilePath(ParamStr(0))+'Hilfe\Hilfe.chm::/Cshelp.txt'),
    HH_DISPLAY_TEXT_POPUP, DWORD(@hhpopup));
end;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var chmFile: string;
begin
  chmFile := ExtractFilePath(ParamStr(0))+'Hilfe\Hilfe.chm';

  mHHelp := nil;

  if not FileExists(chmFile) then
    ShowMessage('Hilfe-Datei nicht gefunden'#13+chmFile);

  {HH 1.2 oder höher Versionskontrolle}
  if (hh.HHCtrlHandle = 0)
    or (hh_funcs._hhMajVer < 4)
    or ((hh_funcs._hhMajVer = 4) and (hh_funcs._hhMinVer < 73)) then
      ShowMessage('Diese Anwendung erfordert die Installation der '+
      'MS HTML Help 1.2 oder höher');

  {Hook - verwendet HH_FUNCS.pas}
  mHHelp := hh_funcs.THookHelpSystem.Create(chmFile, '', htHHAPI);
  mHHelp.HelpCallback2 := F1HelpEvent;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  HHCloseAll; // Schließt alle Hilfe-Fenster
  if Assigned(mHHelp) then
    mHHelp.Free;
end;

procedure TForm1.TBXItem2Click(Sender: TObject);
begin
  DefWindowProc(handle, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
end;
Nun passieren aber ganz seltsame Dinge ... Wenn ich z.B. die F1 Taste drücke dann kommt ein Popup. An dieser Stelle (also direkt nach dem Programmstart) sollte aber doch dann die Hilfe aufgehen, oder sehe ich da was falsch?
Eigentlich will ich die Popups doch nur, wenn ich auch den Button TBXItem2 angeklickt habe. Dieser Button hat bei mir aber garkeine Funktion.
Und dann noch eine Frage im Zusammenhang mit den Popups ... Angenommen ich habe da jetzt ein Label wo ich eine HilfeID vergebe. Nun kann ich ja auf die ID ein Popup "binden". Bedeutet das dann, das ich jetzt keine "normale" Hilfe mehr zu dem Label haben kann? Also ein Text in der HTML-Hilfe.

Und ich verstehe auch nicht so ganz die Sache mit den Popuptexten. Werden die jetzt in das CHM File mit reinkompiliert, oder muss ich die Datei extra mitliefern!?

Hoffe jemand kann mir ein paar Tips geben :gruebel:

MathiasSimmack 16. Mai 2005 10:04

Re: Hilfe einbinden - klappt nur halb ?!
 
Die Popups werden entweder in die Hilfedatei kompiliert, oder du rufst die Texte mit Hilfe der zuerst gezeigten Funktion auf. Im ersten Fall erfolgt die Zuordnung über die besagte numerische ID, die du im Objektinspektor einschaltest. Ansonsten kann man auch einen Text benutzen. Die Kommentare der Funktion "F1HelpEvent" sind IMHO aussagekräftig genug.


Dass bei F1 der Popup zu einem Control erscheint, liegt IMHO in der Natur der Sache. Im Beispiel aus den Win32-API-Tutorials von Luckie habe ich überprüft, ob es eine Kontext-ID gibt. Wenn Ja, dann wurde das Popup angezeigt. Wenn nicht, dann wurde/wird die Hilfedatei aufgerufen.

moelski 16. Mai 2005 11:50

Re: Hilfe einbinden - klappt nur halb ?!
 
Moin !

Zitat:

Dass bei F1 der Popup zu einem Control erscheint, liegt IMHO in der Natur der Sache. Im Beispiel aus den Win32-API-Tutorials von Luckie habe ich überprüft, ob es eine Kontext-ID gibt. Wenn Ja, dann wurde das Popup angezeigt. Wenn nicht, dann wurde/wird die Hilfedatei aufgerufen.
Aber das geht bei mir schon nicht ...

Also ich habe folgendes:
- Form1 hat HelpContext 0
- in meinem CHM ist eine Seite auf ID 0

Wenn ich nun F1 drücke, dann sollte doch die Hilfe aufgehen, oder?
Aber das passiert bei mir nix.

Weiter im Text ...
Habe z.B. ein Bild (TImage). HelpContext ist auf 2000.
In meinem CHM ist auch ein Part mit ID 2000.

Wenn ich nun den Button "What´s This" drücke kriege ich diesen Pfeil + Fragezeichen. Klicke ich auf das Bild, dann sollte doch eigentlich entweder die Hilfe aufgehen oder ein Popup kommen.
Aber es passiert auch hier rein gonix. :gruebel:

Und noch Misteriöser wird es wenn ich folgendes Mache ...
Button hat keine Help ID. Drücke ich den Button und halte die Maustaste gedrückt und betätige dann F1, dann kriege ich ein Popup mit der Meldung "keine Hilfe da ...". Und das auch noch ganz oben links auf dem Monitor. Nichtmal bei der Mausposition.

Also irgendwas ist doch da oberfaul, oder?! Ich weiss nur nicht was ...

Greetz

Nachtrag:
Wenn ich auf den Button What´s This klicke und dann ein Element anwähle, dann müsste doch eigentlich irgendwann die Procedure F1HelpEvent durchlaufen werden, oder?! Aber das passiert nicht. :gruebel: ^2

MathiasSimmack 16. Mai 2005 12:00

Re: Hilfe einbinden - klappt nur halb ?!
 
Tja, ich würde dir ja gern helfen, allerdings habe ich keine Ahnung von den Tools, die du benutzt hast. Ich erstelle meine CHM-Dateien mit meinem Lieblings-HTML-Editor und dem kostenlosen HTML Helpworkshop von Microsoft. (Eigentlich erstelle ich gar keine CHMs mehr, aber egal. :stupid:)

Außerdem schrieb ich:
Zitat:

Im Beispiel aus den Win32-API-Tutorials von Luckie habe ich überprüft, ob es eine Kontext-ID gibt.
Und so sieht das aus:
Delphi-Quellcode:
WM_HELP:
  // Kontextinfo zu einem Control anzeigen
  if(PHelpInfo(lp)^.dwContextId > 0) then
    ShowHelp(PHelpInfo(lp)^.MousePos,PHelpInfo(lp)^.dwContextId)
  else
  // die Hilfe aufrufen
  if(PHelpInfo(lp)^.hItemHandle = wnd) or
    (GetParent(PHelpInfo(lp)^.hItemHandle) = wnd)
  then
    SendMessage(wnd,WM_COMMAND,MAKELONG(IDC_TOCBTN,BN_CLICKED),0)
  // normal fortsetzen
  else Result := DefWindowProc(wnd,uMsg,wp,lp);
Nur wird dir das nicht allzu viel helfen, weil es ein nonVCL-Sample ist. Und zu allem Übel benutze ich nicht mal die Helpware-Units, sondern ich bevorzuge die JEDI-Übersetzung der HtmlHelp-API.

Ich bin der Meinung, sobald du diesen Hilfe-Button in der Titelzeile benutzt, schaltet sich der F1-Hotkey dazwischen und geht immer davon aus, dass du Kontext-Hilfe zu irgendeinem Control sehen willst. Die Steuerung an sich übernimmt ja das Hilfe-API, in deinem Fall also die Helpware-Unit.

smart 16. Mai 2005 13:03

Re: Hilfe einbinden - klappt nur halb ?!
 
Zitat:

dem kostenlosen HTML Helpworkshop von Microsoft. (Eigentlich erstelle ich gar keine CHMs mehr, aber egal. )
Wo hast Du den her? Ich habe bei Microsoft nichts vinden können. Hast Du vieleicht einem Link?

Keldorn 16. Mai 2005 13:32

Re: Hilfe einbinden - klappt nur halb ?!
 
das steht alles in dem obengenannten Tutorial.

mfg Frank

moelski 16. Mai 2005 18:21

Re: Hilfe einbinden - klappt nur halb ?!
 
Moin !

Soderle, nachdem ich jetzt auf die JEDI Header umgestellt habe, geht es so langsam. Dennoch habe ich ein paar Ungereimtheiten ...

Kann es sein, dass es unter D6 ein paar Komponenten gibt, die nicht so recht wollen mit dem HelpIndex und der Hilfe? Wenn ich z.B. einem Label eine ID gebe, die def. vorhanden ist, dann wird die Hilfe nicht angezeigt. Die gleiche ID z.B. auf einen Button angewand geht problemlos.
Auch bei einer ComboBox (aus der ToolBar2000 Sammlung) geht die Hilfe nur wenn ich mit der Maustaste den Pfeil der ComboBox festhalte und dann F1 drücke.
Auch ein ganz normales TImage kann ich nicht überreden, mit meiner Hilfe zu harmonieren.

Hat jemand noch eine Idee wie ich das in den Griff kriege :gruebel:

MathiasSimmack 16. Mai 2005 18:26

Re: Hilfe einbinden - klappt nur halb ?!
 
Zitat:

Zitat von moelski
Soderle, nachdem ich jetzt auf die JEDI Header umgestellt habe, geht es so langsam. Dennoch habe ich ein paar Ungereimtheiten ...

Wobei ich anmerken möchte, dass Robert Chandlers Unit (Helpware) immerhin dieses merkwürdige Problem ab Delphi 6 löst. Dazu gibt´s in Luckies Tutorials auch einen kleinen Absatz. IMHO hat Borland das Hilfesystem dermaßen verhunzt, dass es in einigen Fällen nicht mehr richtig reagiert. Und dafür hat Rob ja den Fix geschrieben.

Zitat:

Wenn ich z.B. einem Label eine ID gebe, die def. vorhanden ist, dann wird die Hilfe nicht angezeigt. Die gleiche ID z.B. auf einen Button angewand geht problemlos.
Wozu sollte man auch ein Label erklären wollen? :gruebel: Ein Label dient doch nur dazu, ein anderes Control, etwa ein Eingabefeld, etwas genauer zu erläutern, damit man eben weiß, dass hier
Code:
URL: [                 ]
eine Webadresse rein soll. Aber die tatsächliche Kontext-Hilfe, das Popup, würde eben nur beim Eingabefeld erscheinen und dort auch Sinn machen.

moelski 16. Mai 2005 18:38

Re: Hilfe einbinden - klappt nur halb ?!
 
Moin !

Zitat:

Und dafür hat Rob ja den Fix geschrieben.
Kann ich den auch mit den Jedi Headern nutzen?

Zitat:

Wozu sollte man auch ein Label erklären wollen?
Das war ja nur ein Test. Klar macht das nicht wirklich Sinn. Aber wie gesagt es gehen ja auch keine KomboBoxen und Images. Dort würde es schon Sinn machen.
Aber es geht eben einfach nicht :cry:

Also fragen wir mal so ... Was muss ich mit meiner Applikation noch anstellen, damit die Hilfe richtig geht?
Ich habe versuchshalber mal die D6OnHelpFix mit eingebunden, aber das ist auch noch nicht die Lösung ...

Kannst du mir noch einen Tip geben!? :roll:

MathiasSimmack 16. Mai 2005 18:47

Re: Hilfe einbinden - klappt nur halb ?!
 
Zitat:

Zitat von moelski
Zitat:

Und dafür hat Rob ja den Fix geschrieben.
Kann ich den auch mit den Jedi Headern nutzen?

Musst du ausprobieren. Hier ist mein Beitrag dazu. Habe ich doch noch gefunden. 8) Es ging zwar um HLP, aber merkwürdig war es dennoch.

Zitat:

Aber wie gesagt es gehen ja auch keine KomboBoxen und Images. Dort würde es schon Sinn machen.
Comboboxen weiß ich jetzt nicht, aber Images machen auch keinen Sinn. Ein Image zeigt was an. Was willst du dem User dazu in einem Kontext-Popup sagen? "Hier sehen Sie ein Bild"? Ich glaube, das sieht der Anwender auch so. Bei Comboboxen gucke ich mal ob ich was finde; ggf. melde ich mich dann noch mal.

Zitat:

Ich habe versuchshalber mal die D6OnHelpFix mit eingebunden, aber das ist auch noch nicht die Lösung ...
Doch, es ist schon die Lösung. Zumindest um dieses merkwürdige Verhalten der Hilfe ab Delphi 6 zu umgehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz