Newsgroup: it.comp.lang.visual-basic
Titolo: aggingi-Rimuovi da collection

Ciao a tutti...
vorrei qualche aiuto su questo problema.
ho una PictureBox su un form, dove vado a generare in automatico una serie
di label, in base alle richieste dell'utente: in queste label, appaiono
diversi messaggi.
dim Labeltext as label
......
set LabelText = form1.collections.add ("VB.Label", NomeLabel,
form1.pictureBox1)
......
....
...
il codi ce funziona in quanto tute le label appaiono sullo schermo come se
fossero inserite nella picturebox...
ma se io voglio rivisualizzarle perche sono stati cambiati dei parametri e
quindi devo ricaricarle con le nuove impostazioni mi da errore "la label "
xxxx esiste gia su form1.
come posso fare per scaricare dal form le label della collecction e
ricaricarle come se non le avessi mai create prima?
ho provato a fare un remove dalla collection, ma non mi acceta il comanddo e
mi da sempre lo stesso errore.
Grazie mille
Emanuele

 mi da sempre lo stesso errore.
Dovresti postare il codice incriminato, perche' il Remove funziona
normalmente.
Questo codice ad esempio si comporta come dovrebbe:
Dim LabelText As Label
'Aggiunge, rimuove e riaggiunge con lo stesso nome
Set LabelText = Form1.Controls.Add("VB.Label", "Test123", Picture1)
Form1.Controls.Remove "Test123"
Set LabelText = Form1.Controls.Add("VB.Label", "Test123", Picture1)
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Ciao
il codice e' il seguente.........(ovviamente abbreviato delle parti poco
interessanti)
option Explicit
Dim TextLabel as label
___________________________
sub createPage( ArrayElem as variant)
' array elem e' un vettore che contiene tre elementi
' 1 -2 coordinate X e Y della posizione di dove visualizzare il testo sulla
picture)
' 3 testo da visualizzare
'   richiamo alla funzione di settaggio della picture
' posizionamento in X e Y della prima label   - le altre satranno
posizionate di conseguenza in base alle mie scelte
' all'interno del ciclo di lettura dell'array
for ind = 1 TO uBound(arrayElem)
    if clong (arrayElem(ind,1)) > 0 then
      Xpos = Xpos + arrayElem(ind,1)
   end if
   if CLng(arrayElem (ind, 2)) > 0 then
     Ypos = Ypos + arrayElem(ind, 2)
   end if
' progressivo delle label
NomeLab = "lab" & ind
'qui genero il nuovo controllo label per contenere i dati che voglio
inserire
set TextLabel = Form1.Controls.Add("vb.Label", NomeLab, Form1)
' assegno il nuovo controllo alla picture
set TextLabel.Container = form1.picture1
' qui ho altre istruzioni di configurazione e personalizzazione della
textbox - font ,colore, size, etc etc...
next ind
end sub
sub ClearAllControl
' questa subroutine serve per rimuovere le label create, e consentire la
rivisulaizzazione della picture da zero(0)
on error resume next
for each TextLabel in  Form1
 form1.Controls.Remove
next
end sub
Quest'ultima parte l'ho scritta per provare, e sicuramente non e' corretta.
Penso che l'errore sia nel dare un nome "NomeLab & ind"  alle label, e non
creando un vettore vero e proprio...
Se non cerco di rivisualizare il form contenente la picture, ma lo chiudo e
poi riapro non da errore, ma se lo lascio aperto e cerco di ricrearlo mi da'
l'errore che ho scritto prima.
Ti ringrazio per l'aiuto
Emanuele

 creando un vettore vero e proprio...
A occhio credo invece che gli errori siano altri :
1) errore tipico nei cicli for associati alla cancellazione: perche' non si
"accavallino" devi procedere a ritroso
2) per iterare sugli elementi dell'insieme Controls, devi usare una
variabile di tipo Control; usare una variabile di tipo Label *non* filtra
soltanto le label, ma scorre comunque tutti gli oggetti (come per tutti gli
insiemi) e genera un errore di type mismatch al primo controllo di classe
differente che incontra.
Devi quindi verificare ad ogni iterazione se il controllo e' quello che ti
interessa.
3) il Remove ha comunque bisogno di un parametro, che sia l'indice o la
chiave (= il nome) del controllo da rimuovere... questo errore per inciso lo
notavi subito se evitavi di usare 'On Error ' indiscriminatamente
In sostanza il tutto dovrebbe ridursi a
Sub ClearAllControl
Dim i As Long
Dim c As Control
For i = Me.Controls.Count To 1 Step -1
    'non chiedermi perche', ma questa collection e' in base 0
    'non in base 1 come tutte le altre...
    Set c = Me.Controls(i - 1)
    If TypeOf c Is Label Then
        If 
c.Container.Name
 = Picture1.Name Then
            Me.Controls.Remove c.Name
        End If
    End If
Next
End Sub


 ha scritto nel messaggio
news:bmeh25$kmr2k$1...@ID-138791.news.uni-berlin.de...

Ti chiedo ancora una cosa e poi non  ti disturbo piu'..
E' corretto dichiarare la label come ho fatto?
cioe', nel mio modo, ad ogni ciclo del costrutto for, setto una nuova label
con l'istruzione set...
non sarebbe piu' giusto (e' solo un mio dubbio ovviamente) fare questa
dichiarazione una sola volta e poi usare le istruzioni
LOAD TextLabel(indice)
incrementando l'indice tute le volte? cosi avrei un vetore di Label
scusami se ho detto una c******a
l'uso di alcune tecniche mi e' un po ostico (con gli oggetti vado di notte)
e devo capire
Sei stato comunque molto gentile ..
Ciao e grazie

 scusami se ho detto una c******a
No, hai detto bene, solo che le due cose non sono del tutto equivalenti,
quindi non e' "piu' giusto" uno o l'altro.
L'approccio che hai usato tu e', se vogliamo, quello "moderno" (e' stato
introdotto in VB6 ed e' l'unico possibile in 
VB.NET
) ovvero quello che crea
oggetti completamente da zero, basandosi soltanto sulla stringa contenente
la classe, oggetti che tra loro possono anche essere scollegati.
L'altro sistema presuppone invece che tu definisca gia' in design un
controllo "master" per ogni classe di controllo che vuoi utilizzare e che
gli assegni un indice, definendo quindi una matrice di controlli da un solo
elemento; a runtime puoi quindi incrementare questa matrice con l'istruzione
LOAD() come hai gia' notato.
Ripeto, sono due cose leggermente diverse, ognuna con i suoi vantaggi e
svantaggi, ma entrambe corrette; scegliere una o l'altra dipende unicamente
da quello che vuoi ottenere.


 ha scritto nel messaggio
news:bmei0m$kl07s$1...@ID-138791.news.uni-berlin.de...

Ti ringrazio molto...
(data l'eta' sono un po rincoglionito e a volte faccio fatica a memorizzare
nuove tecniche....aaaaaaaahhhhh..se fossi giovane)
:-)
ciao