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

https://www.vbarchiv.net
Rubrik: Controls · Sonstiges   |   VB-Versionen: VB4, VB5, VB612.04.04
SetFocus ohne Fehlermeldung

Eine SetFocus-Anweisung OHNE Fehlermeldung, falls das Control deaktiviert oder die Form nicht sichtbar ist.

Autor:   Dieter OtterBewertung:  Views:  36.104 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11kein 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



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

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.