Formularfelder mit QuickInfos versehen |
|
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.
Aus diesen Überlegungen entstand der Wunsch nach einem Hinweisfenster, das automatisch beim Wechsel in ein Formularfeld angezeigt wird und auch automatisch wieder ausgeblendet wird. Im Wesentlichen besteht die Lösung aus einer UserForm zur Anzeige der Informationen und dem Klassenereignis WindowSelectionChange(ByVal Sel As Selection). 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 |