Wie CHM-Datei nur 1x starten lassen?
-
Hallo,
zu meinem Programm habe ich eine Hilfedatei erstellt (TEST.CHM).
Ich starte diese Datei mit dem folgendem Code:void __fastcall TForm1::ButtonHelpClick(TObject *Sender){ ShellExecute(this->Handle, "open", "TEST.CHM", NULL, NULL, SW_SHOWNORMAL); }
Super einfach. Leider hat das Ganze einen Haken. Die Hilfe läßt sich mehrmals starten, was sie nicht soll!
Wie kann ich das verhindern?
-
Dokumentation gelesen?
TApplication::HelpFile, TApplication::HelpShowTableOfContents, TApplication::HelpKeyword, TApplication::HelpContext
Zusätzlich noch das Unit HtmlHelpViewer einbinden (
#include <HTMLHelpViewer.hpp>
).Edit: Gegebenenfalls noch
#pragma link "HTMLHelpViewer"
.
-
Hallo @audacia,
danke schon 'mal für Deinen Einsatz. Leider bin ich noch nicht so modern wie DuIch besitze noch den BCB6, noch! Dort finde ich in einem Tutorial zur Erstellung eines Texteditors auch kurz wie man ein Hilfesystem einbauen kann.
Mit Microsoft Helpworkshop erstellt man *.hpj-Dateien und kann diese in ein Projekt einbauen.
Dieses Hilfesystem macht nach erster Betrachtung einen ziemlich angestaubten Eindruck und ich wollte es deshalb nur sehr ungern einsetzen.Ich dachte, ich könnte das mit wenig Aufwand und relativ flott zu erstellender *.chm - Hilfedatei alles umgehen.
Ich hätte für meinen geschilderten Anwendungsfall eher an eine Lösung ähnlich wie im folgenden Link gedacht.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-134440-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-%2Astart%2A.htmlBin mir allerdings nicht sicher, ob das auch für meinen Fall umsetzbar wäre.
Hat jemand eine Meinung dazu?
-
Hallo,
habe mir den o.g. Link nochmals genauer angeschaut und bin nach ein bißchen Basteln auf folgende Lösung gekommen:void __fastcall TForm1::ButtonHelpClick(TObject *Sender){ HWND hWnd = FindWindow(0, "Der Fenstertitel von TEST.CHM"); if (!hWnd) ShellExecute(this->Handle, "open", "TEST.CHM", NULL, NULL, SW_SHOWNORMAL); }
Funktioniert wie gewünscht und ist immer noch super einfach.
In dem von Joe_M. erstellten Artikel, siehe Link oben heißt es:
The FindWindow approach is nice because it is simple and easy to understand. Unfortunately, it has some drawbacks.
For starters, it assumes that the caption of the application never changes.-->Kein Problem, da sich der Titel der Hilfedatei sicher nie ändert
Secondly, if the user clicks an icon several times to start your app, the first app could be pre-empted by the second app just after the FindWindow call executes, and both programs might sneak through the if test.
-->auch kein Problem, da in meinem Fall auf einen Button gedrückt, von dem aus immer zuerst das Fenster-Handle gesucht wird und erst danach die CHM-Datei gestartet wird.
-
thunderbol4 schrieb:
Dieses Hilfesystem macht nach erster Betrachtung einen ziemlich angestaubten Eindruck und ich wollte es deshalb nur sehr ungern einsetzen.
Durchaus vernünftig. Bekanntermaßen bekämest du unter Vista damit ohnehin Probleme.
thunderbol4 schrieb:
Funktioniert wie gewünscht und ist immer noch super einfach.
Uah, ein Workaround.
Noch dazu ein überaus häßlicher.
Für C++Builder 6 würde ich eher auf das hier zurückgreifen. Spätestens, wenn du einmal ein spezifisches Thema in der Hilfedatei ansteuern willst, hilft dir ShellExecute() nichts mehr.
-
da müht man sich, man ackert, man rackert, tut sein Bestes für die Community und ....dann das:
audacia schrieb:
Uah, ein Workaround.
Noch dazu ein überaus häßlicher.
Gebe ja zu, dass die Konstruktion mit ShellExecute etwas robust ausgefallen ist, aber gleich "häßlich"?
Bin jedenfalls nicht beleidigtund bedanke mich für den tollen Link. Sieht sehr vielversprechend aus und werde mich mal damit befassen.
-
thunderbol4 schrieb:
Gebe ja zu, dass die Konstruktion mit ShellExecute etwas robust ausgefallen ist, aber gleich "häßlich"?
Das war nicht persönlich gemeint ;), sondern bezogen auf die Tatsachen, daß
- deine Lösung hinsichtlich Stichwortsuche oder kontextbezogener Hilfe nicht anwendbar ist
- du dich auf ein Implementationsdetail des Help-Viewers verläßt (es wäre keineswegs ausgeschlossen, daß Microsoft in Vista oder Windows 7 dazu übergeht, beispielsweise " - Microsoft HTML Help Viewer" zu suffizieren)
- deine Lösung übermäßig pauschal ist (FindWindow() sucht ja nach Fenstertiteln vollkommen unabhängig vom zugehörigen Prozeß; wenn du dich z.B. mit einem Explorerfenster in einem gleichnamigen Ordner befindest, wird die Hilfe gar nicht angezeigt, weil ja ein Fenster gleichen Namens bereits existiert)
- es zudem einen wohldokumentierten Weg gibt, der all diese Probleme löst und deinen Workaround schlicht unnötig macht.
-
audacia schrieb:
[*]du dich auf ein Implementationsdetail des Help-Viewers verläßt (es wäre keineswegs ausgeschlossen, daß Microsoft in Vista oder Windows 7 dazu übergeht, beispielsweise " - Microsoft HTML Help Viewer" zu suffizieren)
es ist außerdem von der sprache des installierten systems abhängig, wie die fenster betitelt sind.