vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Allgemein   |   VB-Versionen: VB5, VB602.01.04
Eigenes HTML-Hilfesystem in VB entwickeln

Ein Programm in VB zu programmieren ist eine Sache, die dazugehörigen Hilfe-Dateien zu schreiben ist für viele jedoch ein ein "Horror". Im Zeitalter von Windows 2000 und Windows XP erwarten die Anwender ein modernes HTML-Hilfesystem. Dieser Workshop zeigt, wie sich ein solches Hilfesystem mit VB-Boardmitteln programmieren lässt.

Autor:  Dieter Otter / Arthur WeberBewertung:  Views:  27.561 

Ein Programm in VB zu programmieren ist eine Sache, die dazugehörigen Hilfe-Dateien zu schreiben ist für viele jedoch ein "Horror". Im Zeitalter von Windows 2000 und Windows XP erwarten die Anwender ein modernes HTML-Hilfesystem. Dieser Workshop zeigt, wie sich ein solches Hilfesystem mit VB-Boardmitteln programmieren lässt.

Das Prinzip - kurz erklärt

Zu einem modernen Programm gehört auch ein modernes Hilfesystem. Das derzeitgängigste Hilfesystem ist HTMLHelp, d.h. die gesamte Online-Hilfe besteht aus vielen einzelnen HTML-Seiten. Normalerweise verwendet man für ein HTML-Hilfesystem den Microsoft HTMLHelp Compiler, der aus den gesamten HTML-Seiten eine "Stand-Alone-Hilfedatei" (.CHM) generiert, die dann mit Hilfe der API-Funktionen der HHCTRL.OCX-Komponente aufgerufen werden kann.
Siehe hierzu auch:  HTML-Hilfe erstellen und in VB einbinden

Ziel dieses Workshops soll es jetzt sein, sowohl auf den "Microsoft HTMLHelp Compiler", als auch auf die HHCTRL.OCX-Komponente zu verzichten. Vielmehr möchten wir unser eigenes HTML-Hilfesystem "bauen", d.h. wir steuern die Anzeige und die Navigation der HTML-Hilfe selbst.

Schaut man sich das Microsoft HTMLHelp-System einmal näher an, so stellt man schnell fest, dass man für die Anzeige und Navigation durch das Hilfesystem im Großen und Ganzen nur 2 Controls benötigt:

  1. TreeView-Control (auf der linken Seite)
  2. WebBrowser-Control (rechts daneben)
Optional kann man noch das Registerkarten-Steuerelement verwenden, um z.B. die Schlüsselwörter in einer zusätzlichen Liste anzuzeigen.

Benötigte Controls

Aufbau des Inhaltsverzeichnisses

Die einzelnen Hilfeseiten (HTML-Dateien) legt man am Besten gemeinsam in einem Unterordner innerhalb des Anwendungsverzeichnisses ab (z.B. help\). Das Inhaltsverzeichnis, das später im TreeView-Control angezeigt werden soll, erstellen wir als ganz gewöhnliche Textdatei, wobei Unterthemen einfach per TAB eingerückt werden. Das schaut dann wie folgt aus:

Allgemeines
	Inhalt
	Features|Einführung.htm
	Registrierung
	Verwenden der Komponente
	Wichtiger Hinweis: Debuggen|Debuggen.htm
	Anmerkung: Bitmaphandles|Bitmaphandles.htm
	Windows XP und Manifest Dateien|Windows XP.htm
	Weitergabe von Dateien
	Systemvoraussetzungen
	Technischer Support
	Copyright
Referenz
	sevMenuXP Controls und Objekte|sevMenuXP Referenz.htm
MenuBar-Control
	Alle Funktionen im Ueberblick|MenuBar-Control.htm
Eigenschaften
	AutoFreeHandles
	BackColor
	BalloonToolTips

Die Hauptthemen (Root-Nodes) beginnen immer direkt am Zeilenanfang. Die jeweiligen Unterthemen werden hingegen per TAB-Taste eingerückt. Sollte die HTML-Datei anders lauten als das Thema, muss der Dateiname im Anschluss an das Thema angegeben werden, getrennt durch das Pipe-Zeichen (|). Ist der Dateiname der HTML-Datei identisch mit dem Thema, braucht dieser nicht explizit angegeben werden. Wichtig ist jedoch, dass die Dateiendung immer HTM lautet (nicht HTML!). Nachdem Sie das Inhaltsverzeichnis im Windows-Editor erstellt haben, speichern Sie die Datei bitte als node.txt in das Programmverzeichnis.

Index - Schlüsselwörter

Zusätzlich zum Inhaltsverzeichnis möchten wir unser HTML-Hilfesystem mit einer INDEX-Registerkarte ausstatten. Beim Klick auf das Index-Register sollen dann die wichtigsten Schlüsselwörter in Form einer alphabetisch sortierten Liste angezeigt werden. Die Schlüsselwörter selbst müssen ebenfalls wieder in Form einer Textdatei vorliegen. Der Aufbau hierbei ähnelt stark einer INI-Datei, was auch beabsichtigt ist

[List]
1=Inhalt
2=Features|Einführung.htm
3=Registrierung
4=Verwenden der Komponente
5=Wichtiger Hinweis Debuggen|Debuggen.htm
6=Anmerkung: Bitmaphandles|Bitmaphandles.htm
7=Windows XP und Manifest Dateien|Windows XP.htm
8=Weitergabe von Dateien
9=Systemvoraussetzungen
10=Technischer Support
11=Copyright
12=sevMenuXP Controls und Objekte|sevMenuXP Referenz.htm
13=Alle Funktionen im Ueberblick|MenuBar.htm
14=AutoFreeHandles
15=BackColor
16=BalloonToolTips

Erstellt wird die Index-Datei wiederum im Windows-Editor und unter dem Namen index-tab.txt im Programmverzeichnis abgelegt.

Favoriten

Neben dem Inhaltsverzeichnis und der Index-Liste könnte man zusätzlich noch eine Favoriten-Liste als eigenes Registerblatt anzeigen. Auf diese Weise kann der Anwender bestimmte Themen der Hilfe für den schnellen Zugriff in der Favoritenliste ablegen. Die Favoritenliste wird ebenfalls wieder als gewöhnliche Textdatei mit INI-Charakter gespeichert. Der Aufbau sieht wie folgt aus:

[List]
1=http://www.vbarchiv.net
2=file:\\D:\VB6\Orion\HTMLWorkshop\Help\Registrierung.htm

Wie Sie sehen, können in der Favoritenliste auch "echte" URL's gespeichert sein, denn wir verwenden für die Anzeige der HTML-Seiten ja das WebBrowser-Control.
Die Favoriten-Liste speichern wir unter dem Namen myfav.txt ab - ebenfalls wieder im Anwendungsverzeichnis.

Soviel zur Vorbereitung. Jetzt geht's weiter mit dem Aufbau der VB-Form zur Anzeige der HTML-Hilfe.

Aufbau der Form für die Anzeige der HTML-Hilfe

Erstellen Sie ein neues Projekt und aktivieren über den Dialog Projekt - Komponenten folgende beiden Einträge:

  • Microsoft Internet Controls (shdocvw.dll)
  • Microsoft Windows Common Controls 6.0 (mscomctl.ocx)

Platzieren Sie auf die Form1 ein Registersteuerelement (TabStrip1) und rechts daneben ein WebBrowser-Control. Alle benötigten Bildsymbole werden in einem ImageList-Control abgelegt, das Sie ebenfalls auf das Formular ziehen.

1. TabStrip und WebBrowser-Control

Für die Anzeige des Inhaltsverzeichnisses benötigen wir das TreeView-Control. Ziehen Sie dieses auf die Form. Die Position und Größe spielt keine Rolle, da alle Controls zur Laufzeit an die aktuelle Fenstergröße angepasst werden. Neben dem TreeView-Control brauchen wir noch zwei ListBox-Controls (List1 und List2) für die Auflistung der Schlüsselwörter bzw. der Favoriten-Einträge. Zusätzlich soll der Anwender die Möglichkeit haben, beliebige URL's in die Favoritenliste einzutragen. Hierfür benötigen wir noch eine TextBox, sowie einen CommandButton.

2. TreeView, ListBox und TextBox

Hiermit hätten wir alle benötigten Controls auf die Form platziert. Bevor wir mit dem "Coden" beginnen, müssen jedoch noch folgende Control-Eigenschaften festgelegt werden, da es sich hierbei um Eigenschaften handelt, die nur zur Entwurfszeit geändert werden können.

  • List1: IntegralHeight = False
  • List2: IntegralHeight = False und Sorted = True

Die Bildsymbole für das Registersteuerelement, sowie das TreeView-Control sollten ebenfalls zur Entwurfszeit ausgewählt werden. Über nachfolgenden Link können Sie sich die entsprechenden Bildsymbole downloaden:
 helpicons.zip (2 KB)

Fügen Sie dem ImageList nachfolgende Bildsymbole mit folgenden Key-Werten hinzu:

Key: contents
Key: index
Key: favorites
Key: closed
Key: open
Key: leaf

Damit wäre der Formularaufbau abgeschlossen.

Initialisieren der Controls

Beim Laden der Form müssen zunächst ein paar Controls initialisiert werden. Hierzu zählt u.a. das Registersteuerelement, für das wir die benötigten Registerkarten erstellen müssen.

Private Sub Form_Load()
  ' Registerreiter erstellen
  With TabStrip1
    .Width = 225 * Screen.TwipsPerPixelX
 
    Set .ImageList = ImageList1
    .Tabs.Clear
    .Tabs.Add , , "Inhalt", "contents"
    .Tabs.Add , , "Index", "index"
    .Tabs.Add , , "Favoriten", "favorites"
  End With
 
  ' TreeView-Eigenschaften festlegen
  With TreeView1
    Set .ImageList = ImageList1
    .Indentation = 250
    .HideSelection = False
    .LabelEdit = tvwManual
  End With
 
  ' Favoriten
  Text1.Text = ""
  Command1.Font.Name = "Marlett"
  Command1.Font.Size = 10
  Command1.Font.Bold = False
  Command1.Caption = "b"
 
  ' Form_Resize-Ereignis aufrufen
  Form_Resize
End Sub

Positionieren der Controls zur Laufzeit

Kommen wir jetzt zum Positionieren der Controls. Dies erledigen wir per Code zur Laufzeit - und zwar im Form_Resize-Ereignis, da dieses Ereignis immer dann ausgelöst wird, wenn sich die Formgröße ändert.

Private Sub Form_Resize()
  ' Controls an aktuelle Fenstergröße anpassen
  If Me.WindowState <> vbMinimized Then
    ' WebBrowser
    With WebBrowser1
      .Top = 105
      .Left = TabStrip1.Left + TabStrip1.Width + 105
      If Me.ScaleWidth > .Left + 105 Then
        .Width = Me.ScaleWidth - .Left - 105
      End If
 
      If Me.ScaleHeight > .Top + 105 Then
        .Height = Me.ScaleHeight - .Top - 105
      End If
    End With
 
    ' Registersteuerelement
    With TabStrip1
      .Move 105, 105
 
      Text1.Move 210, 535
      Text1.Width = .Width - Text1.Height - 210
      Command1.Move Text1.Left + Text1.Width + 30, Text1.Top, _
        Text1.Height, Text1.Height
      List1.Move Text1.Left, Text1.Top + Text1.Height + 60
      List1.Width = .Width - 210
      List2.Move Text1.Left, Text1.Top
      List2.Width = List1.Width
      TreeView1.Move Text1.Left, Text1.Top
      TreeView1.Width = List1.Width
 
      If Me.ScaleHeight > .Top + 105 Then
        .Height = Me.ScaleHeight - .Top - 105
        TreeView1.Height = .Height - 540
        List1.Height = .Height - 905
        List2.Height = .Height - 555
      End If
    End With
  End If
End Sub

Sichtbar/Unsichtbarmachen von Controls

Bis jetzt sind immer alle Controls sichtbar, auch wenn sie sich teilweise selbst verdecken. Besser ist es jedoch, wenn immer nur diejenigen Controls sichtbar sind, die auch tatsächlich benötigt werden. Je nach ausgewählter Registerkarte handelt es sich hierbei um:

  • das TreeView-Control (Register Inhalt)
  • Text1, Command1 und List1 (Register Favoriten)
  • List2 (Register Index)

Weiterhin soll beim Start der Hilfe immer das Register Inhalt geöffnet sein. Wir erweitern demzufolge das Form_Load Ereignis um folgende Codezeilen:

Private Sub Form_Load()
  ...
 
  ' Beim Start Register "Inhalt" öffnen
  Set TabStrip1.SelectedItem = TabStrip1.Tabs(1)
End Sub

Beim Wechseln der Registerkarte wird das TabStrip1_Click-Ereignis ausgelöst, in dem wir die jeweiligen Controls ein-/ausblenden können.

Private Sub TabStrip1_Click()
  ' Controls ein/ausblenden
  With TabStrip1
    TreeView1.Visible = (.SelectedItem.Index = 1)
    List2.Visible = (.SelectedItem.Index = 2)
    Text1.Visible = (.SelectedItem.Index = 3)
    Command1.Visible = (.SelectedItem.Index = 3)
    List1.Visible = (.SelectedItem.Index = 3)
  End With
End Sub

Hilfethemen laden und anzeigen

Kommen wir jetzt langsam zum interessanten Teil unseres HTML-Hilfesystems: dem Laden und Anzeigen der Hilfeseiten. Die einzelnen Hilfethemen und ihre Unterseiten sollen hierbei strukturiert im TreeView-Control aufgelistet werden. Beim Klick auf einen Eintrag soll dann die Hilfeseite im WebBrowser-Control angezeigt werden.

Für das "Füllen" des TreeView-Controls erstellen wir uns eine eigene Prozedur mit folgenden Parametern:

  • file_name: vollständiger Pfad der Datei mit dem Inhaltsverzeichnis (node.txt)
  • trv: TreeView-Objekt

Die Textdatei wird hierbei zeilenweise bis zum Dateiende ausgelesen. Anhand der Anzahl TAB-Zeichen am Anfang der Zeile wird die "Tiefe" im TreeView-Control bestimmt. Enthält die Zeile kein TAB-Zeichen handelt es sich um einen "Parent"-Eintrag, andernfalls um einen "Child"-Eintrag. Wie bereits eingangs erläutert müssen wir beim Einlesen der Zeilen prüfen, ob hier zusätzlich der HTML-Dateiname angegeben wurde. Ist dies nicht der Fall, prüfen wir, ob es im Unterordner help\ eine Datei mit der Themenbezeichnung und der Endung .HTM existiert. Der Dateiname selbst wird als "Key" zum jeweiligen Node-Objekt gespeichert. Auf diese Weise können wir im NodeClick-Ereignis schnell den Dateinamen der anzuzeigenden Hilfeseite ermitteln. Jetzt kann es natürlich vorkommen, dass mehrere Themen auf ein- und dieselbe Hilfedatei verweisen. In diesem Fall würden wir eine Fehlermeldung "Duplicate Key-Value" erhalten. Dem wollen wir natürlich vorbeugen und stellen hierzu einfach den Index des aktuellen Node-Objekts voran.

' TreeView-Navigation einlesen
' Die einzelnen Einträge befinden sich hierbei in einer Textdatei
Private Sub LoadTreeViewFromFile(ByVal file_name As String, _
  ByRef trv As TreeView)
 
  Dim fnum As Integer
  Dim text_line As String
  Dim level As Integer
  Dim tree_nodes() As Node
  Dim num_nodes As Integer
  Dim sHTMFile As String
 
  ' Datei öffnen
  fnum = FreeFile
  Open file_name For Input As fnum
 
  With trv
    ' Nodes löschen  
    .Nodes.Clear
 
    ' zeilenweise einlesen bis Dateiende erreicht    
    Do While Not EOF(fnum)
      ' Eintrag lesen
      Line Input #fnum, text_line
 
      ' Finde den Level des Einzugs
      level = 1
      Do While Left$(text_line, 1) = vbTab
        level = level + 1
        text_line = Mid$(text_line, 2)
      Loop
 
      ' Array redimensionieren
      If level > num_nodes Then
        num_nodes = level
        ReDim Preserve tree_nodes(1 To num_nodes)
      End If
 
      ' HTML-Dateiname ermitteln
      ' Der Dateiname wird hierbei in der Key-Eigenschaft 
      ' des TreeView-Eintrags gespeichert.
      ' Damit es zu keiner Fehlermeldung kommt, falls zwei 
      ' Themen auf die gleiche Hilfeseite verweisen, stellen 
      ' wir einfach den aktuellen Index voran.
      If InStr(text_line, "|") > 0 Then
        sHTMFile = Mid$(text_line, InStr(text_line, "|") + 1)
        text_line = Left$(text_line, InStr(text_line, "|") - 1)
      Else
        sHTMFile = text_line & ".htm"
      End If
      If Not FileExists(App.Path & "\help\" & sHTMFile) Then 
        sHTMFile = ""
      Else
        sHTMFile = "i" & CStr(.Nodes.Count + 1) & vbTab & sHTMFile
      End If  
 
      ' Neues Node-Objekt hinzufügen
      If level = 1 Then
        ' Als Icon "geschlossenes Buch" anzeigen (siehe ImageList Control)
        Set tree_nodes(level) = .Nodes.Add(, , sHTMFile, text_line, "closed")
 
        ' Bei Selektion: Icon "geöffnetes Buch" anzeigen
        tree_nodes(level).ExpandedImage = "open"
        tree_nodes(level).Expanded = True
      Else
 
        ' Unterseite mit Icon "leaf" anzeigen
        Set tree_nodes(level) = .Nodes.Add(tree_nodes(level - 1), tvwChild, sHTMFile, _
          text_line, "leaf")
        tree_nodes(level).EnsureVisible
      End If
    Loop
  End With
  Close #fnum
End Sub
' Prüfen, ob Datei existiert
Public Function FileExists(ByVal sFile As String) As Boolean
  On Error Resume Next
  FileExists = (Dir$(sFile) <> "")
  On Error GoTo 0
End Function

Der Aufruf der LoadTreeViewFromFile-Prozedur erfolgt im Form_Load-Ereignis der Form. Und damit beim Starten der Form nicht auf einmal der Windows-Internet-Verbinden-Dialog angezeigt wird, laden wir eine leere Seite in das WebBrowser-Control.

Private Sub Form_Load()
  ...
 
  ' Inhaltsverzeichnis einlesen und anzeigen
  LoadTreeViewFromFile App.Path & "\node.txt", TreeView1
 
  ' Lädt eine Web Seite, um zu verhindern dass
  ' der Dialog "Connect to Internet" erscheint
  WebBrowser1.Navigate "about:blank"  
End Sub

Jetzt fehlt nur noch die Anzeige der Hilfeseite beim Klick auf einen Eintrag im TreeView-Control:

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
  ' Help-Seite im WebBrowser-Control anzeigen
  If Node.Key <> "" Then
    Dim sFile As String
    sFile = Mid$(Node.Key, InStrRev(Node.Key, vbTab) + 1)
    WebBrowser1.Navigate "file:\\" & App.Path & "\Help\" & sFile
 
    ' Seite in die TextBox "Favoriten" eintragen, so dass der
    ' Anwender diese per Klick auf den CommandButton in die
    ' Favoritenliste mit aufnehmen kann.
    Text1.Text = "file:\\" & App.Path & "\Help\" & sFile
  End If
End Sub

Erweitern wir abschließend nochmals das Form_Load-Ereignis, so dass beim Starten der Form autom. die 1. Hilfeseite im WebBrowser-Control angezeigt wird:

Private Sub Form_Load()
  ...
 
  ' HTML-Hilfeseite anzeigen (2. Eintrag im TreeView-Control)
  With TreeView1
    .Nodes(1).EnsureVisible
    If .Nodes(1).Key <> "" Then
      ' Falls zum Hauptthema eine Hilfeseite existiert...
      Set .SelectedItem = .Nodes(1)
    Else
      ' ... wenn nicht, Hilfeseite der 1. Unterseite anzeigen
      Set .SelectedItem = .Nodes(2)
    End If
    ' Sicherstellen, dass die Seite auch tatsächlich angezeigt wird
    TreeView1_NodeClick .SelectedItem
  End With
End Sub

Index-Seite und Favoriten-Liste

Kommen wir nun zu der Index-Seite mit den Schlüssel-/Schlagwörtern, die ja ebenfalls aus einer Datei ausgelesen werden. Der Aufbau der Datei ähnelt dem einer INI-Datei mit "Abschnitt" in eckigen Klammern und anschließenden Key-/Schlüsselwerten. Aus diesem Grund können wir die Datei auch bequem mit Hilfe der API-Funktion GetPrivateProfileString auslesen.

Fügen wir in den Allgemein-Teil der Form also folgende Deklaration ein:

Option Explicit
 
' Benötigte API-Deklarationen
' INI lesen + schreiben
Private Declare Function OSGetPrivateProfileString Lib "KERNEL32" _
  Alias "GetPrivateProfileStringA" ( _
  ByVal lpApplicationName As String, _
  ByVal lpKeyName As Any, _
  ByVal lpDefault As String, _
  ByVal lpReturnedString As String, _
  ByVal nSize As Long, _
  ByVal lpFileName As String) As Long
 
Private Declare Function OSWritePrivateProfileString Lib "KERNEL32" _
  Alias "WritePrivateProfileStringA" ( _
  ByVal lpApplicationName As String, _
  ByVal lpKeyName As Any, _
  ByVal lpString As Any, _
  ByVal lpFileName As String) As Long
 
Private Const nBUFSIZEINI = 1024
Private Const nBUFSIZEINIALL = 4096
' INI-Eintrag lesen
Private Function GetINIString(ByVal szSection As String, _
  ByVal szEntry As Variant, _
  ByVal szDefault As String, _
  ByVal szFileName As String) As String
 
  Dim szTmp As String
  Dim nRet  As Long
 
  If (IsNull(szEntry)) Then
    szTmp = String$(nBUFSIZEINIALL, 0)
    nRet = OSGetPrivateProfileString(szSection, 0&, szDefault, _
      szTmp, nBUFSIZEINIALL, szFileName)
  Else
    szTmp = String$(nBUFSIZEINI, 0)
    nRet = OSGetPrivateProfileString(szSection, CStr(szEntry), _
      szDefault, szTmp, nBUFSIZEINI, szFileName)
  End If
 
  GetINIString = Left$(szTmp, nRet)
End Function
' INI-Eintrag speichern
Private Sub WriteINIString(ByVal szSection As String, _
  ByVal szEntry As Variant, _
  ByVal vValue As Variant, _
  ByVal szFileName As String)
 
  Dim nRet As Long
 
  If (IsNull(szEntry)) Then
    nRet = OSWritePrivateProfileString(szSection, 0&, 0&, _
      szFileName)
  ElseIf (IsNull(vValue)) Then
    nRet = OSWritePrivateProfileString(szSection, CStr(szEntry), _
      0&, szFileName)
  Else
    nRet = OSWritePrivateProfileString(szSection, CStr(szEntry), _
      CStr(vValue), szFileName)
  End If
End Sub

Entsprechende Erläuterungen zum Umgang mit INI-Dateien können Sie in unserem Workshop  INI-Dateien bearbeiten und verwalten nachlesen.

Index-Seite erstellen

Für das Füllen der Liste für die Index-Seite müssen wir lediglich die Datei index-tab.txt auslesen und die einzelnen Zeilen (Schlüsselwörter) in die ListBox List2 übertragen. Beim Klick auf einen Eintrag der ListBox wird dann die entsprechende Hilfeseite im WebBrowser-Control angezeigt. Den Dateinamen der Hilfeseite speichern wir hierzu direkt im ListBox-Eintrag, allerdings so, dass der Anwender diesen nicht sehen kann Hierzu bedienen wir uns folgenden Tricks: Wir fügen nach dem Stichwort einfach ein paar Tabulator-Zeichen ein. Erst dann kommt der Dateiname. Dieser ist dann zwar im List-Eintrag enthalten, wirdauf Grund der Tabulatorzeichen aber "außerhalb" des sichtbaren ListBox-Eintrags angezeigt.

' ListBox-Inhalt aus INI-Datei auslesen
Public Sub LoadList(oListBox As ListBox, ByVal FileName As String)
  Dim nCount As Long
  Dim sText As String
 
  nCount = 0
 
  ' Inhalt der Liste löschen
  With oListBox
    .Clear
 
    Do
      ' Eintrag aus INI-Liste lesen
      nCount = nCount + 1
      sText = GetINIString("List", CStr(nCount), "", FileName)
 
      ' Fügt den Eintrag zur Liste hinzu
      If sText <> "" Then
        ' Falls der HTML-Dateiname angegeben ist, 
        ' 10 Tabulatorzeichen einfügen, so dass der Dateiname in der ListBox 
        ' selbst nicht sichtbar angezeigt wird.
        If InStr(sText, "|") > 0 Then sText = Replace(sText, "|", String$(10, vbTab))
        .AddItem sText
      End If
    Loop Until sText = ""
  End With
End Sub

Die Prozedur LoadList wird wiederum beim Laden der Form aufgerufen:

Private Sub Form_Load()
  ...
 
  ' Lädt die Datei "Index-tab.txt" in List2
  LoadList List2, App.Path & "\Index-tab.txt"  
End Sub

Beim Auswählen eines Eintrags aus der Index-Liste soll die dazugehörige Hilfeseite im WebBrowser-Control angezeigt werden:

Private Sub List2_Click()
  Dim sFile As String
 
  With List2
    If .ListIndex >= 0 Then
      ' HTM-Datei ermitteln
      If InStr(.Text, vbTab) > 0 Then
        sFile = Mid$(.Text, InStrRev(.Text, vbTab) + 1)
      Else
        sFile = .Text & ".htm"
      End If
    End If
 
    ' Seite anzeigen
    WebBrowser1.Navigate "file:\\" & App.Path & "\Help\" & sFile
 
    ' Seite in die TextBox "Favoriten" eintragen, so dass der
    ' Anwender diese per Klick auf den CommandButton in die
    ' Favoritenliste mit aufnehmen kann.
    Text1.Text = "file:\\" & App.Path & "\Help\" & sFile
  End With
End Sub

Favoriten-Liste verwalten

Die Favoriten-Liste wird aus der INI-Datei myfav.txt ausgelesen und in der ListBox List1 angezeigt. Hier müssen wir uns jedoch nicht um den HTML-Dateinamen kümmern, da es sich bei den Einträge der Favoritenliste sowieso immer um HTML-Dateien bzw. URLs handelt. Für das Auslesen der Datei benutzen wir wiederum die LoadList-Prozedur, die wir ebenfalls wieder im Form_Load-Ereignis aufrufen.

Private Sub Form_Load()
  ...
 
  ' Lädt die Datei "myfav.txt" in List1
  LoadList List1, App.Path & "\myfav.txt"  
End Sub

Beim Klick auf einen Eintrag der Favoriten-Liste soll die Hilfeseite bzw. die URL im WebBrowser-Control angezeigt werden:

Private Sub List1_Click()
  ' Bei Klick auf einen Eintrag der Favoritenliste
  ' wird die entsprechende Web Seite angezeigt
  If List1.ListIndex >=0 Then
    WebBrowser1.Navigate (List1.List(List1.ListIndex))
  End If  
End Sub

Das Hinzufügen neuer Favoriten-Einträge erfolgt durch Eingabe der "URL" in die TextBox Text1 und anschließendem Klick auf den CommandButton Command1:

' für Favoriten
Private Sub Command1_Click()
  Dim i As Long
  Dim bExists As Boolean
 
  ' Prüfen, ob Eintrag bereits vorhanden
  bExists = False
  With List1
    For i = 0 To .ListCount - 1
      If LCase$(.List(i)) = LCase$(Text1.Text) Then
        ' Eintrag existiert bereits!
        bExists = True: Exit For
      End If
    Next i
 
    ' Nur wenn Eintrag noch nicht existiert...
    If Not bExists Then
      ' ...URL der Liste hinzufügen...
      List1.AddItem Text1.Text
 
      ' ... und Speichern der Liste
      SaveList List1, App.Path & "\myfav.txt"
    End If
  End With
End Sub
' ListBox-Inhalt in INI-Datei speichern
Public Sub SaveList(oListBox As ListBox, ByVal FileName As String)
  Dim nCount As Long
 
  On Error Resume Next
  ' Löscht die alte Datei um sicher zu sein,
  ' dass jede extra Information die nicht
  ' benötigt wird, gelöscht wird
  Kill FileName
 
  With oListBox
    nCount = 0
 
    If .ListCount > 0 Then
      ' alle ListBox-Einträge speichern
      Do
        nCount = nCount + 1
        WriteINIString "List", CStr(nCount), .List(nCount - 1), FileName
      Loop Until nCount = .ListCount
    End If  
  End With
End Sub

So, das war's dann für heute. Sie können das Projekt jetzt starten

Beispielprojekt mit zusätzlichen Erweiterungen

Selbstverständlich lässt sich das Hilfesystem noch um einige Funktionen erweitern, wie z.B.:

  • Auf-/Zuklappen aller Parent-Nodes im TreeView per Menü
  • Löschen von Einträgen aus der Favoriten-Liste
  • Zusätzliche Toolbar über dem WebBrowser-Control mit Schaltflächen für "Vor", "Zurück", "Home", "Suchen" etc.
  • u.v.m.

Unser Beispielprojekt, das wir für Sie zum Download bereitgestellt haben, enthält bereits einige dieser Erweiterungen.

Beispielprojekt

Download Beispielprojekt:
 htmlhelpsystem.zip (81 KB)

Anmerkungen:
Das Beispielprojekt wurde mit Visual Basic 6 unter den Betriebssystemen Windows 2000 und Windows XP getestet, sollte aber auch auf anderen Betriebssystemen ohne Probleme lauffähig sein. Da für die Anzeige der Hilfeseiten das WebBrowser-Control verwendet wird, muss natürlich der Internet Explorer auf dem System installiert sein.

Programmidee:
Arthur Weber
Orion - Software, Bolinao

Umsetzung:
Arthur Weber und Dieter Otter

Feedback mit Kritik, Anregungen, Tipps senden Sie per Mail an  ArthurW oder posten diese direkt in das  vb@rchiv-Diskussionsforum.



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.