Newsgroup: it.comp.lang.visual-basic
Titolo: [ENUM] numero elementi

oltre a F2 dall'ide è possibile da codice sapere quanti e quali valori sono
definiti
in una ENUM?
se io ho
Enum Test
    A = 0
    B = 1
    C = 2
End Enum
e dichiaro una variabile
dim x as Test
l'assegnazione x=45; è da un punto di vista logico errata,
ma non produce errore.
E' possibile da codice intercettare
queste assegnazioni senza conoscere a priori quali valori
sono validi?
Esiste qualcosa tipo l'iterazione For Each per le variabili Enum?
--
bye BlackMagic
ICQ# 85485468

sai cosa c'è? almeno, è un mio dubbio.....
le info sugli Enum vengono perse nell'exe finale, quindi non puoi gestirle
run-time.....
secondo me è il compilatore che quando compila il progetto, sostituisce
tutte le chiamate agli elementi dell'Enum con i corrispondenti valori
numerici. all'exe finale non gliene frega niente sapere che X=A, oppure
X=45.....
quando fai l'exe, lui trova tutti i riferimenti a X=A e sostituisce A=0,
punto e basta.
Come hai detto tu, puoi anche mettere X=45, non è un errore.....
quindi, ripeto, secondo me l'exe non ha coscienza del fatto che è stato
usato un enum per fare certe cose......
potrei sbagliarmi, però.....
good coding!!!
--
Damiani Liborio Igor
ig...@igordamiani.it
 - 
soft...@igordamiani.it
 - 
idam...@hotmail.com
http://www.igordamiani.it
ICQ : 11847262


magari ti sbagli, comunque funziona come hai descritto, a questo punto
sembra
che gli enum in vb servano solo per darti la possibilità di usare
IntelliSense
e non sono sicure per "proteggere" il codice da assegnazioni errate


Dim o as tli.application
dim oinfo as tl.interfaceinfo
Referenziando la typelib information ... se sguazzi un pò dentro ai
metodi trovi tutto quello che ti occorre.
--
Saluti
Andrea Moro


grazie mille ora provo ma vedere....


Scusa, guardando meglio il tuo post, mi sono reso conto che ti occorre una
cosa del tipo:
public enum pippo
    [_min] = 1
    a = 1
    b = 2
    [_max]=2
end enum
dim x as pippo
if x.[_min] < 1 or x.[_max] > 2 then debug.print "fermati"
--
Saluti
Andrea Moro


esatto è questo, ma il prolema non è tanto per gli
enum che definisco io, per quelli il modo di proteggerli lo trovo
a me interessava proteggere l'assegnazione a enum di terze parti
di cui faccio uso, e proteggermi da modifiche che potrebbero essere
effettuare a questi


io dico la mia....secondo me il tutto funziona solo sul PC di debug, in fase
di sviluppo......
nell'exe non ci dovrebbero essere le info sull'enum che ho usato (perlomeno
lo spero).....
come dice il mio "illustre" collega qua a fianco, se io faccio un'enum con
10.000 possibili valori, dei quali nel codice ne uso 10, questi 10 vengono
sostituiti con i valori giusti......
ma cosa succede? che nell'exe mi ritrovo la codifica nome-valore per ogni
elemento dell'enum????
anche quelli che non ha usato!?!??!
spero di no.....
non solo, secondo me se VB facesse una cosa del genere, aiuterebbe non poco
anche il reverse-engineering.....
il tutto IMHO.....



secondo me nella parte di definzione si
comuqnue il mio problema non era tanto capire gli enum usati,
ma proteggere da assegnazioni errate le proprietà di alcune classi


 ma proteggere da assegnazioni errate le proprietà di alcune classi
la soluzione ci sarebbe, noiosa ovvia e inopportuna, ma ci sarebbe:
select case valore_da_assegnare_ad_enum
 case nome_enum.valore1
 case nome_enum.valore2
 ...
 case nome_enum.valoreN
 case else
  msgbox "valori fuori range"
end select
termoPilucco

rimango dell'idea: in *qualsiasi* punto del codice in cui faccio riferimento
ad un enum, il compilatore sostituisce il nome logico assegnato nell'enum
con il valore numerico.....
non ho ben capito cosa intendi per "i valori da sostituire possono anche
essere conosciuti solo in fase di esecuzione".....in che senso?
come farebbe il compilatore a non conoscere che valore sostituire ad un
enum? in quali condizioni?
secondo me nessuna, l'enum è chiuso nel sorgente, run-time non puoi
aggiungere elementi o rimuoverli, il compilatore *sa* sempre come gestire
l'enum.......
il tuo esempio iniziale è l'unico caso, forse, ma è un caso anomalo. Tu hai
un enum formato da 3 elementi, poi però assegni alla variabile il valore 45,
che non fa parte dell'enum. Ma questo non è nemmeno un problema, il
compilatore tratta l'assegnamento normalmente, senza passare dall'enum.....



tornadno all'inizio, il mio problema è proprio evitare che
io possa assegnare 45 quando ammetto da 0 a 3, in particolare
quando stò impostando dei valori a delle proprietà di un'oggetto



per le property di una classe ho risolto
in altro modo, ma in questo modo proteggo
solo il codice dove uso enum miei


 ha scritto nel messaggio
news:b83n0k$5mhbp$1...@ID-150836.news.dfncis.de...



la logica è esatta, per quanto riguarda le enum che definisco
nel mio codice il problema lo risolvo,
resta come proteggere da assegnazioni logicamente errate
enum definiti da terzi che non espongono le proprietà min/max
ma anche che non usano valori sequenziali per decodificare le costanti,
penso ad enum del tipo
enum xxxx
 a=0
 b=1
 c=2
 d=4
 .
 .
 i=64
end enum
in questi casi sarebbe utile poter iterare i valori
definiti nell'enum


Ma non vedo quale sia il problema a far sapere al pirata
di turno quali valori e quanti siano gli enum all'interno della
mia dll o del mio exe.
gli enum sono semplicemente dei puntatori ad una lista di costanti
che devo servire unicamente a chi programma utilizzando
dll di terzi (o anche le sue) per fare riferimento ad una lista
di possibili valori in modo da non incappari in overflow o
assegnazioni poco pertinenti al contesto.
STOP
--
Saluti
Andrea Moro


[CUT]
non intendevo quel tipo di protezione :-))
ma solo proteggere il codice da assegnazioni
arbitrarie. Comunque grazie, col tuo suggerimento
mi hai risparmaiato di cercare come nascondere
alcuni valori di un enum