vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
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:     [ Jetzt bewerten ]Views:  36.077 
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

Dieser Tipp wurde bereits 36.077 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle 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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel