Rubrik: Controls · Sonstiges | VB-Versionen: VB4, VB5, VB6 | 12.04.04 |
SetFocus ohne Fehlermeldung Eine SetFocus-Anweisung OHNE Fehlermeldung, falls das Control deaktiviert oder die Form nicht sichtbar ist. | ||
Autor: Dieter Otter | Bewertung: | Views: 36.104 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Objekte, die den Fokus erhalten können, besitzen i.a.R. auch eine SetFocus-Methode, so dass man den Fokus gezielt per VB-Code auf ein bestimmtes Objekt / Control setzen kann.
Was aber, wenn die Form (noch) nicht sichtbar oder das Control aktuell deaktiviert ist?
In diesem Fall quittiert uns VB den SetFocus-Aufruf mit einer unserer Lieblingsfehlermeldungen:
Laufzeitfehler 5:
Ungütliger Prozeduraufruf oder ungültiges Argument
Klar - kann ja eigentlich auch nicht funktionieren: den Fokus auf ein Control setzen, dass noch gar nicht angezeigt wird *tststst*
Macht man ja normalerweise auch nicht *kopfschüttel*
Was aber, wenn man im Form_Load-Ereignis den Fokus auf ein bestimmtes Control setzen möchte, ohne die TABINDEX-Reihenfolge hierfür explizit zu ändern?
Nun ja: man ruft bereits im Form_Load-Ereignis die Show-Methode der Form auf und setzt danach den Fokus auf das gewünschte Control:
Private Sub Form_Load() ' Form anzeigen Me.Show DoEvents ' Fokus auf TextBox setzen Text5.SetFocus ... End Sub
Das funktioniert. Aber: Was, wenn es sich um eine Form handelt, die modal von einer anderen Form aufgerufen werden soll? In diesem Fall dürfen wir auf keinen Fall die Show-Methode verwenden! Und somit quittiert uns VB den Versuch den Fokus im Form_Load-Ereignis zu setzen, wieder mit obiger Fehlermeldung
Eine Alternative wäre, den Fokus im Activate-Ereignis der Form auf das gewünschte Control zu setzen:
Option Explicit Private bFirstTime As Boolean Private Sub Form_Load() bFirstTime = True End Sub Private Sub Form_Activate() If bFirstTime Then bFirstTime = False Text5.SetFocus End If End Sub
Das funktioniert zwar auch - ist aber nicht so elegant.
Eleganter geht es mit der SetFocus API-Funktion!
' In einem Modul... Option Explicit ' Benötigte API-Deklarationen Private Declare Function SetFocusAPI Lib "user32" _ Alias "SetFocus" ( _ ByVal hwnd As Long) As Long
Die SetFocus-Funktion aus dem Windows-API hat gegenüber der SetFocus-Anweisung der Controls nämlich einen entscheidenden Vorteil: Mit der API-Variante kann man den Fokus auf ein Control setzen, auch wenn dieses zum Zeitpunkt des Aufrufs noch gar nicht sichtbar ist!
Der Code im Form_Load-Ereignis unserer modalen Form sieht demnach wie folgt aus:
Private Sub Form_Load() ' Fokus aus TextBox setzen SetFocusAPI Text5.hWnd End Sub