Newsgroup: it.comp.lang.visual-basic
Titolo: [!][Trick] 2 listbox legate per "click"

Ciao a tutti.
Oggi sono impazzito su un problema che forse a qualcun altro potrebbe
prima o poi capitare e, siccome ho trovato una soluzione che mi sembra
abbastanza carina, ho voluto postarvela.
Il discorso e' il seguente.
Abbiamo 2 listbox, una delle quali contiene un elenco di codici e
l'altra contiene delle descrizioni. L'utente e' libero di cliccare su
una qualsiasi delle 2 e l'altra, in risposta al click sulla prima,
deve allinearsi a questa.
Ad esempio, potremmo avere:
1	brufolo
2	cigolo
3	fruttolo
Se l'utente clicca su "1", sulla seconda listbox deve comparire,
selezionato, "brufolo". Analogamente, se subito dopo clicca su
"cigolo", sulla prima listbox deve comparire, selezionato, "2".
Tutti i dati sono in alcune tabelle di un database che viene raggiunto
col solito ADO+ODBC --Roal, abbi pazienza :)--.
La prima idea era stata di estrarre dalla tabella del database un
recordset con la voce corrispondente a quella cliccata e di mettere
listbox2.text=rs.fields(0).value in risposta a listbox1_click, ma
naturalmente questo mi ha portato istantaneamente a un esaurimento
dello stack, perche' le procedure si inloopano
--listbox2.text=qualcosa porta a listbox2_click, il quale chiama
listbox1.text=qualcos'altro che genera listbox1_click, che fa
ricominciare il ciclo--.
Allora ho trovato una soluzione simpatica che consiste nell'usare una
variabile booleana privata nel .bas --mi concedete una variabile a
livello di modulo? =)-- che porto a true quando clicco col mouse e
riporto a false nel momento in cui entro in una delle 2 procedure.
Questo risolve elegantemente il problema del loop ma ne introduce un
altro: se scorro con le frecce oppure coi tasti della tastiera le
listbox, nulla si muove. Dunque e' necessario anche scrivere una riga
di codice per l'evento listbox1_keydown e listbox2_keydown.
Per non tenerla troppo lunga, allora, il risultato finale che ho
raggiunto e' il seguente.
Credo che i nomi delle variabili siano sufficientemente
autoesplicativi.
Non sono stato a pulire il codice delle parti che non interessano,
tanto si capisce quali sono.
*****
Private Mouse As Boolean
Private Sub lstCodiceCaricabatteria_Click()
Dim Compatibile As Boolean
Dim IstruzioneSQL As String
Dim Rs As ADODB.Recordset
 
    IstruzioneSQL = "SELECT tipo_caricabatteria, " _
            & "tensione_carica " _
        & "FROM dati_caricabatterie " _
        & "WHERE codice_caricabatteria='" &
lstCodiceCaricabatteria.Text & "'" _
        & ";"
    Set Rs = EstraiRecord(IstruzioneSQL)
 
    If Mouse Then
        Mouse = False
        lstTipoCaricabatteria.Text = Rs.Fields(0).Value
    'meglio tenere la tensione della batteria piuttosto che quella
    'del caricabatteria, se sono differenti
    '        SelezionaTensioneImpiantoElettrico .Fields(1).Value
 
        IstruzioneSQL = "SELECT codice_batteria " _
            & "FROM batterie_caricabatterie " _
            & "WHERE codice_caricabatteria='" &
lstCodiceCaricabatteria.Text & "'" _
            & ";"
        Set Rs = EstraiRecord(IstruzioneSQL)
 
        Compatibile = False
        With Rs
            Do While Not .EOF
                If .Fields(0).Value = lstCodiceBatteria.Text Then
                    Compatibile = True
                    Exit Do
                End If
                .MoveNext
            Loop
        End With
        If Not Compatibile Then
            AdvMsgBox "Attenzione: il caricabatteria selezionato
risulta non essere compatibile " _
                & "con la batteria selezionata causa diversa
tensione", "Selezione caricabatteria"
        End If
 
    End If
 
    Set Rs = Nothing
 
    txtCaricaMassima.Text = Trim(Mid$(lstTipoCaricabatteria, 7, 3))
 
End Sub
Private Sub lstCodiceCaricabatteria_KeyDown(KeyCode As Integer, Shift
As Integer)
 
    Mouse = True
 
End Sub
Private Sub lstCodiceCaricabatteria_MouseDown(Button As Integer, Shift
As Integer, X As Single, Y As Single)
 
    Mouse = True
 
End Sub
Private Sub lstTipoCaricabatteria_Click()
Dim Compatibile As Boolean
Dim IstruzioneSQL As String
Dim Rs As ADODB.Recordset
 
    IstruzioneSQL = "SELECT codice_caricabatteria, " _
            & "tensione_carica " _
        & "FROM dati_caricabatterie " _
        & "WHERE tipo_caricabatteria='" & lstTipoCaricabatteria.Text &
"'" _
        & ";"
    Set Rs = EstraiRecord(IstruzioneSQL)
 
    If Mouse Then
        Mouse = False
        lstCodiceCaricabatteria.Text = Rs.Fields(0).Value
    'meglio tenere la tensione della batteria piuttosto che quella
    'del caricabatteria, se sono differenti
    '        SelezionaTensioneImpiantoElettrico .Fields(1).Value
        IstruzioneSQL = "SELECT codice_batteria " _
            & "FROM batterie_caricabatterie " _
            & "WHERE codice_caricabatteria='" &
lstCodiceCaricabatteria.Text & "'" _
            & ";"
        Set Rs = EstraiRecord(IstruzioneSQL)
 
        Compatibile = False
        With Rs
            Do While Not .EOF
                If .Fields(0).Value = lstCodiceBatteria.Text Then
                    Compatibile = True
                    Exit Do
                End If
                .MoveNext
            Loop
        End With
        If Not Compatibile Then
            AdvMsgBox "Attenzione: il caricabatteria selezionato
risulta non essere compatibile " _
                & "con la batteria selezionata causa diversa
tensione", "Selezione caricabatteria"
        End If
 
    End If
 
    Set Rs = Nothing
 
    txtCaricaMassima.Text = Trim(Mid$(lstTipoCaricabatteria, 7, 3))
 
End Sub
Private Sub lstTipoCaricabatteria_KeyDown(KeyCode As Integer, Shift As
Integer)
 
    Mouse = True
 
End Sub
Private Sub lstTipoCaricabatteria_MouseDown(Button As Integer, Shift
As Integer, X As Single, Y As Single)
 
    Mouse = True
 
End Sub
*****
Se vi vengono in mente soluzioni alternative e molto piu' semplici
oppure se notate errori, ve ne sono grato.
Per i test che ho effettuato fino ad adesso, sembra che tutto funzioni
bene.
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-VI --- 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

 ha scritto

non sono affatto sicuro di aver capito.
cmq, qui sotto -- dao, ma prob puoi adattare -- ci sono 2 listbox
correlati.
a prescindere dall'indice attivo (normalmente attivo quello che
m'interessa e rinfresco i listbox, ma direi vada in ogni caso), un clic
su una mi evidenzia la voce dell'altra.
spero ti serva,
ciao, a.
Private Sub MyRefresh(Indice As String)
    Dim rs As Recordset, SqlRS As Recordset, Sql As String, j As Integer
    Set rs = MainDB.OpenRecordset("Addresses")
    If Indice = "firm" Then
        Sql$ = "SELECT person, firm FROM addresses ORDER BY firm,person"
    Else
        Sql$ = "SELECT person, firm FROM addresses ORDER BY person,firm"
    End If
    Set SqlRS = MainDB.OpenRecordset(Sql$)
    If SqlRS.BOF And SqlRS.EOF Then Exit Sub
    lstFromTo.Clear
    lstFirm.Clear
    If Indice = "person" Then
        lstFromTo.ForeColor = txtList.ForeColor
        lstFromTo.BackColor = txtList.BackColor
        lstFirm.ForeColor = vbBlack
        lstFirm.BackColor = vbWhite
    Else
        lstFromTo.ForeColor = vbBlack
        lstFromTo.BackColor = vbWhite
        lstFirm.ForeColor = txtList.ForeColor
        lstFirm.BackColor = txtList.BackColor
    End If
    For j = 0 To rs.RecordCount - 1
        lstFromTo.AddItem SqlRS!Person
        If IsNull(SqlRS!firm) Then
            lstFirm.AddItem "*"
        Else
            lstFirm.AddItem SqlRS!firm
        End If
        SqlRS.MoveNext
    Next
    rs.Close
    'MyDB.Close
End Sub
Private Sub lstFirm_Click()
     j = lstFirm.ListIndex
     lstFromTo.Selected(j) = True
End Sub
Private Sub lstFromTo_Click()
     j = lstFromTo.ListIndex
     lstFirm.Selected(j) = True
End Sub
Private Sub tb_ButtonClick(ByVal Button As Button)
    Select Case Button.Key
        ...
        Case Is = "person": MyRefresh ("person")
        Case Is = "firm": MyRefresh ("firm")
        ...
     End Select
End Sub

 wrote in message
9glklk$97aa6$1...@ID-51318.news.dfncis.de...


 Alfonso
Se tu scrivessi, secondo netiquette, IN FONDO al post, t accorgeresti di
stare quotando 1234567890 linee che non c'entrano nulla. :P
Ciaotutti,
Asterix

Siamo in chat
Scusa, Alfonso, puoi evitare 250 righe di quote per un msg che, tra
l'altro, non c'entra un tubo? :)
Cordialmente,


 ha scritto nel messaggio
news:f59uitojqvo8rk9vo...@4ax.com...


 wrote in message
news:9gnh2r$lhu$1...@news.mclink.it...

Cionondimeno insisti a fare il reply SOPRA il testo... Se quotassial di
sotto ti accorgeresti di quanta roba sta sopra, oltre a consentire a chi
legge secondo netiquette di evitare di saltabeccare tra il sopra e il
sotto...
Comprendo che usare OE causi danni gravi alla net-personality, ma esci dal
tunnel di M$ :PP
Ciaotutti,
Asterix