Post by Alfred Peters| procedure THForm.GeneralFormKeyDown(Sender: TObject; var Key: Word;
| Shift: TShiftState);
| begin
| If Key = vk_F1 then
| Help
| end;
Ja, das sollte eigentlich (zumindest vermute ich das) jeden Tastendruck
abfangen, weil in jedem Formular beim Erzeugen
| KeyPreview := true;
| OnKeyDown :=GeneralFormKeyDown;
gesetzt wird. Das funktioniert aber nicht, weil manche Tasten gar nicht
erst das OnKeyDown auslösen. In der Hilfe zu Delphi 7 ist das auch
erklärt:
| Tastaturereignisse werden auf verschiedenen Ebenen empfangen:
|
| Auf Anwendungsebene über das Ereignis OnMessage von Application.
|
| Tastenanschläge müssen selten auf Anwendungsebene verarbeitet werden,
| aber es ist wichtig zu wissen, dass dies die erste verfügbare Ebene
| ist.
|
| Auf Tastenkürzel-Ebene.
|
| Wenn ein Tastenkürzel definiert ist, beispielsweise als Eigenschaft
| eines Menüeintrags, wird das Tastaturereignis verarbeitet, bevor es
| für das Formular sichtbar wird.
|
| Auf Formularebene
|
| Das Formular besitzt eine Eigenschaft KeyPreview, mit der Sie
| "globale" Tastaturereignisse abfangen können.
|
| Auf Komponentenebene.
|
| Wenn Ereignisbehandlungsroutinen für Tastenanschläge auf
| Komponentenebene programmiert werden, fängt diejenige Komponente das
| Ereignis ab, die gerade den Fokus hat.
Was die Erklärung ist, warum GeneralFormKeyDown im Hauptfenster
beispielsweise nicht für F6 - F9 aufgerufen wird. Diese Tasten sind im
Online-Menü als Shortcut für einzelne Menüpunkte festgelegt und werden
deshalb bereits vorher auf Tastenkürzelebene verarbeitet.
Was ich aber eben immer noch nicht verstehe: Warum reagieren die Dialoge
so unterschiedlich, obwohl sie programmtechnisch in dieser Beziehung
identisch sein müßten.
Post by Alfred PetersTHForm.Help() sucht die ID raus und ruft dann
| THamsterMainWindow.AppHelp(Command: Word; Data: ...
auf mit Command = HELP_COMMAND und Data = ID.
F6
| procedure THamsterMainWindow.mnuHelpContentsClick(Sender: TObject);
| begin
| If Not Allowed(Sender) then
| Exit;
| Application.HelpCommand( HELP_CONTENTS, 0 );
| end;
Das landet auch in AppHelp(), was aber mit Command = HELP_CONTENTS
| if not ok then begin
| retvalue := HtmlHelp(GetDesktopWindow,pchar(Application.Helpfile),HH_DISPLAY_TOPIC,0);
Genau das ist das Problem: Die hamstereigene Verarbeitung von F1 wird
nicht aufgerufen, sondern Delphi macht das intern, ohne die im Hamster
definierten Ereignisse zu benutzen. Es scheint (wirklich nur
Konjkunktiv) so, daß Delphi bei F1 zuerst den HelpContext des Formulars
auswertet. Falls es dort 0 vorfindet (das ist letzendlich bei allen
Formularen der Fall), macht es dann irgendwelche anderen Dinge, die ich
nicht verstehe und auch keine Beschreibung dafür gefunden habe.
Wenn ich dem Formular als HelpContext die 44100 aus der hamster_de.dat
gebe, wird bei F1 die richtige Seite der Hilfe aufgerufen. Das ist
letzendlich jedoch auch keine Lösung, weil damit das Hilfesystem
statisch wird und nicht mehr auf den aktuell ausgewählten Tab reagieren
kann, wie es beispielsweise bei den Grundeinstellungen passiert.
Und nur für die beiden betreffenden Dialog eine Sonderbehandlung
einzuführen, indem sie bereits beim Erzeugen den passenden HelpContext
bekommen, gefällt mir auch nicht. Die Art und Weise, wie im Hamster die
Dialoge derzeit zur Laufzeit beim Erzeugen geändert werden, ist jetzt
schon ziemlich verwirrend, dort noch eine Ebene hinzuzufügen, macht es
nur schlimmer.
Post by Alfred Peters| procedure THForm.DoCreate;
...
| c := FindComponent ('mnuHelp');
| If Assigned(c) then begin
| If c is TMenuItem then With (c as TMenuItem) do begin
| If Count = 0 then OnClick := butHelpOnClick
Andere Dialoge finden ein 'mnuHelp'. Vom Hauptfenster? Oder wird das
irgendwo dynamisch erzeugt?
Das ist eine der Nachbearbeitungen an den Dialogfenstern. Damit wird
sichergestellt, daß ein Menüeintrag mit dem Namen 'mnuHelp' die Hilfe
aufruft. Und zwar unabhängig davon, was in der Delphi-IDE als
Ereignisroutine für onClick festgelegt wurde.
Mit so etwas kann man hervorragend ein formularübergreifendes
Standardverhalten erzeugen, weil man die Änderungen nicht in der IDE an
jedem Formular manuell vornehmen muß. Es hat aber den großen Nachteil,
daß für andere sehr schwierig ist zu verstehen, wie die Wechselwirkungen
zwischen IDE-Vorganden und Laufzeitverhalten sind.
Gruß Heiko
--
Wer unter Menschen nur einen Engel sucht, der findet kaum Menschen.
Wer aber unter Menschen nur Menschen sucht, der findet gewiß seinen Engel.
Moritz Gottlieb Saphir