Newsgroup: it.comp.lang.visual-basic
Titolo: Uso .ItemData

Ciao a tutti, in una combobox aggiungo degli elementi (elenco stampanti) e
con la .ItemData definisco un nuovo indice, su una variabile ho un numero
che č l'ID della stampante predefinita per quella stampa.
Come faccio a selezionare la combo predefinita usando la itemdata?
Ci vorrebbe qualcosa .ListIndex = .ItemData(prn)
Mentre cosě mi pare prenda l'indice senza considerare l'item data
prn=5'ID mia stampante predefinita
.ListIndex = prn
'Questo č il codice con cui carico la combo
With cmbPrinter'mia combo
  .Clear
 
  Rs.Source = "SELECT * FROM FPRINTER ORDER BY IDPRINTER"
  Rs.Open
  Do Until Rs.EOF
    .AddItem NoNull(Rs("DESCPRINTER"))
    .ItemData(.NewIndex) = Rs("IDPRINTER")
    Rs.MoveNext
  Loop
  Rs.Close
End With
Grazie a tutti.
-- 
DBMS Firebird
VB6 + Ado

 Ci vorrebbe qualcosa .ListIndex = .ItemData(prn)
Per ora ho fatto cosě tanto saranno max 10 elementi, ma c'č qualcosa di
meglio?
prn=5
with combo
  For i = 0 To .ListCount - 1
    If .ItemData(i) = prn Then
      .ListIndex = i
      Exit For
    End If
  Next i
end with
Grazie


 Ci vorrebbe qualcosa .ListIndex = .ItemData(prn)
Ci vorrebbe ma non c'è :-)
Devi verificare con un ciclo tutti gli ItemData della combobox per capire
che indice ha l'elemento che ti interessa, e selezionarlo tramite tale
indice.
Se ho capito che cosa volevi fare... :-)
-- 
Salutoni
Sergio
Da vicino nessuno è normale
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Se ho capito che cosa volevi fare... :-)
Si allora ho fatto giusto (vedi la mia auto risposta) :D
Tnx


 meglio?
[cut]
Si.
Primo non usare l'exit for ma una variabile booleana sul ciclo.
Secondo, modificare quel codice in una funzione che restituisce l'index 
dell'elemento invece di impostarlo.

 Primo non usare l'exit for ma una variabile booleana sul ciclo.
scusa ma cosa t'ha fatto l'exit for? e' cosě antipatico?
non dovrebbe anzi comportare un minor tempo nella ricerca?

 non dovrebbe anzi comportare un minor tempo nella ricerca?
Che e' un rattoppo. Un ciclo For-Next serve a fare N iterazioni. E' nato per 
quello. Serve a quello. Quando si trova un ciclo for-next in un codice, 
nessuno dovrebbe preoccuparsi dell'eventualita' di una condizione per cui 
possa uscire prima delle N iterazioni.
E sai perche'? Perche' nello stesso linguaggio c'e' UN SOLO iteratore 
For-Next, ma ce ne sono diversi per gestire il caso dei loop con variabili 
d'uscita. Oltretutto rigirabili e mescolabili come ti pare con il controllo 
di condizione in cima ed in fondo.
Altrimenti domani mi trovo a prendere in mano il codice di qualcuno che ha 
deciso che, siccome il linguaggio lo permette, invece di fare sottrazioni fa 
addizioni con l'addendo negato, che e' piu' performante (o era al contrario, 
non ricordo).
Questo, primo.
Secondo, perche' quel ciclo is running wild.
Cosa succede se gli chiedo di restituirmi l'index di un item data che non 
c'e'? Semplice, che esce senza dirmi niente. Con un ciclo pensato invece in 
quell'ottica, quando esce ho una variabile booleana che mi indica che non ha 
trovato nulla.
E no, non basta uscire e testare il listindex. Perche' per testare il 
listindex bisognerebbe segnarselo prima del ciclo, poi verificare se 
all'uscita del ciclo e' sempre lo stesso, e poi sperare che per combinazione 
il combo non fosse gia' sull'elemento richiesto.

 l'index dell'elemento invece di impostarlo.
Cosa intendi?

 Cosa intendi?
Che quella parte di codice che hai scritto e' pensata male.
1) Scrivi qualcosa che ti dice il listindex di un itemdata
2) Usa il risultato per impostare il listindex del combo.
Cosi', quando ti servira' la (1), non dovrai riscrivere altro codice.

 c'e'? Semplice, che esce senza dirmi niente.
In questo ti sbagli. Se metto un exit for e' proprio perche'
c'e' l'elemento cercato;
per il resto e' ovvio che ci vuole un booleano se so che
l'elemento cercato possa essere inesistente
Son d'accordo che il cicli vanno ponderati bene prima di farne
uso, ma non e' proprio questo il caso!

 
ovviamente mi riferivo solo al discorso EXIT FOR,
per il resto la procedura andrebbe un po' ritoccata.....

 Cosi', quando ti servira' la (1), non dovrai riscrivere altro codice.
Concordo pienamente nel creare codice che si può riutilizzare... ma alla 
fine non hai indicato un metodo che migliori in prestazioni il ciclo for
Gian

 fine non hai indicato un metodo che migliori in prestazioni il ciclo for
Ehm...
Anche lui utilizzerebbe il ciclo for, solo in modo leggermente diverso,
senza exit for e con una variabile booleana che indichi se l'item data č
stato trovato o meno.
Io personalmente utilizzerei tutte e due le cose, trovo inutile sprecare
del tempo solo per non usare un exit for.
-- 
Salutoni
Sergio
Da vicino nessuno č normale


 del tempo solo per non usare un exit for.
No, io non userei un ciclo for, visto che il ciclo for non e' progettato per 
avere un punto di uscita ma esiste proprio per fare un numero preciso di 
iterazioni.
Userei un banale ciclo while o until, che servono esattamente a quello.
Anzi, posso fare una domanda un po' provocatoria?
Quanta gente usa realmente i cicli come vanno usati?
Perche' nella mia carriera di programmatore ho incontrato una marea di gente 
e visto un sacco di codice che usa il for next+exit for nel 99% dei casi 
perche'...la gente non capisce l'uso dei cicli condizionali!!!

 Quanta gente usa realmente i cicli come vanno usati?
Tanta quanta utilizza il go to quando serve, i suppose.
-- 
Salutoni
Sergio
Da vicino nessuno è normale


 condizionali!!!
In molti casi sarà anche quello il motivo, ma ti garantisco che, per quanto mi
riguarda, l'ossessiva ricerca della "purezza" del codice evitando i goto o gli
exit for a volte diventa controproducente.
Ad esempio, in un banale ciclo di verifica della presenza di un elemento in una
collection l'utilizzo... "integralista" di un do..while per evitare un exit for
non migliora né le prestazioni, né la leggibilità né la manutenibilità.
i = 1
Found = False
Do While (i <= Collection.Count) And Not Found
    If Collection.Item(i).Value = Find Then
        Found = True
    Else
        i = i + i
    End If
Loop
For Each Item in Collection
    If Item.Value = Find Then
        Exit For
    End If
Next
Quasi la metà delle righe di codice e una sola variabile necessaria.
My 2 cents
Raf

 non migliora né le prestazioni, né la leggibilità né la manutenibilità.
Va anche considerato il fatto che il for se lo smazza la VM, mentre per i 
vari while l'incremento e il confronto viene compilato nell'exe e risulta 
più lento.
Per le collezioni io preferisco il ForEach con Exit For annesso :) che 
aumenta ancora la leggibilità ed evita un bel po' di reindirizzamenti dovuti 
ai "." tra oggetti e proprietà.
Per quanto riguarda i goto, i casi in cui li ho trovati necessari in 12 anni 
di programmazione si possono contare sulle dita di una mano monca ;)
Ciao


sono pienamente d'accordo con Fabio, quindi evito di
ripetermi!
ciao for all