Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [VB6 & API]Popolamento combobox e valore selezionato

    Ciao ragazzi!

    Sto popolando una combobox in questo modo per ottenere performance migliori rispetto al metodo AddItem:

    codice:
    Public Sub subPopolaComboAPI(cmbNomeCombo As ComboBox, _
        strNomeTabella As String, _
        strNomeCampo)
        
        Dim strValore As String
        
        cmbNomeCombo.Visible = False
    
        Call SendMessage(cmbNomeCombo.hwnd, CB_RESETCONTENT, 0&, ByVal 0&)
        cmbNomeCombo.AddItem ""
        ' *************************************************************
        ' Popolo la lista delle aziende
        ' *************************************************************
        Dim rsPopolaCombo As Recordset
        Set rsPopolaCombo = New Recordset
        rsPopolaCombo.Open "SELECT ID," & strNomeCampo & " FROM " & strNomeTabella & _
            " ORDER BY " & strNomeCampo, Connessione
        
        Do While Not rsPopolaCombo.EOF
    
            ' ********************************************************
            ' Assegno l'indice all'elemento della list box uguale
            ' all'ID che trovo all'interno della tabella.
            ' ********************************************************
            strValore = rsPopolaCombo(strNomeCampo)
            Call SendMessage(cmbNomeCombo.hwnd, CB_ADDSTRING, _
    ByVal rsPopolaCombo!ID, ByVal strValore)
            
            rsPopolaCombo.MoveNext
        Loop
    
        rsPopolaCombo.Close
        Set rsPopolaCombo = Nothing
        ' *************************************************************
        
        cmbNomeCombo.Visible = True
    
    End Sub
    Quando però vado ad interpellare la combo per vedere quale valore è stato selezionato dall'utente, ovvero:
    codice:
    msgbox cmbNomeCombo.ItemData(cmbNomeCombo.ListIndex)
    l'applicazione mi restituisce sempre e solo 0.
    Dove sto sbagliando?

    Sicuramente l'inghippo sta qua:
    codice:
    Call SendMessage(cmbNomeCombo.hwnd, CB_ADDSTRING, _
    ByVal rsPopolaCombo!ID, ByVal strValore)
    Io credevo che con
    codice:
    ByVal rsPopolaCombo!ID
    si potesse passare alla combobox il valore da assegnare ad ogni singola selezione, ma così non è.

    Qualcuno mi può aiutare?

    Ciao!
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Mi sfugge qualcosa ... perche' controlli ItemData e non la List ...? Ovvero

    msgbox cmbNomeCombo.List(cmbNomeCombo.ListIndex)

  3. #3
    Perchè io non voglio ottenere il testo di ciò che ho selezionato ma il suo valore.
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  4. #4
    Faccio un esempio:
    la combo ha 2 item.

    "Item 1" il cui valore è 1909
    "Item 2" il cui valore è 8321

    Io con msgbox cmbNomeCombo.List(cmbNomeCombo.ListIndex) ottengo "Item 1" ma io voglio ottenere 1909.

    Mi sono spiegato?
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Gianluca Frati
    Faccio un esempio:
    la combo ha 2 item.

    "Item 1" il cui valore è 1909
    "Item 2" il cui valore è 8321

    Io con msgbox cmbNomeCombo.List(cmbNomeCombo.ListIndex) ottengo "Item 1" ma io voglio ottenere 1909.

    Mi sono spiegato?
    Okay ... ma a questo punto ti chiedo, il tuo codice, oltre ad inserire i vari "Item 1" ... dove inserisce i valori 1909 ...? Ho l'impressione che tu abbia frainteso il funzionamento del comando inviato con la SendMessage ...

  6. #6
    E' proprio questo il punto:

    Tale valore pensavo di averlo inserito in questo modo:
    codice:
    Call SendMessage(cmbNomeCombo.hwnd, CB_ADDSTRING, _
    ByVal rsPopolaCombo!ID, ByVal strValore)
    Dentro a rsPopolaCombo!ID c'è il valore 1909, ma non è questo il modo giusto per inserire il valore nella combo.

    Come inserirlo quindi?
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No ... infatti, come puoi leggere in

    CB_ADDSTRING Message

    il parametro

    (WPARAM) wParam, // = 0; not used, must be zero

    non viene usato e quindi non puoi passare nessun valore, tanto meno questo finisce nella collection ItemData.

    Come avevo pensato, hai frainteso il funzionamento di CB_ADDSTRING. Devi usare il messaggio

    CB_SETITEMDATA Message

    i cui parametri saranno


    Parameters

    wParam
    Specifies the item's zero-based index.
    lParam
    Specifies the new value to be associated with the item.

  8. #8
    Mhh..ancora non mi torna qualcosa.

    Questo è quello che ho fatto:
    codice:
    Private Const CB_ADDSTRING = &H143
    Private Const CB_SETITEMDATA = &H151
    .....
    .....
    lngAddIndex = SendMessage(cmbNomeCombo.hwnd, CB_ADDSTRING, 0, ByVal strValore)
    SendMessage cmbNomeCombo.hwnd, CB_SETITEMDATA, lngAddIndex, ByVal rsPopolaCombo!ID
    ....
    ....
    Quando però vado a fare:
    codice:
    MsgBox cmbNomeCombo.ItemData(cmbNomeCombo.ListIndex)
    Mi restituisce un numero molto alto che non è sicuramente uguale a rsPopolaCombo!ID

    Dove sbaglio?
    Nella sintassi di CB_SETITEMDATA oppure in MsgBox cmbNomeCombo.ItemData(cmbNomeCombo.ListIndex) ?

    Ah..dimenticavo...grazie...
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    A "prima vista" se il numero e' "alto" allora puo' essere un puntatore ... quindi

    ByVal lngAddIndex

  10. #10
    Intendi di cambiare questo:

    codice:
    SendMessage cmbNomeCombo.hwnd, CB_SETITEMDATA, lngAddIndex, ByVal rsPopolaCombo!ID
    in questo:

    codice:
    SendMessage cmbNomeCombo.hwnd, CB_SETITEMDATA, ByVal lngAddIndex, ByVal rsPopolaCombo!ID
    Perchè se è così non cambia nulla...
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.