Newsgroup: it.comp.lang.visual-basic
Titolo: Array di controlli e controllo scaricato

Forse sono rimba, ma mi sto inchiodando su questo passaggio:
Array di controlli (ad esempio Label1())
Aggiungo n item (ad esempio 5)
Scarico un controllo dell'array (ad esempio il 3), con Unload Label1(3)
Successivamente, devo fare un for next sull'array, ma voglio saltare il
controllo scaricato.
Se faccio if Label1(n) is nothing non funziona perchè non è mai nothing.
Prima di creare una function con un On Error dentro, che testi una qualche
proprietà del controllo e veda se avviene un errore, vorrei cercare qualcosa
di più bello.
Anzichè If Is Nothing, cosa potrei usare?
Ciao
Alberto

 Scarico un controllo dell'array (ad esempio il 3), con Unload Label1(3)
Siamo sicuri che questo lasci l'elemento 3? e non che "tiri su" tutti i
seguenti?

 seguenti?
Altrochč...
Debug.Print Label1(3).Caption
runTime Error 340: L'elemento 3 dell'array non esiste.
Ciao
Alberto

 seguenti?
Altrochč...
Debug.Print Label1(5).Caption 'OK. L'ultimo elemento ha mantenuto il suo
indice
Debug.Print Label1(3).Caption 'Errore:


 Se faccio if Label1(n) is nothing non funziona perchè non è mai nothing.
Non è proprio la risposta che cercavi .. ma perchè non usi una collection ?
oppure perchè dopo ogni Unload non compatti l'array ?
Saluti

 oppure perchè dopo ogni Unload non compatti l'array ?
Perchè l'indice è concorde con altre strutture dati.
I modi sarebbero decine, se volessi:
1) Crearmi un oggetto di una classe mia, che mi esponga i metodi Add,
Remove, Exist, ecc..., e che tenga dentro di sè la collection o l'array
2) Una funzione con un On Error che mi dica se il controllo è caricato o
meno
3) Creare un array parallelo con un boolean che mi dica se l'oggetto è
caricato o meno
....
ma sarebbero tutti accrocchi per superare una cosa che credevo molto facile.
Visto che non è urgente, prima valuto se esiste qualcosa di migliore, poi
parto con uno dei ripieghi.
Ciao e grazie
Alberto

 Altrochè...
Ho detto una boiata! Non funzionerebbero più i riferimenti all'indice dei
controlli che permangono.
Non so, forse potresti creari un vettorino in memoria (come fai ora a
determinare l'indice del prossimo controllo da Load-are?) o anche una
stringa da gestirsi bytexbyte ("111011") che indica quali hai caricato e
quali hai scaricato...

 quali hai scaricato...
Come ho scritto nel post per Fox, dimenticatevi del caso specifico, perchè i
modi per gestire una tabella che mi dica se un controllo è caricato o meno
sarebbero decine, e ritengo di arrivarci...
Il mio quesito era direttamente mirato a sapere se esiste una espressione
per determinare se un controllo appartenente ad un array sia stato scaricato
o meno, visto che (Array_di_Controlli(indice) is nothing) torna sempre
false, anche se il controllo 'indice' è stato scaricato con unload.
Usando un meta-linguaggio barbaresco, sarebbe qualcosa del tipo:
If IsLoaded(Array_di_Controlli(indice)) then ........
Ciao
Alberto

 Successivamente, devo fare un for next sull'array, ma voglio saltare il
controllo scaricato.
    For Each l In Label1
        ... qui vedi solo i controlli presenti ...
    Next l

 Se faccio if Label1(n) is nothing non funziona perchè non è mai nothing.
cambiare e appesantire il ciclo for next con questo ?
Dim myEtichetta As Control
  For Each myEtichetta In Me.Controls
   If left(myEtichetta.Name,4) Then ' oppure .type
    'fa qualcosa
...

"Fox Mulder" <fili...@NOSPAMtiscali.it> wrote in message
news:ampsm3$f88$1...@fe1.cs.interbusiness.it...

Trovato
MA  SONO SICURO CHE ANCHE QUESTA SOLUZIONE NON TI ANDRA' BENE !
Scarichi il controllo con indice i
Unload Label1(i)
imposti Matrice(i) = Nothing
per cui Matrice(i) is Nothing = True
Saluti

 per cui Matrice(i) is Nothing = True
Hai provato?

 news:Ckdk9.8194$Eu.1...@twister1.libero.it...

Eccoti il codice .. magari prima di postare fai qualche prova tu !
Private Sub Form_Load()
    Dim x() As Label
    Dim a As Integer
    ReDim x(0)
    Set x(0) = L(0)
    For a = 1 To 5
        Load L(a)
        ReDim Preserve x(a)
        Set x(a) = L(a)
    Next a
    a = 2
    Unload L(a)
    Set x(a) = Nothing
    For a = 0 To UBound(x)
        If x(a) Is Nothing Then  Debug.Print "Nullo"   Else     Debug.Print
a
    Next a
End Sub
Risultato :
 0
 1
Nullo
 3
 4
 5



Certo ... perchč non funziona ?
ho provato solo dalla finestra di debug ... penso non ci siano differenze.





Allora proprio non capisco una mazza io !
Avevo capito che Albe aveva creato un array di controlli ... cioè una cosa
del genere Dim X() as Label
non avevo associato ai controlli indicizzati ... pensandoci bene a che
cacchio sarebbe servito creare una matrice parallela ?
Perdono
Comunque credo che sia impossibile ... è un po' come l'erase degli array
dinamici.
Sicuramente la migliore è la soluzione di Lupo con il "for each next"
Saluti .. io ci rinuncio !

 Perdono
Ma di che?

     Next l
Questo e' senz'altro il modo piu' veloce (peraltro e' ancora piu' veloce
che ciclare sull'indice!).
Aggiungo (per quanto possa sembrar banale) che all'interno di tale ciclo
(For Each) si puo' comunque conoscere l'indice del controllo tramite la
sua proprieta' Index!
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt