Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Click sul default CmdButton prima del lostfocus di un altro controllo: come evitare?

Il subject forse non e' molto chiaro, ma di meglio non ho trovato :|
VS6SP5 ita su Win2kSP2 ita.
Ho un form con una textbox dove scrivo un codice. Quando esco dalla
textbox faccio una query di estrazione da un database per inserire in
un'altra textbox la descrizione di quell'articolo.
Successivamente, premo su un command button per inserire queste
informazioni in una riga di una mshflexgrid.
Fin qui, tutto ok: la cosa funziona come deve --cioe' bene :)--.
Il fatto e' che e' comodo poter avere il command button "inserisci"
come default, cosi' che anziche' muoversi col tab oppure cliccare col
mouse sia sufficiente, per inserire una riga, premere <invio>.
Ecco, il problema viene qui: quando uno preme invio, il
cmdInserisci_Click avviene *prima* del txtCodice_LostFocus e quindi
nella tabella inserisco una riga che ha il codice nuovo e la
descrizione vecchia.
Subito dopo il cmdInserisci_Click avviene, correttamente, il
txtCodice_LostFocus.
Come posso fare per evitare questo spiacevole inconveniente?
Il codice che uso e' questo:
*****
Private Sub txtCodice_LostFocus()
Dim Rs As ADODB.Recordset
Dim IstruzioneSQL As String
Dim Cod As String
 
    On Error GoTo ERRORE
 
    If Len(txtCodice.Text) = 9 Then
        Cod = Replace(txtCodice.Text, ".", "")
        IstruzioneSQL = "SELECT descrizione " _
            & "FROM articoli " _
            & "WHERE codice_articolo='" & Cod & "';"
 
        Set Rs = EstraiRecord(IstruzioneSQL)
 
        With Rs
            Select Case .RecordCount
                Case Is >= 1
                    txtDescrizione.Text = .Fields(0).Value
                Case 0
                    MsgBox "Codice inesistente"
            End Select
        End With
 
        Set Rs = Nothing
 
    Else
        txtCodice.Text = ""
    End If
 
    Exit Sub
 
ERRORE:
    ErrBox "ERRORE -> " & Err.Number & ":" & Err.Description,
IstruzioneSQL, "txtCodice_LostFocus:---"
End Sub
Private Sub cmdInserisci_Click()
Dim Linea As String
 
    If gridTabella.TextMatrix(1, 0) <> "" Then
        If txtCodice.Text = "" Then
            Linea = txtPosizione.Text & _
                        vbTab & "-" & _
                        vbTab & txtQuantita.Text & _
                        vbTab & txtDescrizione.Text
            gridTabella.AddItem (Linea)
        Else
            Linea = txtPosizione.Text & _
                        vbTab & txtCodice.Text & _
                        vbTab & txtQuantita.Text & _
                        vbTab & txtDescrizione.Text
            gridTabella.AddItem (Linea)
        End If
    Else
        With gridTabella
            .TextMatrix(1, 0) = txtPosizione.Text
            .TextMatrix(1, 1) = txtCodice.Text
            .TextMatrix(1, 2) = txtQuantita.Text
            .TextMatrix(1, 3) = txtDescrizione.Text
        End With
    End If
 
    'ToDo: selezionare l'ultima riga inserita
    With gridTabella
        .Col = 0
        .ColSel = 0
        .Sort = flexSortGenericAscending
        .Row = .Rows - 1
        .RowSel = .Row
        .ColSel = 3
    End With
 
    Posizione.ModText = txtPosizione.Text
    Codice.ModText = txtCodice.Text
    Quantita.ModText = txtQuantita.Text
    Descrizione.ModText = txtDescrizione.Text
 
    'ToDo: selezionare il primo numero non esistente
    txtPosizione.Text = Val(txtPosizione.Text) + 1
    txtPosizione.SetFocus
 
End Sub
*****
Il codice contiene una sporca ma efficacissima parte per risolvere il
problema della prima riga vuota che dicevamo in altro post. La perdita
di prestazioni per il primo if e' praticamente inesistente, essendo il
codice da eseguire praticamente sempre quello relativo al ramo "then"
della condizione.
Il numero di record estratti potrebbe essere maggiore di zero se la
descrizione ad un certo punto e' cambiata. Devo ancora gestire la
modifica delle descrizioni.
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 0.68, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
Nike Air Up Tempo Sad Walker -- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD
   On contrary of popular belief, Unix *IS* user friendly:
    it just appears to be selective who it is friend with

                         vbTab & "-" & _
[...]
Ciao
Alfonso

la select, se la tabella è piccola non te ne accorgi nemmeno
Non ho capito esattamente cosa intendi, comunque, se ho inteso bene,
non sono convinto che sarebbe una soluzione efficace. Mi spiego: visto
che il click del command button avviene prima del lostfocus della
textbox, in quale punto del codice modificherei il flag "2berefreshed"
della mia textbox per impostarlo true o false?
Il problema della query non c'e'. La select e' praticamente
istantanea: ho meno di 20.000 record e PgSQL ci mette una frazione
nientesima di secondo ad estrarre quello che mi serve, ma in realta'
la select viene eseguita quando il cmd_click e' gia' stato effettuato
e quindi ho gia' inserito nella griglia il contenuto --sbagliato--
della textbox. Dopo che la riga e' stata aggiunta, avviene il
text_lostfocus e, durante questo, la select.


 
Mi viene in mente una soluzione molto banale.
In txtCodice_LostFocus chiami EstraiDaDatabase.
In cmdInserisci_Click chiami prima EstraiDaDatabase
e poi InserisciInGriglia.
Cosě fai due volte l'estrazione dal database, ma mi sembra il minore
dei mali.
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/news/

e poi InserisciInGriglia.
Sono d'accordo. In effetti la soluzione e' vagamente raffazzonata,
pero' efficace.
Anche perche' potrei usare un flag booleano che setto quando ho la
textbox_gotfocus e resetto quando ho il cmd_click. In questo caso, la
textbox_lostfocus potrebbe fare la query di selezione soltanto se il
flag e' ancora settato. Se fa la query, resetta a sua volta il flag.
Ok, soluzione ottima.
Grazie.
