Newsgroup: it.comp.lang.visual-basic
Titolo: proprietà SetFocus

Ciao a tutti e scusate la banalità. A volte i problemi più semplici
sembrano insormontabili.
In un mio progettino ho un campo a mappa che si chiama txtCodice al
quale voglio assegnare il controllo subito dopo l'operazione di
registrazione, in questo modo:   txtCodice.SetFocus.
Perchè mi ritorna l' errore :
"Run-time error 5       Invalid Procedure call or argument"   ???
Grazie e ciao
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 "Run-time error 5       Invalid Procedure call or argument"   ???
Problema banale ma frequente: il textbox è invisibile (o non ancora visibile al
momento in cui viene chiamato SetFocus) o disabilitato.
Bye
Raf

il textBox è sia visibile che abilitato e non "lokkato"


 il textBox è sia visibile che abilitato e non "lokkato"
E' in un frame?
Alberto
-- 
E tutto mi sembrava andasse bene... 

 Alberto
Si. E' in un frame!!!


 Si. E' in un frame!!!
Prova a immaginare la mia prossima domanda, visto che oramai siamo in 
chat...


 Alberto
Se il frame è visibile / abilitato??
Se è questa, la risposta è si per entrambe le proprietà.
Se non è questa..............non ho vinto niente!?!?!?


 Se è questa, la risposta è si per entrambe le proprietà.
La domanda era ovviamente quella, la mia ironia verteva sul fatto che questo 
tipo di informazioni devi darle tu senza aspettare che qualcuno te le 
chieda, quando è esplicito che si sta andando su una certa strada. 
Altrimenti diventa veramente una chat anzichè un NG.
Comunque, se il textbox si chiama effettivamente così e tu hai Option 
Explicit a inizio modulo (ed esegui con CTRL+F5, non con F5 da solo...), 
l'unica cosa che vedo possibile è che il textbox il focus non possa proprio 
prenderlo, in quel momento.
Metti un breakpoint sul setfocus.
Quando l'app si ferma sul breakpoint, minimizzi VB e verifichi che il 
textbox sia visible, enabled, e che tutti i frame in cui è contenuto siano 
anch'essi enabled.
Se graficamente non riesci a capire se è enabled, puoi mettere un exit sub 
prima del setfocus, e subito dopo provare a dare il fuoco col clic del 
mouse.
Ciao


 Se non è questa..............non ho vinto niente!?!?!?
La SetFocus viene chiamata nell'evento Form_Load, o in un momento in cui il form
o uno dei controlli che contiene il textbox è invisibile?
Raf

 Grazie e ciao
Se il controllo ha già il focus il tuo comando genera errore.
Ciao, Sauro

 Se il controllo ha già il focus il tuo comando genera errore.
sei sicuro?
qui sotto l'errore non arriva ne' al click sul form ne' col timer.
l'errore 5 arriva invece se commenti me.show al load.
ciao, a.
Option Explicit
Private Sub Command1_Click()
    Timer1.Enabled = Not Timer1.Enabled
    Caption = Timer1.Enabled
End Sub
Private Sub Form_Click()
    Command1.SetFocus
End Sub
Private Sub Form_Load()
    Me.Show
    Command1.SetFocus
End Sub
Private Sub Timer1_Timer()
    Command1.SetFocus
End Sub

Provare a mettere in un modulo pubblico
le seguenti funzioni:
Public Sub MettiFuocoSu(F As Form, c As Control)
    Dim NomeForm As String
    Dim NomeControl As String
    Dim NomeAttivo As String
   On Error GoTo MettiFuocoSu_Error
    NomeForm = F.Name
    NomeControl = c.Name
    Dim Conta As Integer
    NomeAttivo = 
F.ActiveControl.Name
    If NomeControl <> NomeAttivo Then
        c.SetFocus
        Exit Sub
    End If
   On Error GoTo 0
   Exit Sub
MettiFuocoSu_Error:
    If Err.Number = 91 Then Exit Sub
    If Err.Number = 5 Then
        Call MsgBox("Errore di SetFocus" _
                    & vbCrLf & "Nome Form:                " & NomeForm _
                    & vbCrLf & "Nome controllo attivo:    " & NomeAttivo _
                    & vbCrLf & "Nome controllo richiesto: " & NomeControl _
                    , vbInformation, App.Title)
        Exit Sub
    End If
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure
MettiFuocoSu of Modulo ModPublic"
End Sub
Public Sub MettiFuocoPiu(F As Form, c As Control)
    Dim NomeForm As String
    Dim NomeControl As String
    Dim NomeAttivo As String
    Dim IndexAttivo As Integer
    Dim Conta As Integer
   On Error GoTo MettiFuocoPiu_Error
   DoEvents
    NomeForm = F.Name
    NomeControl = c.Name
    NomeAttivo = 
F.ActiveControl.Name
    IndexAttivo = F.ActiveControl.Index
    If Not (NomeControl = NomeAttivo And IndexAttivo = c.Index) Then
Vai:
        c.SetFocus
        Exit Sub
    End If
   On Error GoTo 0
   Exit Sub
MettiFuocoPiu_Error:
    If Err.Number = 91 Then Exit Sub
    If Err.Number = 343 Then Resume Vai
    If Err.Number = 5 Then
        Call MsgBox("Errore di SetFocus" _
                    & vbCrLf & "Nome Form:                " & NomeForm _
                    & vbCrLf & "Nome controllo attivo:    " & NomeAttivo _
                    & vbCrLf & "Nome controllo richiesto: " & NomeControl _
                    , vbInformation, App.Title)
        Exit Sub
    End If
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure
MettiFuocoSu of Modulo ModPublic"
End Sub
Poi richiamarle così:
Mettifuocosu NomeForm, NomeControllo
oppure
Mettifuocopiu NomeForm, NomeControllo(index)
Potrete verificare che non verrà generato errore 343
che avviene quando il controllo ha già il fuoco.
L'errore 5 per la verità rimane.
Ciao, Sauro