|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 377
|
[VB6] Ordinare Listbox
Allora, premetto che ho letto una cifra di pagine per cercare la soluzione a questo problema, ma vi giuro che non riesco a venirne a capo!
In un programma che sto facendo mi servirebbe avere una specie di classifica che aggiorno manualmente. In pratica io ho un file .txt con inseriti dei numeri (verticalmente) e vorrei metterli in ordine decrescente in una listbox. Il problema è che (a parte il fatto di metterli in ordine decrescente invece che crescente) il programma non ordina proprio numericamente, ma bensì in base al primo numero, per esempio se ho 1 2 12 l'ordine sarà 1 12 2 So che esiste la proprietà sorted ma non funziona come vorrei..Qualcuno riesce ad aiutarmi? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2007
Città: Bordighera (IM)
Messaggi: 1047
|
ciao, scusa ma non capisco come faccia a ordinarli in quel modo
il funzionamento è lo stesso di quando ordini dei semplici numeri in un vettore... quindi ti basta cercare degli esempi di alcuni metodi di ordinazione (come quick sort, bouble sort, selezione, inserzione, ecc.) il problema che ti da è da ricercare nel codice che hai scritto... quindi prova a postarlo e vediamo
__________________
.:Programmatore web e Windows, WebDesigner - Portfolio:. TRATTATIVE CONCLUSE: 10 TUTTE POSITIVE! Case Corsair 240 *** CPU AMD 1700 *** MotherBoard Asus PRIME B350M *** VGA Nvidia Zotac GTX1060 6gb *** RAM Corsair 16gb DDR4 *** PSU Corsair CX650M *** SSD Samsung 850 evo 500gb *** HardDisk 1tb |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 377
|
Sinceramente ce l'ho fatta
Ecco il codice.. 'Leggo dal file .txt dove salvo i numeri Dim file As Integer Dim line As String file = FreeFile() On Error Resume Next Open App.Path & "\Save_Fish.txt" For Input As #file If Err Then Exit Sub Do While Not EOF(file) Line Input #file, line List1.AddItem line Loop Close #file 'li ordino in modo crescente For i = 0 To List1.ListCount - 1 List1.List(i) = Format$(Val(List1.List(i))) & Mid$(List1.List(i), InStr(List1.List(i), " ")) Next i Quest'ultimo codice l'ho trovato, non l'ho scritto io... Il problema adesso è metterli in modo decrescente, appunto perchè è una classifica (chi ha più soldi va messo in prima posizione tanto per capirci).. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2007
Città: Bordighera (IM)
Messaggi: 1047
|
__________________
.:Programmatore web e Windows, WebDesigner - Portfolio:. TRATTATIVE CONCLUSE: 10 TUTTE POSITIVE! Case Corsair 240 *** CPU AMD 1700 *** MotherBoard Asus PRIME B350M *** VGA Nvidia Zotac GTX1060 6gb *** RAM Corsair 16gb DDR4 *** PSU Corsair CX650M *** SSD Samsung 850 evo 500gb *** HardDisk 1tb |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
List1.List(i) = Format$(Val(List1.List(i))) & Mid$(List1.List(i), InStr(List1.List(i), " ")) Next i che significa questo sopra... li ordino in modo crescente non mi pare un ordinamento. una volta superato Close #file li ordini in modo crescente con un bubble sort e sei a posto ricordandoti di lasciare la proprietà sort della listbox = false |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 377
|
Hai ragione, ho preso un abbaglio e il codice che mi hai fatto notare è inutile.. Ho fatto una prova con dei numeri che erano ordinati da soli.. Il problema è sempre lo stesso.. i numeri non li ordina in modo crescente, ma in base alla prima cifra..
se i numeri sono 1 12 26 3 l'ordine sarà appunto 1 12 26 3 e non 1 3 12 26 !! Cosa intendi per "bubble sort", dovete scusarmi ma conosco solo le basi del vb6..
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
ma metti la proprietà sort della list = false intanto aspè... |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 377
|
Già fatto
Te ne sarei grato! |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Codice HTML:
Dim file As Integer Dim line As String Dim numeri(1000), nTemp(1000), c,cc, b As Integer dim stringa(1000), nStringaTemp(1000) As String file = FreeFile() On Error Resume Next Open App.path & "\Save_Fish.txt" For Input As #file If Err Then Exit Sub c = 0 Do While Not EOF(file) Line Input #file, line List1.AddItem line numero(c)= mettici il numero stringa(c)=mettici la stringa ma devi farlo tu io non so come è fatta la linea letta c = c + 1 'contatore indice Loop Close #file stop 'controlla la list creata For t = 0 To c - 1 nTemp(t) = numeri(t) 'passa i numeri in una matrice temporanea nStringaTemp(t)=stringa(c) Next t 'studiati questo sotto togliendo i commenti agli stop For q = 0 To c - 1 b = nTemp(q) str = nStringaTemp(q) 'stop For s = q To c - 1 If nTemp(s) >= b Then b = nTemp(s): cc = s: str=nStringaTemp(s) 'ordinamento crescente 'If nTemp(s) < b Then b = nTemp(s): cc = s 'ordinamento decrescente Next s nTemp(cc) = nTemp(q) nTemp(q) = b nStringaTemp(c) = nStringaTemp(q) nStringaTemp(q) = str 'stop Next q List1.Clear For i = 0 To c - 1 List1.AddItem (nTemp(i) + " " + nStringaTemp(i)) Next i stop 'controlla se tutto è okay Ultima modifica di okay : 25-03-2008 alle 19:24. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 377
|
Innanzitutto grazie mille!!
Allora..ci sono due problemi.. il primo è che nel mio file .txt ho salvati prima i numeri (che sarebbero i soldi) e sulla stessa riga la persona che li possiede e dal tuo programma resta solo il numero.. non so se sia dovuto magari a questo: "numeri(c) = Val(line) 'tramuta da stringa a numero" Seconda cosa, ho provato comunque il codice ma mi vengono fuori numeri che non ci sono.. Comunque se avessi di parte i nomi riuscirei a capire meglio a chi dovrebbero appartenere i numeri e quindi capire il problema.. Grazie ancora di tutto! |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
con questa riga presumo che prendi numeri ma anche se fossero stringhe con la funzione val ci dovrebbero essere solo numeri controlla... |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 377
|
Appunto, il problema è che a me serve vedere sia il numero che la stringa..
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
che ne sò è così? 13 okay 1 ok 9 k ecc ecc tu vuoi ordinare i numeri così: 13 okay 9 k 1 ok giusto...? se è così ti ho corretto il listato sopra In pratica come puoi vedere dalla routine di ordinamento non fai altro che ordinare il numero maggiore e ti porti appresso la stringa a cui fà parte ora però devi mettere il numero e la stringa nell'indice in quanto non sò come è fatta line Ultima modifica di okay : 25-03-2008 alle 19:26. |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 377
|
Esattamente! Fai conto che nel file .txt ci siano queste righe:
520 Luca 450 Marco 210 Andrea 101 Manuel Per dirla tutta è una classifica di una mano di poker, Fish & Nome del giocatore.. Grazie ancora! |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
ti ho corretto il listato guarda queste righe: List1.AddItem line numero(c)= mettici il numero stringa(c)=mettici la stringa ma devi farlo tu io non so come è fatta la linea letta devi prendere line la tagli, lo fai tu e metti dentro numero(c)= il numero estratto con val mentre in stringa(c) metti il nome l'ho provato e funziona benissimo ora però devi riempire numero(c) con il numero e stringa(c) con il nome vedrai che è okay... Edit: Ancora un aiuto con la funzione split potresti tagliare bene Dim tmp() As String tmp = Split(line, " ") ecc ecc... ciao Ultima modifica di okay : 25-03-2008 alle 19:59. |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 377
|
Devi perdonarmi ma ho un po' di confusione..
numero(c)= mettici il numero stringa(c)=mettici la stringa ma devi farlo tu io non so come è fatta la linea letta In che senso mettici il numero e sotto la stringa? Missà che non mi sono spiegato molto bene.. Ricapitolo un secondo e poi vediamo dove sto sbagliando se hai un attimo di pazienza Allora: Finisce una mano di poker e quando clicco su un command "CARTE NUOVE" il programma prende i nomi delle persone (txtgiocatore1.text, txtgiocatore2.text, ecc fino alla txtgiocatore9.text) e le fish che hanno in quel momento (txtfish1.text, txtfish2.text, ecc fino alla txtfish9.text) e le salva in un file "Save_Fish.txt" in questa maniera: 450 Marco che sarebbe nel programma (txtfish1.text) & (txtgiocatore1.txt) 520 Luca (txtfish2.text) & (txtgiocatore2.txt) 101 Manuel (txtfish3.text) & (txtgiocatore3.txt) 210 Andrea (txtfish4.text) & (txtgiocatore4.txt) Fatto questo il programma mi cancella la lista precedente per aggiornarla e carica il file Save_Fish nella Listbox. In conclusione non capisco cosa dovrei mettere dove tu dici che andrebbe il numero e dopo la stringa.. è quello che non capisco.. Grazie ancora per la pazienza e l'aiuto!
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
se line vale "450 Marco" fai numero(c)="450" e stringa(c)="Marco" poi nel loop leggi la prossima line che sarebbe line vale "520 Luca" numero(c)="520" stringa(c)="Luca" e così via in pratica leggi line che è stringa "450 Marco" la splitti ovvero la tagli in 2 e fai numero(c)=val(mid(line1,3)) che corrisponde al numero 450 stringa(c)=line(mid(5,9)) che corrisponde alla stringa Marco poi c si incrementa di 1 c=c+1 la prossima line vale "520 Luca" quindi numero(c)=val(mid(line1,3)) che corrisponde al numero 520 stringa(c)=line(mid(5,9)) che corrisponde alla stringa Luca ma fallo tu almeno questo non mi sembra difficile... devi fare questo alle 2 righe che ti ho scritto nel listato ovvero: ---------- numero(c)= mettici il numero 520 stringa(c)=mettici la stringa Luca ecc. ecc. ---------- okay? vedrai che se fai questo l'algoritmo di ordinamento funziona a meraviglia e vorrei che lo studiassi mettendo le linee stop per vedere proprio come funziona e che hai capito sennò questo 3d non avrebbe senso ciao a domani Ultima modifica di okay : 26-03-2008 alle 03:07. |
|
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Feb 2006
Città: Mi sono perso nello spazio...
Messaggi: 119
|
@ Okay
Complimenti
__________________
Il miglior dialogo è l'intesa |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Feb 2008
Messaggi: 377
|
Quote:
Ok grazie mille. Ci sto provando ma sono un po' incespicato.. Allora fare come dici te mi sembra strano, perchè ogni volta i numeri cambiano, e dal tuo codice setti la lunghezza del numero, che però può variare e diventare magari 15000, venendo fuori un casino!.. Perchè non sono andato a fare informatica?!?! |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
metti lo spazio " " trovi il numero e poi il secondo termine è il nome. oppure puoi leggere carattere per carattere e come trovi lo spazio hai il numero e poi leggi carattere per carattere il rimanente nome: esempio: line = "15000 Mario" dim app as string dim controllo as bolean controllo=false app="":for i=0 to len(line) if mid(line,i,1)<>" " then app=app+mid(line,i,1) else if controllo=false then numero(c)=val(app) controllo=true app="" else numero(c)=val(app) controllo=true app="" endif stringa(c)=app app="" endif next i ecco usa questa routine sopra ti ho correto il listato con questa prova un pò se và listato Codice HTML:
Dim file As Integer Dim line As String Dim numeri(1000), nTemp(1000), c, cc, b As Integer Dim stringa(1000), nStringaTemp(1000), str As String Dim appp As String Dim controllo As Boolean file = FreeFile() On Error Resume Next Open app.path & "\Save_Fish.txt" For Input As #file If Err Then Exit Sub c = 0 Do While Not EOF(file) Line Input #file, line List1.AddItem line appp = "": For i = 1 To Len(line) If Mid(line, i, 1) <> " " Then appp = appp + Mid(line, i, 1) Else If controllo = False Then numeri(c) = Val(appp) controllo = True appp = "" Else stringa(c) = Trim(appp) controllo = False appp = "" End If End If Next i If controllo = True Then stringa(c) = Trim(appp) c = c + 1 'contatore indice Loop Close #file Stop 'controlla la list creata For t = 0 To c - 1 nTemp(t) = numeri(t) 'passa i numeri in una matrice temporanea nStringaTemp(t) = stringa(c) Next t 'studiati questo sotto togliendo i commenti agli stop For q = 0 To c - 1 b = nTemp(q) str = nStringaTemp(q) 'stop For s = q To c - 1 If nTemp(s) >= b Then b = nTemp(s): cc = s: str = nStringaTemp(s) 'ordinamento crescente 'If nTemp(s) < b Then b = nTemp(s): cc = s 'ordinamento decrescente Next s nTemp(cc) = nTemp(q) nTemp(q) = b nStringaTemp(c) = nStringaTemp(q) nStringaTemp(q) = str 'stop Next q List1.Clear For i = 0 To c - 1 List1.AddItem (nTemp(i) + " " + nStringaTemp(i)) Next i Stop 'controlla se tutto è okay incolla e vai... Ultima modifica di okay : 26-03-2008 alle 13:34. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:28.



















