SetFocus in a custom dialog

M

matthias.karl

Hi

I have a logon dialog created with two fields (username & password)
and two buttons (login and cancel).

I'm checking with an event if the fields are empty and enable the
login-button only then.

Private Sub txtPwd_AfterUpdate()
If Me.txtUsr.Value <> "" And Me.txtPwd.Value <> "" Then
Me.cmdLogin.Enabled = True
Me.cmdLogin.SetFocus
Else
Me.cmdLogin.Enabled = False
Me.txtPwd.SetFocus
End If
End Sub

If both fields (Username and Password) are different than "" then I
enable the login-button. And I also want to set the focus on this
login button. But although I do this using the Me.cmdLogin.SetFocus
the focus is set to the next item (the cancel-button). I've tried to
set it on the password-field or any other object, but it just isn't
setting the focus on the login-button.

What am I doing wrong?

Any hint appreciated.

Matthias
 
D

Dave Peterson

I would use both textbox_change procedures to decide to enable/disable the login
button. I wouldn't move focus to that button at all.

Option Explicit
Private Sub CommandButton1_Click()
MsgBox "Login was clicked"
Unload Me
End Sub
Private Sub CommandButton2_Click()
MsgBox "Cancel was clicked"
Unload Me
End Sub
Private Sub TextBox1_Change()
Call EnableLoginCheck
End Sub
Private Sub TextBox2_Change()
Call EnableLoginCheck
End Sub
Private Sub UserForm_Initialize()
With Me.CommandButton1
.Caption = "Login"
.Default = True
.Enabled = False
.TakeFocusOnClick = False
End With
With Me.CommandButton2
.Caption = "Cancel"
.Cancel = True
.TakeFocusOnClick = False
End With
Me.TextBox1.SetFocus
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Call CommandButton2_Click
End If
End Sub
Sub EnableLoginCheck()

Dim Ok As Boolean
Ok = True
If Trim(Me.TextBox1.Value) = "" Then
Ok = False
End If
If Trim(Me.TextBox2.Value) = "" Then
Ok = False
End If

Me.CommandButton1.Enabled = Ok

End Sub
 
M

matthias.karl

I would use both textbox_change procedures to decide to enable/disable the login
button.  I wouldn't move focus to that button at all.

Option Explicit
Private Sub CommandButton1_Click()
    MsgBox "Login was clicked"
    Unload Me
End Sub
Private Sub CommandButton2_Click()
    MsgBox "Cancel was clicked"
    Unload Me
End Sub
Private Sub TextBox1_Change()
    Call EnableLoginCheck
End Sub
Private Sub TextBox2_Change()
    Call EnableLoginCheck
End Sub
Private Sub UserForm_Initialize()
    With Me.CommandButton1
        .Caption = "Login"
        .Default = True
        .Enabled = False
        .TakeFocusOnClick = False
    End With
    With Me.CommandButton2
        .Caption = "Cancel"
        .Cancel = True
        .TakeFocusOnClick = False
    End With
    Me.TextBox1.SetFocus
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        Call CommandButton2_Click
    End If
End Sub
Sub EnableLoginCheck()

    Dim Ok As Boolean
    Ok = True
    If Trim(Me.TextBox1.Value) = "" Then
        Ok = False
    End If
    If Trim(Me.TextBox2.Value) = "" Then
        Ok = False
    End If

    Me.CommandButton1.Enabled = Ok

End Sub

Hi Dave

Thanks for your answer.

I've changed it according to your reply, but still, even with no
SetFocus the "cursor" jumps to the cancel button instead of the login
button when I have changed the password-field. If I don't change the
password-field it tabs correctly to the login-button.

Matthias
 
D

Dave Peterson

How is the focus jumping to the next control?

Are you hitting enter or tab?

There is a .tabindex property that you can use to make sure the tab/enter takes
you to the correct next control.

And there is a .tabstop property that you can use to skip any of the controls
you want.
 
M

matthias.karl

How is the focus jumping to the next control?

Are you hitting enter or tab?

There is a .tabindex property that you can use to make sure the tab/enter takes
you to the correct next control.

And there is a .tabstop property that you can use to skip any of the controls
you want.

Dave

I'm pressing the tab-key to move out of the password-field and the
focus is then set to the cancel-button.

TabIndex 0 is the label for the username-field with TabStop = False
(so that I can use the accelerator)
TabIndex 1 is the username-field with TabStop = True
TabIndex 2 is the label for the password-field with TabStop = False
(so that I can use the accelerator)
TabIndex 3 is the password-field with TabStop = True
TabIndex 4 is the Login-button with TabStop = True
TabIndex 5 is the Cancel-button with TabStop = True

Matthias
 
M

matthias.karl

If you set the tabstop to false, then you're going to skip that control.
But it is NOT set to false. It is TRUE on the login-button.

It is only set to false on the LABELS for the two fields.

Matthias
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top