2
www.ChF-Online.de  

Formularfelder mit QuickInfos versehen

   Neuigkeiten
   API-Aufrufe in VBA
   VBA2HTML
   Word
   Word-VBA
 Verschiedenes
 Feld-Arbeiten
 Form-Sachen
 Menü-/Symbolleisten
 VBA und Lotus Notes
 VBA und Mail
 Inside VBAIDE
 Von Word nach Outlook
aktiv aktiv Fix-und-Fertiges/Projekte
 Aufgaben in OL eintragen
 Einfacher Dateibrowser
 Formatvorlagen
 Formularfelder sichern
 Formluarfelder formatieren
 Formluarfelder formatieren 2
 Formluarfelder formatieren 3
aktiv  Formular-QuickInfos
 Kontextmenü erstellen
 Sicherheitskopien an bel. Orten
 Sicherheitskopien erstellen Word 2007/2010
 ToolTipps ändern
 Dokumenteigenschaften kopieren
 (Jahres-)Kalender erstellen
 Zeichen-Zähler
   Word2007 (RibbonX)
   Word2010 (RibbonX)
   Outlook-VBA
   Links zu VB(A)
   DocToHelp
   Netport Express XL
   Astronomie
   Gästebuch
   Volltextsuche
   Sitemap
   Buch:Word-Programmierung
   Impressum & Kontakt
   Datenschutzerklärung
Getestet unter Word2000Getestet unter WordXPGetestet unter Word2003  
Beispiel anzeigen
Makro/Datei speichern
Print

Jedem Formularfelder lässt sich über das jeweilige Optionsfeld ein Hilfetext (QuickInfo) zuweisen.

Dieser Hilfetext wird dann wahlweise in der Statusleiste oder über die F1-Taste angezeigt.
Beide Anzeigen haben aber einen Nachteil:

  • die Statusleiste wird auch für andere Informationen verwendet und spätestens beim Ausfüllen des Formularfelders wieder zurückgesetzt,
  • das Hilfefenster muss erst über die F1-Taste aufgerufen werden.

Aus diesen Überlegungen entstand der Wunsch nach einem Hinweisfenster, das automatisch beim Wechsel in ein Formularfeld angezeigt wird und auch automatisch wieder ausgeblendet wird.
In diesem kleinen Projekt wird gezeigt, wie sich dieser Wunsch umsetzen lässt.

Im Wesentlichen besteht die Lösung aus einer UserForm zur Anzeige der Informationen und dem Klassenereignis WindowSelectionChange(ByVal Sel As Selection).
Wird nun in ein Formularfeld gewechselt (per Mausklick oder Tab-Taste), dann wird dieses Ereignis ausgeführt. Zuerst wird einmal geprüft, ob überhaupt in ein Formularfeld gewechselt wurde; dies wird in einer For..Each-Anweisung über alle Formularfelder geprüft, bei der mit Hilfe der InRange-Methode geprüft wird, ob die Markierung Sel in einem Formularfeld liegt:

For Each ff In ActiveDocument.FormFields
  If Sel.InRange(ff.Range) Then
  '...  
  End If
End Sub 

Nur für diesen Fall wird über die GetPoint-Methode die Bildschirmkoordinate des Formularfeld-Bereiches ermittelt, damit anschließend die UserForm mit der Information unterhalb dieses Formularfeldes angezeigt werden kann. Diese Methode liefert von einem Selection- oder Range-Objektes die Position (Top und Left) und Abmessung (Höhe und Breite) zurück. Diese Position wird dann zum Positionieren der UserForm herangezogen; dabei wird gleichzeitig überprüft, ob die UserForm aus dem Bildschirmbereich ragen würde und dies in diesem Fall korrigiert.

Die Information, die in der UserForm angezeigt werden soll, wird dann aus dem Hilfetext im Optionsdialog des Formularfeldes ausgelesen. Ist dort kein Hilfetext hinterlegt, wird auch kein QuickInfo angezeigt.

With frmQuickText
  .Caption = "Hinweis"
  .Label1.Caption = ff.StatusText
  '...  
End With

Um nun in der UserForm auch einen Hinweis auf die Art des Formularfeldes geben zu können, muss der Formularschutz kurzzeitig ausgeschaltet werden. Nur dann lässt sich der genaue Typ des Textfeldes (wdFieldFormTextInput) ermitteln.

Das automatische Ausblenden der QuickInfo-UserForm erfolgt mit Hilfe der OnTime-Methode, die nach einer einstellbaren Zeit die UserForm wieder ausblendet.

Das gesamte Klassenmodul sieht dann folgendermaßen aus:

Option Explicit
Public fField As String
Public WithEvents oApp As Application
Private Sub oApp_WindowSelectionChange(ByVal Sel As Selection)  
Dim ff As FormField
Dim pLeft As Long
Dim pTop As Long
Dim pWidth As Long
Dim pHeight As Long
If fField = "" Then fField = ActiveDocument.FormFields(1).Name
If ActiveDocument.ProtectionType = wdAllowOnlyFormFields Then
For Each ff In ActiveDocument.FormFields
  If Sel.InRange(ff.Range) Then
    If ff.Name <> fField Then
      If ff.StatusText = "" Then Exit Sub  
      ActiveWindow.GetPoint pLeft, pTop, pWidth, pHeight, ff.Range
      Load frmQuickText
      With frmQuickText
        .Caption = "Hinweis"
        .Label1.Caption = ff.StatusText
        If ff.Type = wdFieldFormTextInput Then
          Application.ScreenUpdating = False
          ActiveDocument.Unprotect
          Select Case ff.TextInput.Type
          Case wdRegularText
            .Caption = "Hinweis: Textfeld"
          Case wdCalculationText
            .Caption = "Hinweis: Berechnungsfeld"
          Case wdCurrentDateText
            .Caption = "Hinweis: Aktuelles Datum"
         Case wdCurrentTimeText
            .Caption = "Hinweis: Aktuelle Zeit"
          Case wdDateText
            .Caption = "Hinweis: Datumsfeld"
         Case wdNumberText
            .Caption = "Hinweis: Zahlfeld"
          End Select
          ActiveDocument.Protect wdAllowOnlyFormFields, True
          Application.ScreenUpdating = True
        Else
          .Caption = "Hinweis"
        End If
        .Left = PixelsToPoints(pLeft, True)
        .Top = PixelsToPoints(pTop, False) + (1.5 * 12)
        If pLeft + .Width >= System.HorizontalResolution Then
          .Left = PixelsToPoints(pLeft, True) - .Width
        End If
        If pTop + .Height >= System.VerticalResolution - 100 Then
          .Top = PixelsToPoints(pTop, False) - .Height
        End If
        .StartUpPosition = 0
        .Show vbModeless
        ff.Select
      End With
      Application.OnTime Now + TimeValue(modQuickText.c_Seconds), "modQuickText.Hide", True
      fField = ff.Name
      Exit For
    End If
  End If
Next ff
End If
End Sub  

Damit nun die UserForm nicht bei jeder Eingabe angezeigt wird, muss geprüft werden, ob sich die Eingabemarke nicht bereits im Formularfeld befindet. Dies wird dadurch erreicht, dass nach dem Wechsel zu einem Formularfeld der Name zwischengespeichert wird und beim nächsten Auslösen des Ereignisses dieser geprüft wird. Nur wenn das Ereignis bei einem anderen Formularfeld ausgeführt wird, wird die UserForm wieder angezeigt.


 Besucher: 0 online  |  0 heute  |  0 diesen Monat  |  2202556 insgesamt | Seitenaufrufe: 67   Letzte Änderung: 03.11.2007 © 2001-18 Christian Freßdorf
  Ich verschiebe niemals auf morgen, was sich auch übermorgen erledigen läßt.
Oscar Wilde
 powered by phpCMS and PAX