Newsgroup: it.comp.lang.visual-basic
Titolo: Enum, ottenere il "nome"

Ciao a tutti,
faccio un po' fatica a spiegare cosa mi serve per cui passo a farVi vedere
l'esempio.
Ho un enum di questo tipo:
Public Enum en_Lang
     k_MnuApre = 0
     k_MnuFile = 1
     k_MnuEsci = 2
     k_MnuConfermaUscita = 3
End Enum
Se io scrivo
dim S as string
s = k_MnuApre
ottengo che s = "0"
ora, secondo voi, esiste un modo di fargli memorizzare "K_MnuApre"?
una cosa del tipo in 
vb.net
 k_MnuApre.ToString()
Grazie mille.
Ciao,
Massimo
-- 
web: 
www.piubelli.net
Ciò che oggi è facoltativo domani sarà necessario.
Perchè non prepararci per tempo al futuro?
Vuoi il mio indirizzo? Togli _cut_ per rispondermi

 CCCP++Mario
Ciao e grazie comunque per l'interessamento (e per avermi fatto imparare una
cosa nuova)


 ora, secondo voi, esiste un modo di fargli memorizzare "K_MnuApre"?
Che ne pensi di creare una funzione che tramite switch ti restituisce la
stringa??
Function GetNameEnum(ByVal toConvert AS en_Lang) as String
   select case toConvert
       case k_MnuApre
           Let GetNameEnum = "k_MnuApre"
   end select
end function
ciao

 ciao
Ciao e grazie per l'aiuto,


 riscriverle tutte per l'ennesima volta.
purtroppo quello che cerchi è qualcosa che può essere implementata solo dai
progettisti del Visual Basic perchè ha a che fare con i costrutti del
linguaggio.

 Ehhh... sarebbe... mi veniva voglia di convertire tutto in 
vb.net
 ma manca
ma 
vb.net
 ha un preprocessore ? Perchè quel genere di sporco 
trucco del C in realtà non è una caratteristica del linguaggio 
(una cosa di run-time diciamo) quanto una facility che ti offre 
il preprocessore .... quindi non sono sicuro che i vari .net la 
supportino. Sarebbe interessante sentire qualcuno che li conosce 
bene.
ciao
cccp++mario


 
se ti può interessare posso mandarti un programmino vb, o il 
codice, come preferisci, per automatizzare la generazione 
parametrizzata di alcune semplici righe di codice.
Devi solo definire dei segnaposto, uno per ciclo di 
"differenziazione" del codice, e delle liste di sostituzione. Se 
sono richieste molte combinazioni indipendenti (moltiplicare le 
associazioni diverse) piuttosto che seriali ed esclusive), puoi 
iterare il processo ridando in pasto il codice prodotto come 
output in input, fino ad avere consumato tutti i segnaposto con 
le serie di parametri avuti.
Non c'è help ovviamente, e il codice è breve ma da studiarsi
se ti serve fammi sapere.
è giusto un aiutino per limitare gli errori di scrittura manuale 
del codice ripetitivo con del sano copia incolla
I listati sono ovviamente poco maneggevoli a posteriori
ciao
cccp++mario


 bene.
Con si sa tutto dell'assembly (cioè del compilato), delle classi e delle
strutture che lo compongono.
Inoltre anche gli enum essendo derivati da ValueType hanno il metodo
.ToString() che ne restituisce il nome.
Ciao
-- 
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 riscriverle tutte per l'ennesima volta.
Tempo fa la Microsoft rendeva scaricabile una dll da usare con VB che
praticamente fa quello che fai in .Net con Reflection (cioè un browser per
COM).
Dovrebbe esserci anche nel CD di VB, però non ricordo assolutamente come si
chiama...
Se non sbaglio era Tlb*32.dll ma non ci giurerei... prova a chiedere al NG o
a fare una ricerca di tutte le dll sul CD... il nome era comunque abbastanza
significativo e la dll ben nascosta nelle sottodirectory.



Grazie mille,
provero' a cercare, anche se oramai sto puntando (vista la mancanza di
tempo) ad altre strade.
Ma è una cosa che mi incuriosisce oramai sta diventanto una questione di
principio più che altro.
Ciao e buon fine settimana.


 cccp++mario
Ciao e grazie mille,


eccoti il listato promesso, riguardalo e adattalo alle 
necessità, mi raccomando, io NON garantisco niente (e occhio a 
rimuovere i newline, magari prima con blocco note)
mettilo tutto in un unico file .FRM
FILE  << frmCodeTemplateGenerator_00.frm >>
Option Explicit
'''------------------------------------------------------------
'''------------------------------------------------------------
Private Const conCharSetDigits As String = "0123456789"
Private Const conCharSetMinuscole As String = 
"qwertyuiopasdfghjklzxcvbnm"
Private Const conCharSetMaiuscole As String = 
"QWERTYUIOPASDFGHJKLZXCVBNM"
Private Const conCharSetAlfabetoStd As String = 
conCharSetMinuscole & conCharSetMaiuscole
Private Const conCharSetAccentate As String = 
"ÀàÁáÈèÉéÌìÍíÒòÓóÙùÚúÝý"
Private Const conCharSetLettereSpeciali As String = 
"ÀàÁáÂâÃãÄäÅåÆæÇçÈèÉéÊêËëÌìÍíÎîÏïÑñÒòÓóÔôÕõÖöÙùÚúÛûÜüÝýÿ"
Private Const conCharSetExtended As String = 
"Àà¡Áá¢Ââ£Ãã¤Ää¥Åå¦Ææ§Çç¨Èè©ÉéªÊê«Ëë¬Ìì­Íí®Îî¯Ïï°Ðð‘±Ññ’²Òò³Óó´ÔôµÕõ¶Öö 
× ÷¸Øø¹ÙùºÚú»Ûû¼Üü½Ýý¾Þþ¿ßÿ"
Private Const conCharSetTokenNumber As String = "-ED.ed+" & 
conCharSetDigits
Private Const conCharSetTokenNome As String = 
conCharSetAlfabetoStd & "_" & conCharSetDigits
Private Const conCharSetTerminatoriBasic As String = "!#@%&$"
Private Const conLineSeparator As String = 
"'''--------------------------------------------------------------------------------"
Private Const conTempPathname As String = "E:\Temporary.TXT"
'''------------------------------------------------------------
'''------------------------------------------------------------
Private pvtTemplatingCode As String ''' maschera codice sorgente
Private pvtTemplatingTag As String ''' stringa da rimpiazzare in 
esso
Private pvtAliasesTokens() As String ''' testo di sostituzione 
multipla
Private pvtTemplatingCodeJustAquired As Boolean ''' maschera 
codice sorgente
Private pvtTemplatingTagJustAquired As Boolean ''' stringa da 
rimpiazzare in esso
Private pvtAliasesTokensJustAquired As Boolean ''' testo di 
sostituzione multipla
Private pvtClip As String
'''------------------------------------------------------------
'''------------------------------------------------------------
'''@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Public Function strParseTextByTokenLegalCharSet(ByVal Testo As 
String, ByVal LegalChars As String, ByRef NumFoundTokens As 
Long, Tokens() As String, ByRef Errore As String) As Boolean
On Error GoTo Err_strParseTextByTokenLegalCharSet
strParseTextByTokenLegalCharSet = True
Dim Legals(0 To 255) As Boolean
Dim TmpText() As Byte
Dim TmpLegal() As Byte
Dim J As Long, InToken As Boolean
Dim CurrTok As String
TmpText() = StrConv(Testo, vbFromUnicode)
TmpLegal() = StrConv(LegalChars, vbFromUnicode)
For J = LBound(TmpLegal()) To UBound(TmpLegal())
     Legals(TmpLegal(J)) = True
Next J
InToken = False
NumFoundTokens = 0
CurrTok = ""
For J = LBound(TmpText()) To UBound(TmpText())
     If (Legals(TmpText(J)) = True) Then
         If (InToken = True) Then
             CurrTok = CurrTok & Chr$(TmpText(J))
         Else
             CurrTok = Chr$(TmpText(J))
             InToken = True
         End If
     Else
         If (InToken = True) Then
             If (CurrTok = "") Then Err.Raise 100010, 
"strParseTextBySeparatorsCharSet", "InToken flag = true but 
CurrToken = empty !"
             NumFoundTokens = NumFoundTokens + 1
             ReDim Preserve Tokens(1 To NumFoundTokens) As String
             Tokens(NumFoundTokens) = CurrTok
             CurrTok = ""
             InToken = False
         Else
             ''' skip
         End If
     End If
Next J
''' eventuale residuo
If Not (CurrTok = "") Then
     NumFoundTokens = NumFoundTokens + 1
     ReDim Preserve Tokens(1 To NumFoundTokens) As String
     Tokens(NumFoundTokens) = CurrTok
End If
Esc_strParseTextByTokenLegalCharSet:
On Error GoTo 0
Exit Function
Err_strParseTextByTokenLegalCharSet:
Errore = "SourceCodeParserProcedures >> 
strParseTextByTokenLegalCharSet : " & Err.Source & Err.Description
strParseTextByTokenLegalCharSet = False
Resume Esc_strParseTextByTokenLegalCharSet
End Function
'''@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
'''@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Private Sub cmdAquireReplacersList_Click()
On Error Resume Next
Kill conTempPathname
Dim J As Long, Errore As String, Result As Boolean
Dim FoundTokens As Long
Result = strParseTextByTokenLegalCharSet(txtInput.Text, 
conCharSetTokenNome, FoundTokens, pvtAliasesTokens(), Errore)
If (Result = False) Then
     MsgBox "cmdAquireReplacersList_Click >> 
strParseTextByTokenLegalCharSet >> " & Errore, , "Errore INPUT"
     Exit Sub
End If
If (FoundTokens < 1) Then
     MsgBox "cmdAquireReplacersList_Click : trovati soltanto : " 
& FoundTokens & " Tokens. Input inadeguato al templating !"
     Exit Sub
End If
lstTemplatingReplacers.Clear
For J = LBound(pvtAliasesTokens()) To UBound(pvtAliasesTokens())
     With lstTemplatingReplacers
         .AddItem (pvtAliasesTokens(J))
     End With
Next J
pvtAliasesTokensJustAquired = True
End Sub
Private Sub cmdAquireTemplateCode_Click()
On Error Resume Next
If (MsgBox("Sicuro di confermare il codice templando nella text 
box in alto a sinistra, come testo in cui cercare la template 
mask (Y / N) ?", vbYesNo, "Confermi codice sorgente templando 
?") = vbNo) Then Exit Sub
pvtTemplatingCode = txtInput.Text
pvtTemplatingCodeJustAquired = True
If (Len(pvtTemplatingCode) < 936) Then
     MsgBox "Ho acquisito : " & vbCrLf & vbCrLf & 
pvtTemplatingCode, , "Templating CODE aquired"
Else
     MsgBox "Ho acquisito : " & vbCrLf & vbCrLf & 
Left$(pvtTemplatingCode, 936) & vbCrLf & "....CUT....", , 
"Templating CODE aquired"
End If
End Sub
Private Sub cmdAquireTemplatingTag_Click()
On Error Resume Next
Dim Tmp As String
Tmp = txtTagToReplace.Text
Tmp = InputBox$("Sicuro di confermare <<" & Tmp & ">> come testo 
sostituendo e templando ? (Blank to abort)", "Conferma (o 
reimmetti) testo da sostituire", Tmp)
If (Tmp = "") Then Exit Sub
pvtTemplatingTag = Tmp
pvtTemplatingTagJustAquired = True
txtTagToReplace.Text = Tmp
End Sub
Private Sub cmdCodeGenerate_Click()
On Error Resume Next
Dim J As Long, TotGeneratedCode As String
Dim GeneratedCode As String, Metti As String
Dim TagFoundPosiz As Long
If (pvtTemplatingCodeJustAquired = False) Then
     MsgBox "Non hai ancora fissato il codice stampo da 
'templare' ! Fallo prima di generare il codice.", , "Input missing"
End If
If (pvtTemplatingTagJustAquired = False) Then
     MsgBox "Non hai ancora fissato il TAG da sostituire nella 
generazione dei templates ! Fallo prima di generare il codice.", 
, "Input missing"
End If
If (pvtAliasesTokensJustAquired = False) Then
     MsgBox "Non hai ancora fissato la lista di stringhe di 
sostituzione del TAG nel codice stampo da 'templare' ! Fallo 
prima di generare il codice.", , "Input missing"
End If
If (pvtTemplatingCodeJustAquired = False) Or 
(pvtTemplatingTagJustAquired = False) Or 
(pvtAliasesTokensJustAquired = False) Then
     Exit Sub
End If
With lstTemplatingReplacers
     If (.SelCount <= 0) Then
         If (MsgBox("Non è selezionato nessun elemento dalla 
lista delle stringhe di sostituzione (replacers). Vuoi 
selezionarli tutti in maniera automatica ? (Y / N)", vbYesNo, 
"Conferma selezione completa ?") = vbYes) Then
             For J = 0 To .ListCount - 1
                 .Selected(J) = True
             Next J
         Else
             Exit Sub
         End If
     End If
End With
txtOutput.Text = ""
TotGeneratedCode = ""
For J = LBound(pvtAliasesTokens()) To UBound(pvtAliasesTokens())
     If (lstTemplatingReplacers.Selected(J - 
LBound(pvtAliasesTokens())) = True) Then
         GeneratedCode = pvtTemplatingCode
         Metti = pvtAliasesTokens(J)
         TagFoundPosiz = 0
         Do
             TagFoundPosiz = InStr(TagFoundPosiz + 1, 
GeneratedCode, pvtTemplatingTag)
             If (TagFoundPosiz <= 0) Then
                 Exit Do
             End If
             If (TagFoundPosiz > 1) Then
                 If (TagFoundPosiz + Len(pvtTemplatingTag) < 
Len(GeneratedCode)) Then
                     GeneratedCode = Left$(GeneratedCode, 
TagFoundPosiz - 1) & Metti & Mid$(GeneratedCode, (TagFoundPosiz 
+ Len(pvtTemplatingTag)))
                 Else
                     GeneratedCode = Left$(GeneratedCode, 
TagFoundPosiz - 1) & Metti
                 End If
             Else
                 If (TagFoundPosiz + Len(pvtTemplatingTag) < 
Len(GeneratedCode)) Then
                     GeneratedCode = Metti & Mid$(GeneratedCode, 
(TagFoundPosiz + Len(pvtTemplatingTag)))
                 Else
                     MsgBox "Errore cercando <<" & 
pvtTemplatingTag & ">> in <<" & GeneratedCode & ">>", , "Errore"
                 End If
             End If
         Loop
         TotGeneratedCode = TotGeneratedCode & vbCrLf & 
conLineSeparator & vbCrLf & GeneratedCode
     End If
Next J
txtOutput.Text = TotGeneratedCode
Clipboard.SetText TotGeneratedCode, vbCFText
Clipboard.SetText TotGeneratedCode, vbCFText
MsgBox "Il codice sorgente generato è presente anche negli 
appunti di sistema per un rapido copia/incolla", , "Informazione"
End Sub
Private Sub Form_Resize()
On Error Resume Next
frmCodeTemplater.Scale (-1, -1)-(1001, 1001)
txtInput.Move 1, 1, 499, 419
cmdAquireTemplateCode.Move 1, 421, 374, 80: cmdCodeGenerate.Move 
376, 421, 124, 80
txtOutput.Move 1, 501, 499, 499
cmdAquireTemplatingTag.Move 501, 1, 499, 99
txtTagToReplace.Move 501, 101, 499, 99
lstTemplatingReplacers.Move 501, 201, 499, 700
cmdAquireReplacersList.Move 501, 900, 499, 99
End Sub
Private Sub mCopiaOutputTemplatedCode_Click()
On Error Resume Next
pvtClip = txtOutput.Text
Clipboard.SetText pvtClip, vbCFText
End Sub
Private Sub mIncollaReplacersAliases_Click()
On Error Resume Next
Dim Tmp As String
Tmp = Clipboard.GetText(vbCFText)
If Not (pvtClip = Tmp) Then
     If Not (MsgBox("Discrepanza appunti privati interni e 
condivisi di sistema. Uso gli appunti privati interni ? (Y / 
N)", vbYesNo, "Conferma privati interni") = vbYes) Then
         pvtClip = Tmp
     End If
End If
txtInput.Text = pvtClip
Call cmdAquireReplacersList_Click
End Sub
Private Sub mIncollaTemplatingCode_Click()
On Error Resume Next
Dim Tmp As String
Tmp = Clipboard.GetText(vbCFText)
If Not (pvtClip = Tmp) Then
     If Not (MsgBox("Discrepanza appunti privati interni e 
condivisi di sistema. Uso gli appunti privati interni ? (Y / 
N)", vbYesNo, "Conferma privati interni") = vbYes) Then
         pvtClip = Tmp
     End If
End If
txtInput.Text = pvtClip
Call cmdAquireTemplateCode_Click
End Sub
Private Sub mIncollaTemplatingTag_Click()
On Error Resume Next
Dim Tmp As String
Tmp = Clipboard.GetText(vbCFText)
If Not (pvtClip = Tmp) Then
     If Not (MsgBox("Discrepanza appunti privati interni e 
condivisi di sistema. Uso gli appunti privati interni ? (Y / 
N)", vbYesNo, "Conferma privati interni") = vbYes) Then
         pvtClip = Tmp
     End If
End If
txtTagToReplace.Text = pvtClip
Call cmdAquireTemplatingTag_Click
End Sub
Private Sub mShowAquiredTemplatingCode_Click()
On Error Resume Next
If (pvtTemplatingCodeJustAquired = True) Then
     Clipboard.SetText txtInput.Text, vbCFText
     txtInput.Text = pvtTemplatingCode
Else
     MsgBox "Templating Code Non Yet Aquired", , "Warning"
End If
End Sub

 FILE  << frmCodeTemplateGenerator_00.frm >>
Grazie mille di nuovo per l'aiuto.
Ciao,
Massimo

 Se non sbaglio era Tlb*32.dll ma non ci giurerei
si  >>< Tlbinf32.dll
www.google.it
  "TypeLibraryExplorer"  "tlbview21"
dovrebbero essere su qualche sito di VB
--
Fosco

 una cosa del tipo in 
vb.net
 k_MnuApre.ToString()
Scusa, ma a che diavolo ti serve un cosa del genere? Se hai fatto bene 
il tuo programma (e se hai capito a cosa servono gli Enum), non ne hai 
assolutamente alcun bisogno.
-- 
Ciao!
    -DocDoc-
--- Per scrivermi: docdoc()
sertel.net
Sei anche tu stanco dei messaggi spam? Usa Terminator, il programma
anti-spam italiano FREEWARE!     
http://www.spamterminator.it/

 assolutamente alcun bisogno.
a me ad esempio servirebbe e molto per creare a runtime messaggi 
di errore (diciamo di degub runtime) flessibili che chiariscano 
meglio il contesto in cui sono stati generati. Anche messaggi di 
aiuto e messaggi testuali scambiati tra funzioni diverse che si 
passano enum, type etc si gioverebbero non poco di questa feature.
ciao
CCCP++Mario

 assolutamente alcun bisogno.
Ciao,
l'enum mi serve per la traduzione del programma in varie lingue (ho di fatto
codificato tutte le voci di menu, i pulsanti e le label) visto che ho molte
voci simili (apri, salva, annulla ecc).
Ora ho bisogno di esportare in un file xml l'enum con la traduzione relativa
e volevo evitare di usare il numero ma preverivo usare lo stesso nome che
usavo nel mio programma (per semplicità di manutenzione successiva)
Quello che vorrei è ottenere un file xml che mi scriva
<value k_MnuApre = "Apri"></value>
<value k_MnuChiudi = "Chiudi"></vale>
ora ho parzialmente risolto con un
<value k_1 = "Apri"></value>
<value k_2 = "Chiudi"></vale>
e sto testando la funzionalità di scrittura automatica del codice come sto
cercando di capire come funzia la dll proposta da Fosco su post di Zanna,
anche se ormai è più per una questione personale che altro.
