Newsgroup: it.comp.lang.visual-basic
Titolo: CICLI E LISTBOX

Salve a tutti, vorrei porre la vostra attenzione su un problema che mi sta
dando numerosi grattacapi:
provate a scrivere il seguente codice in un form che contenga un pulsante di
comando e un controllo ListBox:
Command1_Click
Dim N, n1, n2, n3 As Currency
Dim NC
N = 90
For n1 = 1 To N - 2
    For n2 = n1 + 1 To N - 1
        For n3 = n2 + 1 To N
        NC = n1 & "-" & n2 & "-" & n3
        List1.AddItem NC
        Next
    Next
Next
e...vedete un pò cosa succede.
Vi prego datemi una mano, grazie.

...


...


e...vedete un pò cosa succede.
Ti riferisci all'errore 5 'Chiamata di routine o argomento no valido'?
Non so perchè non dia un più chiaro OverFlow, ma è corretto: hai dato
un'occhiata a List1.ListCount?
Di più un listbox non ne può tenere (bella fregatura vero?)...
Anche se mi sembra strano questo limite in Win32...che abbia una versione
bacata? strano, di solito la M$ fa dei gioiellini...
Ti faccio comunque presente che nel tuo codice solo la var. n3 è Currency, e
non anche N, n1 e n2, come può erroneamente sembrare.
Queste invatti vengono instanziate come variant in mancanza della
dichiarazione di tipo prima della virgola!
Lo stesso vale per NC, che poi viene anch'essa utilizzata come numerica.
VB non è come Delphi o C che utilizzano dichiarazioni cumulative (fino al
';')
Ciao


Non è vero: i software della Microsoft contengono svariati bug
buon anno


Succede che, poverina... la ListBox non ce la fa a tenere tutta quella roba
(117480 righe)!
Note aggiuntive:
nella dichiarazione delle variabili, stai dichiarando tutte (tranne n3 che
e' Currency) le variabili come tipo Variant (che occupa 16 bytes)... non e'
certo una bella cosa!
Dim N, n1, n2, n3 As Currency
Dim NC
DICHIARA SEMPRE I TIPI CORRETTI (serve per evitare sprechi di risorse e per
rendere piu' leggibile il codice):
Dim N As Byte, n1 As Byte, n2 As Byte, n3 As Byte
Dim NC As String
Inoltre NC puoi anche evitare di usarlo, basta fare
        List1.AddItem n1 & "-" & n2 & "-" & n3
--
Roal Zanazzi
z...@iol.it

Visto che il controllo ListBox non riesce a contenere più di tot elementi,
nel caso che ho la necessità di visualizzare più elementi di quanto ne possa
contenere un ListBox (elementi scaturiti da cicli For), come posso dividere
questi ultimi in più controlli ListBox?
Grazie in anticipo.

...


questi ultimi in più controlli ListBox?
Io farei un array di listbox.
Poi inserisci i primi 60.000 (per esempio) nel primo, quelli da 60.001 a
120.000 nel secondo e cosi' via...
Ciao!

questi ultimi in più controlli ListBox?
Io scriverei tutti i dati in un file/database ASCII, e quindi scriverei un
controllo, il piu' simile possibile alla listbox, che accede a questo file
dinamicamente.
Si ottengono cosi' ottime performance e un volume di record limitato solo
allo spazio su HD.
Ciao
By -MES-   Maronese Ettore
http://ilmes.freeweb.org
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://members.xoom.com/it_lang_vb


In teoria dovrebbe poter contenere 32766 ma sul mio PC ne conteniene solo
32736.
Qualcuno sa il perchč?
Grazie Bruno

Qualcuno sa il perchč?
Ma usi VB3 o VB a 32 bit?



VB5 + sp3 su Win98
Ciao Bruno

...


Qualcosa non mi quaglia!
Mi ricordo che se si usa una ListBox a 32 bit usando la
SendMessage/PostMessage e' possibile (con messaggi estesi dal 32 bit)
aumentare la cifra degli elementi fino a $7FFFFFFF.   :-?
O mi ricordo male io o VB non usa a pieno la ListBox!


O mi ricordo male io o VB non usa a pieno la ListBox!
Entrambe, nel senso che sul win32SKD c'è scritto in più risprese (es:
LB_GETITEMDATA) che il numero massimo di elementi non può essere superiore a
32767, d'altro canto io riesco a inserirne solo 32736.
Per curiosito ho provato anche a creare la listbox da zero ma il risultato è
sempre stato lo stesso, mancano 30 elementi.
Se qualcuno vuole provare questo è il codice, le dichiarazioni possono
essere prese direttamente dall'ApiViewer ad eccezione di
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA"
(ByVal dwExStyle As Long, ByVal lpClassName As Long, ByVal lpWindowName As
Long, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth
As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As
Long, ByVal hInstance As Long, ByVal lpParam As Long) As Long
Private Declare Function SendMessageString Lib "user32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam
As String) As Long
    Dim hParent As Long, l As Long
    Dim Testo As String * 10
    Dim oldScaleMode As Long
    oldScaleMode = Form1.ScaleMode
    With Me
        .ScaleMode = vbPixels
        hParent = .hwnd
        ListHwnd = CreateWindowEx(&H0, _
            StrPtr(StrConv("LISTBOX", vbFromUnicode)), _
            &H0, _
            WS_CHILD Or WS_VISIBLE Or WS_VSCROLL Or WS_BORDER, _
            10, 10, 200, 200, _
            hParent, _
            &H0, _
            GetWindowLong(hParent, GWL_HINSTANCE), _
            &H0)
        If ListHwnd = 0 Then MsgBox "Errore nella creazione"
        For l = 0 To 33000
            Testo = CStr(l)
            SendMessageString ListHwnd, LB_ADDSTRING, &H0, Testo
        Next l
        .ScaleMode = oldScaleMode
    End With
Ciao Bruno

32767, d'altro canto io riesco a inserirne solo 32736.
Opss...
Sono andato a rinfrescarmi le idee sull'msdn.
Hai ragione tu, piu' si 32767 non va. Essendo in Inglese, ed avendolo letto
di corsa, quando lo lessi (tempo fa') acpii male, e' la memoria occupata dai
singoli item che non ha limite, non il numero di items.
Per qunto riguarda i 30 items mancanti... No so cosa dirti :-(
Saluti
Ciao
By -MES-   Maronese Ettore
http://ilmes.freeweb.org
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb