Newsgroup: it.comp.lang.visual-basic
Titolo: Trovare dati in ListBox

Salve a tutti, il mio problema è questo: vado a popolare una listbox con un
database mediante un ciclo "do while", aggiungendo i dati con
"listbox.additem (db.rs.fields("CAMPO"))"
Siccome dovrei aggiungere un secondo campo sempre sulla stessa riga, vorrei
sapere:
1) come incolonnare in modo ordinato i dati (il secondo campo lo aggiungo
con db.rs.fields("CAMPO1") & "  " & db.rs.fields("CAMPO2"))
NB: CAMPO1 può contenere dati di diversa lunghezza, e CAMPO2 inizia a
scrivere alla fine di CAMPO1.
2) Come posso spostare la selezione di un record passandogli i primi 3 o 4
caratteri di quello che voglio cercare? Se digito il primo carattere mi
cerca la prima parola che inizia per il carattere digitato, ma vorrei
passargli almeno i primi 3.
Per la soluzione 2 avevo pensato all'evento listbox.selected (2) = true. In
questo modo mi seleziona la riga 2, ma non mi va bene, perchè non ho (e non
lo vorrei mettere) un numero progressivo nel database, quindi non riesco a
risalire al numero della riga.
Grazie per l'aiuto.

 
[...]
Che ne pensi di usare un controllo ListWiev anzichč una ListBox?
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

> Che ne pensi di usare un controllo ListWiev anzichč una ListBox?
Si, ok, avevo pensato al controllo ListView, ma volevo sapere se possibile
fare quelle operazioni con una semplice listbox. Grazie comunque.

 fare quelle operazioni con una semplice listbox. Grazie comunque.
se vuoi evitare il sovraccarico dei common controls e usare il listbox:
1.1. crei due o piu' colonne usando un padding con spazi e un font non
proporzionale tipo courier new
1.2. idem, usando chr$(9) come divisore. tutto da vedere l'incolonnamento se
gli item hanno lunghezze molto diverse
2. se ha due colonne, e una e' composta da long, p.e. un id numerico,
dovresti poter caricare il long nell'itemdata di ogni elemento:
"La proprietà ItemData è una matrice di valori di tipo intero lungo con lo
stesso numero di elementi della proprietà List di un controllo"
aspe', mi viene in mente ora che albe v° ha poco tempo fa postato
sull'argomento...
si': thread listbox a piu' campi in visual basic, post del 31.1.2003, san
geminiano, ore 9.37
alberto, ne faresti una faq per il s.c. ? mi sembra che capiti spesso...
ciao

 alberto, ne faresti una faq per il s.c. ? mi sembra che capiti spesso...
D'accordissimo e una domanda:
Mentre mi sono chiare (e ne ho usufruito) le modalità per pubblicare un
progetto sul SC, non ho idea di come si possa proporre una FAQ. Intendo dire
(dando per scontato che la si debba spedire al SC), come si struttura, che
"regole" deve seguire, che informazioni (descrizione, risposte, esempi,
etc.) deve contemplare?

 Grazie per l'aiuto.
Questo è per la soluzione 2
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA"
(ByVal hWnd As Long, ByVal wMsg As Integer, ByVal wParam As String, lParam
As Any) As Long
Const LB_FINDSTRING = &H18F
Private Sub Text1_Change()
    List1.ListIndex = SendMessage(List1.hWnd, LB_FINDSTRING, Text1, ByVal
Text1.Text)
End Sub
--------------------------------
Inviato via 
http://usenet.libero.it

 ha scritto

la persona piu' adatta a risponderti al momento credo sia zanna.
ciao

 scrivere alla fine di CAMPO1.
 Per questo cerca info riguardo il messaggio LB_SETTABSTOPS.
 Immagino che potresti volere, a questo punto, anche una scrollbar
orizzontale sulla listbox, in questo caso cerca info riguardo il messaggio
LB_SETHORIZONTALEXTENT
Ciao
Ciao


 san geminiano, ore 9.37
Già...
Trovo molto interessante il discorso del LB_SETTABSTOPS, me lo andrò a
vedere.
Per il momento, riposto una soluzione simpatica.
Al di là del listbox, io l'ho trovata molto utile anche per tante altre cose
(redimensionare controlli a run-time usando le dimensioni di un testo,
ecc...).
Ad esempio, ho una form MyMsgBox, che è sostanzialmente un msgbox, con un
timer che consente di chiuderlo dopo un timeout, con alcuni pulsanti
aggiuntivi e icone personalizzate.
Le dimensioni orizzontali e verticali del msgbox vengono fissate allo Show
sfruttando le dimensioni del testo inserito come messaggio.
Ciao
Alberto
Riposto qui sotto:
Copioincollo da un mio progetto (alcune cose non riguardano
l'incolonnamento, ma le lascio per chiarezza).
Sulla form serve la listbox LISTA_ARTICOLI e una picturebox invisibile
PICTURE1.
Private Sub Popola_Lista_Articoli()
Dim n As Long
Dim Spazi As Long
Dim indice As Long
Dim Stringa As String
n = Apri_Recordset(Ccn, RCS_Articoli, "select * from catalogo_articoli order
by codice")
Select Case n
    Case Is < 0
        Call MsgBox("Un errore ha impedito di ricavare l'elenco degli
Articoli.", vbOKOnly + vbMsgBoxSetForeground, "Gestione Articoli")
        Exit Sub
    Case 0
        Call MsgBox("L'elenco degli Articoli risulta vuoto.", vbOKOnly +
vbMsgBoxSetForeground, "Gestione Articoli")
        Exit Sub
End Select
Lista_Articoli.Clear
n = 0
indice = 0
'Imposto la PictureBox come la ListBox
Picture1.Font = Lista_Articoli.Font.Size
Picture1.FontBold = Lista_Articoli.Font.Bold
Picture1.FontItalic = Lista_Articoli.Font.Italic
Picture1.FontName = 
Lista_Articoli.Font.Name
RCS_Articoli.MoveFirst
Do While Not RCS_Articoli.EOF
    n = n + 1
    'Creazione stringa per ListBox
    Stringa = LEFT(RCS_Articoli.Fields.Item("codice").Value, 32)
    Spazi = (2800 - Picture1.TextWidth(Stringa)) \ Picture1.TextWidth(" ")
    If Spazi < 0 Then Spazi = 0
    Stringa = Stringa & Space(Spazi) & "- " &
LEFT(RCS_Articoli.Fields.Item("nome").Value, 32)
    Spazi = (5600 - Picture1.TextWidth(Stringa)) \ Picture1.TextWidth(" ")
    If Spazi < 0 Then Spazi = 0
    Stringa = Stringa & Space(Spazi) & "- " &
LEFT(RCS_Articoli.Fields.Item("descrizione").Value, 50)
    'A fine stringa aggiungo l'UniqueIdentifier (molto a destra, così non si
vede)
    Spazi = (10000 - Picture1.TextWidth(Stringa)) \ Picture1.TextWidth(" ")
    If Spazi < 0 Then Spazi = 0
    Stringa = Stringa & Space(Spazi) & "- " &
CStr(RCS_Articoli.Fields.Item("ID_Articolo").Value)
    Lista_Articoli.AddItem Stringa
    'Se il record ha descrizione vuota mi memorizzo l'indice
    If Trim(RCS_Articoli.Fields.Item("nome").Value &
RCS_Articoli.Fields.Item("codice").Value) = vbNullString Then indice = n
    If Not RCS_Articoli.EOF Then RCS_Articoli.MoveNext
Loop
'Posiziono la selezione su un record vuoto, se c'è.
Lista_Articoli.ListIndex = indice - 1
End Sub

 fare quelle operazioni con una semplice listbox. Grazie comunque.
Secondo me non ti conviene perchč per incolonnare i dati in modo decente
dovresti calcolare in anticipo la lunghezza della stringa piů lunga da
metter nel primo campo, e aggiungere alle altre un numero di spazi
sufficienti per renderel lunghe ugualiin coda.
Saresti obbligato ad usare font a spaziatura fissa (famiglia dei
"Courier"), che puň piacere o meno...


 "Courier"), che puň piacere o meno...
Whooops...Scusate...Non avevo visto le altre post!!


 Saresti obbligato ad usare font a spaziatura fissa (famiglia dei
"Courier"), che può piacere o meno...
Beh, non proprio.
Più sopra ci sono un paio di post con la soluzione per incolonnare con
qualunque font.
Ciao
Alberto

 qualunque font.
Mi spiace, non avevo visto i post precedenti e non pensavo fosse
semplice usare font a spaziatura variabile...
Ciao.
