Newsgroup: it.comp.lang.visual-basic
Titolo: collection

ciao a tutti,
ho un problema con le collection.
vorrei usare una collection per individuare quando in una applicazione
MDIForm, tuttii form appartenenti ad una determinata categoria vengono
chiusi, per poter modificare il menu relativo.
Es...
nel mio progetto, ho la possibilita di aprire piu form del tipo docuemnto e
quindi attivare (all'apertura del primo) un menu contenente le icone di
formattazione del testo.
Quando richiudo i form voglio che con la chiusura dell'ultimo form, del tipo
documento, venga chiuso anche il menu di formattazione.
Il problema e che, non riesco a identificare quando nella collection che ho
creato, viene eliminato l'ultimo "doc"
Ho fatto il seguente codice...
' nel modulo delle variabili
Public MyColl as new collection
'nel modulo delle funzioni
public function usamycoll (byval vNomeColl as collection, byval vTipo as
string, byval vAzione as string , _
 optional vKey as string) as variant
' la funzione ritorna un variant perchè puo ritornare due valori
differenti....
' se invoco ADD ritorna la key del campo assegnatole dinamicamente
' se invoco Remove deve ritornare true o false a seconda se ci son oancora o
meno altri form dello stesso gruppo..
' prima operazione: controllo se è stata passato vKey altrimetni gli do un
progressivo del tipo "Elem" & vNomeColl.Count
' Controllo il tipo di azione "ADD" o "REMOVE"
if vAction = "add" then
   vNomeColl.Add vTipo, vKey
else ' caso remove
  vNomeColl.Remove vKey
end if
' adesso vorrei controllare se nella collection esiston oancora elementi del
tipo passato
for each vElemColl in vNomeColl  ' la variabile vElemColl e dichiarata
variant nel modulo
     ' controllo ogni elemento ( il problema è qui...)
     if vNomeColl (vvElemColl) = vTipo then
        pippo = false   ' la funzione restituisce false , cioè esistono
altri elementi uguali
     else
       pippo = true  ' la funzione restituisce vero , non ci sono altri
elementi uguali
    end if
next
usamycoll = pippo
end function
' chiamata della funzione all'apertura del form
' nella sezione dichiarazioni del form
dim pluto as variant
private sub Form_load()
pluto = usamycoll (myColl, "doc","add") ' lascio la key vuota cosi assegno
un progressivo da funzione
end sub
' chiamata della funzione alla chiusura del form
dim pippo
pippo = usamycoll (myColl, "doc", remove", pluto)
end sub
Grazie
Emanuele

 Ho fatto il seguente codice...
[SNIP]
A occhio, aggiungendo i pezzetti di codice che hai omesso, mi pare possa 
andare (a parte che puoi verificare il valore solo subito dopo il Remove, 
dopo di che non hai piu' modo di farlo se non facendo un altro ciclo For)
Sarebbe tutto piu' lineare pero' se, invece di un unica funzione in un 
modulo BAS, creassi una piccola classe "simil-derivata" dalla classe 
collection standard, cosa che puoi fare aiutandoti con l'add-in di VB6 per 
per la creazione guidata delle classi; ecco un possibile esempio
'-- INIZIO CLASSE --- 
'Da inserire in un modulo di classe vuoto, chiamiamolo ad esempio
'"CustomCollection"
Option Explicit
'Collection standard, privata, che contiene i dati veri e propri.
Private mCol As Collection
Private Sub Class_Initialize()
    Set mCol = New Collection
End Sub
Private Sub Class_Terminate()
    Set mCol = Nothing
End Sub
Public Function Add(ByVal Tipo As String, _
                Optional ByVal Key As String) As String
    If Len(Key) = 0 Then Key = "Elem" & mCol.Count
    mCol.Add Tipo, Key
    Add = Key
End Function
Public Function Remove(ByVal Tipo As String, _
                ByVal IndexKey As Variant) As Boolean
    mCol.Remove IndexKey
    Remove = Not ItemExists(Tipo)
End Function
Public Function ItemExists(ByVal Tipo As String) As Boolean
    Dim ElemColl As Variant
    For Each ElemColl In mCol
        If ElemColl = Tipo Then
            ItemExists = True
            Exit Function
        End If
    Next
    'se siamo arrivati qui, non ci sono elementi del tipo passato
    ItemExists = False
End Function
'altri metodi di supporto per emulare una collection standard
Public Property Get Item(ByVal IndexKey As Variant) As String
  Item = mCol(IndexKey)
End Property
Public Property Get Count() As Long
    Count = mCol.Count
End Property
Public Property Get NewEnum() As IUnknown
    'Questa proprietà consente di enumerare l'insieme
    'corrente con la sintassi For...Each.
    Set NewEnum = mCol.[_NewEnum]
End Property
'-- FINE CLASSE --- 
a questo punto, nel modulo BAS ti serve un unica dichiarazione
'sarebbe meglio evitare la dichiarazione As New e istanziare la classe
'in fase di avvio di programma, ma questa e' un'altra faccenda...
Public MyColl As New CustomCollection
mentre nelle tue finestre e' sufficente
Private sub Form_load()
pluto = myColl.Add("doc")
end sub
Private sub Form_Unload(Cancel As Integer)
myColl.Remove("doc", pluto)
end sub
e in qualsiasi punto tu voglia fare una verifica
paperino = MyColl.ItemExists("doc")
Vedi un po' se ne ricavi qualcosa
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown 

 creato, viene eliminato l'ultimo "doc"
Ma non è più comodo se il menu di formattazione si attiva quando una
finestra che lo richiede prende il focus?
Senza tante seghe mentali.
Ciao


certo che sarebbe piů comodo, ma secondo te, come faccio a verificare se
devo mantenere attivo il meno quando chiudo la finestra?
metti per ipotesi che abbia tre finestre UGUALI (per esempio, tre form
contenenti ogniuno una richtextbox che simulano una pagina bianca).: Di
logica devo mantenere aperto il menu di formattazzione sino a quando non
chiudo l'ultima finestra....
se io gestisco il blocco della barra menu ogni volta che una form perde il
focus, devo poi sbloccare la medesima barra del menu per il form successivo
ancora aperto...e che, passo la giornata a aprire e chiudere barre di menu?
Facendo cosi invece, posso testare quando nella collection non ci sono piů
file tipo x e solo allora decido di chiuderla. A me pare semplice...
Comunque grazie a entrambi, sono poi riuscito a trovare la soluzione, pero
non usando classi, cosa che invece mi piacerebbe imparare a
fare....incomincia a piacermi programmare a oggetti....
Ciao e  ggrazie
Emanuele

 fare....incomincia a piacermi programmare a oggetti....
Allora hai scelto il linguaggio sbagliato :P
Ciao
-- 
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net