Newsgroup: it.comp.lang.visual-basic
Titolo: domanda da inseperto con gli oggetti

Buongiorno a tutto il NG.
Premettendo che sono solo un'hobbysta, volevo un vs. parere su un problema
che non riesco ad affrontare,
dunque io ho memorizzato in una stringa un certo testo che è esattamente il
nome di un oggetto nel mio progetto (es. frmMioForm) e vorrei usare questa
variabile per gestire questo oggetto ma non funziona.
Semplificando uso questo codice:
stringa = "frmMioForm"
set oggetto = stringa
cosa che mi restituisce l'errore "tipo non corrispondente" o messaggio
simile. La domanda e' sbaglio completamente l'approccio o c'e' un qualche
workaround???
grazie mille e ciao ciao
Syd Heep
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 grazie mille e ciao ciao
ciaociao

 Nell'esempio che hai postato però, non credo sia utilizzabile
CUT
VERO SI E VERO NO!
se ogni tanto si usasse Google sui vecchi post di questo NG invece che
volere la pappa scodellata si troverebbe un sacco di codice buono.
Questo NG è tutt'altro che un covo di LAMER...c'ha postato gente brava e
anche con "chicche" più che buone!
 Se ambedue (tirata di orecchie bonaria) aveste usato il San Google sui
NG...non avreste scomodato (almeno per questo caso particolare) la
CallByName...
basta il codice :
Dim FrmNew As Form
Dim strFrmName As String
strFrmName = "frmTCP" ' ad esempio...mettere qui il nome del form da
caricare
Set FrmNew = Forms.Add(strFrmName)
FrmNew.Show
...per inciso....il post che ho trovato io era di termopilucco...ma molti
altri han (negli anni) proposto cose analoghe!
Dice il saggio:
"Non andate a cercare fucili a pompa per uccidere una mosca....basta un più
efficente schiacciamosche"
Cerea ed ahloa!
-- 
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 New Entry nel bestiario!
:-)

 FrmNew.Show
[cut]
Tutto corretto.
Preciso perň che questa cosa funziona solo per oggetti che sono contenuti in
collection, come nel caso dei Form, che sono appunto in Forms.
Il post inziale parlava di oggetti in senso generale, e quello del form era
solo un esempio.
Se io uso un oggetto Pippo di tipo Object, e metto in una variabile stringa
il valore "Pippo", andare da questa a tirare fuori il puntatore all'oggetto
Pippo č cosa a me del tutto sconosciuta. Potrebbe teoricamente esistere
qualcosa del tipo VarByName, ma non penso che il nome venga mantenuto in
fase di compilazione, per cui credo che nell'eseguibile una cosa del genere
non potrebbe funzionare.
Ciao
Alberto

Grazie mille ragazzi,
proverň con le risposte date e vi farň sapere.
Il mio problema comunque č che voglio cambiare le proprieta' di tutti gli
oggetti del mio progetto (frm, txt, lv, cmd, ecc. ) leggendo i dati da un
file di testo (praticamente imposto la lingua)
Wodka40° scusa ma ho provato a cercare in google e su vari siti di VB, ma i
risultati che ho ottenuto sono veramente troppi e spulciarli tutti era
veramente troppo lungo... specie dal PC dell'ufficio ;-)
ciao ciao e grazie mille ancora.


 dati da un file di testo (praticamente imposto la lingua)
i sacri testi dicono che per facilitare questa cosa bisogna fare ricorso ai
file di risorse.
non so cosa voglia dire, in realtà, perchè non li ho mai usati, ma può
servire come spunto.
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 dati da un file di testo (praticamente imposto la lingua)
allora come dice Sergio usa un file di risorse.
ciaociao

 ciaociao
ma se io sono in fase di test oppure voglio aggiungere nuove opzioni...
...oppure voglio inizialmente farla in FRA e ITA e poi uno mi traduce lo
Spagnolo?
e se non voglio far aumentare l'exe...perchè il file di risorse mi aumenta
l'exe...
o se non voglio che sia modificabile facilmente con qualsiasi tools?
e quindi ho i miei testi o altro criptati?...
beata gioventù non è più semplice studiare roba del genere....
Private Sub Command4_Click()
Dim TestoNuovo As String
Dim Otrovato As Object
'qui lo carichi dall'esterno:
' File testo?
' Config.Mdb?
' File XML?
' Quello che vuoi tu???
TestoNuovo = "Ponte petippetatppete"
For Each Otrovato In Me 'perchè io lo faccio solo nella form in cui mi
trovo!
    If TypeOf Otrovato Is Label Then
        Otrovato.Caption = TestoNuovo
    End If
Next
End Sub
questo esempio (scritto al volo e funzionante) ti cambia le caption...ora a
te complicare il tutto!
bai bai!


 bai bai!
-- 
Il Wodkino Nazionale č a : 
www.martek.it


 bai bai!
ciaociao

 devo solo sostituire il file .res
E farò di più... ve la regalo! :))))))
Public Sub SetLinguaggio(xf As Form)
Dim xc As Control
Dim xp As Property
Dim x_obj As Variant
Dim i As Integer
On Error GoTo Linguaggio_Error
'imposto la caption del form
If IsNumeric(xf.Caption) Then xf.Caption = LoadResString(CLng(xf.Caption))
'Imposto le caption dei controlli
For Each xc In xf.Controls
   'a seconda del tipo di controllo modifico le caption
   Select Case TypeName(xc)
      Case "TDBGrid", "TDBList"
         If IsNumeric(xc.Caption) Then
            xc.Caption = LoadResString(CLng(xc.Caption))
         End If
         For Each x_obj In xc.Columns
            If IsNumeric(x_obj.Caption) Then
               x_obj.Caption = LoadResString(CLng(x_obj.Caption))
            End If
         Next x_obj
      Case "TabStrip"
         For Each x_obj In xc.Tabs
            If IsNumeric(x_obj.Caption) Then
               x_obj.Caption = LoadResString(CLng(x_obj.Caption))
            End If
         Next x_obj
      Case "SSTab"
         For i = 0 To xc.Tabs - 1
            If IsNumeric(xc.tabCaption(i)) Then
               xc.tabCaption(i) = LoadResString(CLng(xc.tabCaption(i)))
            End If
         Next i
      Case Else
         If IsNumeric(xc.Caption) Then
            If CLng(xc.Caption) > 0 Then
               xc.Caption = LoadResString(CLng(xc.Caption))
            End If
         End If
   End Select
Next xc
Linguaggio_Quit:
   Exit Sub
Linguaggio_Error:
   If Err.Number = 438 Then  'se il controllo non ha la proprietà caption,
proseguo
      Resume Next
   Else
      If MsgBox(Err.Number & " - " & Err.Description, vbExclamation +
vbYesNo, "ImpostaLinguaggio") Then
         Resume Next
      Else
         Resume Linguaggio_Quit
      End If
   End If
End Sub
ciaociao

 file di testo (praticamente imposto la lingua)
Io ho risolto in questo modo:
In un file db ho inserito le varie traduzioni  ( la stessa parola nelle
varie linguè ha lo stesso ID )
ID Italiano Inglese
1   Si         Yes
Nel form per ogni controllo dipendente dalla lingua scelta occorre impostare
la proprietà TAG con l'ID della parola/frase.
Nell'evento Load del form inserisci questa chiamanta: LoadResStrings Me
In un modulo inserisci questa procedura
Sub LoadResStrings(frm As Form)
    On Error Resume Next
    Dim ctl As Control, i As Long
    Dim obj, objmenu As Object
    ' FORM
    If frm.Tag <> "" Then frm.Caption = TagToString(frm.Tag)
   For Each ctl In frm.Controls
            Select Case TypeName(ctl)
            Case "Label", "CheckBox":
                If ctl.Tag <> "" Then ctl.Caption = TagToString(ctl.Tag)
            Case "Menu":
                If ctl.Caption <> "-" Then ctl.Caption =
TagToString(ctl.Caption)
            Case "TabStrip":
                For Each obj In ctl.Tabs
                    obj.Caption = TagToString(obj.Tag)
                Next
            Case "Toolbar":
                For Each obj In ctl.Buttons
                    If obj.Tag <> "" Then
                        If blnShowLabel Then obj.Caption =
TagToString(obj.Tag) Else obj.Caption = ""
                        If obj.Style = tbrDropdown Then
                            For Each objmenu In obj.ButtonMenus
                                If objmenu.text <> "" Then objmenu.text =
TagToString(objmenu.Tag)
                            Next
                        End If
                    End If
                Next
            Case "StatusBar":
                For Each obj In ctl.Pannels
                    If obj.Tag <> "" Then
                        obj.Caption = TagToString(obj.Tag)
                    End If
                Next
            Case "ListView":
                For Each obj In ctl.ColumnHeaders
                    obj.text = TagToString(obj.Tag)
                Next
            Case "ComboBox":
                For i = 0 To ctl.ListCount - 1
                    ctl.list(i) = TagToString(ctl.list(i))
                Next i
            Case Else:
                If val(ctl.Tag) > 0 Then ctl.Caption = TagToString(ctl.Tag)
        End Select
    Next
End Sub
TagToString si occupa di recuperare la frase della lingua corretta passato
l'ID della frase/parola.
Spero di esserti stato utile,
Bye.

 [...]
non hai letto quello che ho detto!
(almeno spero se no parliamo 2 lingue diverse)
a) Il codice...era un esempio....Syd s'è trovato la pappa scodellata con il
tuo...non sperimenterà altre strade!
Non per cattiva volonta sua ma perchè c'ha il codice già fatto e caso mai
deve far presto.
Ergo....cut & paste...cos aha imparato?
b) Il file risorse ha pregi e svantaggi....
Va benissimo in una app in versione stabile...e con QUELLE feature.
cambiarle vorrebbe dire ...prendere l'app...modificare il file risorse
(pensa ad una traduzione in più..non a una modifica di campi già esistenti)
e ricompilare.
Un file XML o un mdb o un file di testo mi sembra più pratico.
Se vuoi fare uno skin come lo fai? Con un file di risorse? SI!.... se li
skin son quelli e rimangono SOLO quelli!
...altrimenti fai un file esterno come tutti! Ma lo fanno per praticità non
per moda!
Ciao!


 praticità non per moda!
ok, scusa, ero un po' distratto.
Ho fatto anche un modulo che fa la stessa cosa ma leggendo da un file di
testo (fra l'altro ho anche previsto una funzione di crittatura).... è che
spesso uso definire 'file di risorse' anche quello...
...potrei anche postare il codice, ma non voglio beccarmi un'altra sgridata
per Syd... ;-)
ciaociao

 dati da un file di testo (praticamente imposto la lingua)
In un programmino fatto da me (per la conversione all'Euro) ho adottato lo
stesso sistema che vuoi usare tu.
Ecco la funzione da me implementata, è molto semplicistica, sicuramente si
può implementare meglio, ma almeno hai un punto di partenza.
La funzione si avvale del API GetPrivateProfileString e il file della lingua
è strutturato come un file .ini:
Esempio: Italian.esl
***** Italian.esl *****
[frmMain]
cmdMenu.ToolTipText=Cliccare con il tasto destro per attivare il menu
txtCurrency.ToolTipText=Digitare l'importo nella valuta propria
lblCurrencyDescription.ToolTipText=Simbolo valuta propria
txtEuro.ToolTipText=Digitare l'importo in Euro
lblEuroDescription.ToolTipText=Euro
[frmMenu]
mnuConfigure.Caption=C&onfigura
mnuAlwaysOnTop.Caption=Sempre in &primo piano
mnuAbout.Caption=&Su...
mnuExit.Caption=&Esci
[frmConfigure]
lblCurrencyDescription.Caption=&Sigla valuta propria
lblDecimalPlaces.Caption=De&cimali da visualizzare:
chkUseSeparator.Caption=&Usa separatore per le migliaia
cmdOk.Caption=Annulla
cmdExit.Caption=S&alva
***** Fine di Italian.esl *****
'**** Sub per il caricamento dei testi *****
'Alla Sub passo il riferimento al Form
Sub LoadLanguage(objForm As Object)
    Dim strFileName As String
    Dim strRetString As String * 255
    Dim intRetStringLen As Integer
    Dim strKeyName As String
    Dim vntControl As Variant
    'Cerco, nella cartella dell'applicazione il primo file con estensione
.esl
    ' trova il primo, quindi nella cartella dovrebbe esserci solo un file
    'della lingua
    strFileName = Dir(App.Path & "\*.esl")
    If Len(strFileName) > 0 Then
        strFileName = App.Path & "\" & strFileName
        'Senza troppi fronzoli, se un controllo non supportasse una delle
proprietà
        'salto alla prossima istruzione. Certo, è deplorevole l'uso di On
Error
        'Resume Next però per questa funzione non mi servivano particolari
controlli
        On Error Resume Next
        For Each vntControl In objForm.Controls
            strKeyName = vntControl.Name & ".Caption"
            intRetStringLen = GetPrivateProfileString(objForm.Name,
strKeyName, _
                vntControl.Caption, strRetString, 255, strFileName)
            vntControl.Caption = Left(strRetString, intRetStringLen)
            strKeyName = vntControl.Name & ".ToolTipText"
            intRetStringLen = GetPrivateProfileString(objForm.Name,
strKeyName, _
                vntControl.ToolTipText, strRetString, 255, strFileName)
            vntControl.ToolTipText = Left(strRetString, intRetStringLen)
        Next
        On Error GoTo 0
    End If
End Sub
'***** Fine della Sub per il caricamento dei testi *****
Ecco questo è quanto. Rileggendo il codice direi che avrei potuto farlo
meglio, ma almeno hai una traccia da cui partire.
Ciao!
-- 
Esteban
www.seber.it
Questo post è stato scritto con bit riciclati.

 Ergo....cut & paste...cos aha imparato?
[cut]
Ti ringrazio anche per la premura nei miei confronti :-)
e ti posso assicurare che e' mia abitudine cercare sempre di capire la
logica che c'e' dietro e non solo fare un semplice cut & paste...
ciao ciao


Ancora grazie a tutti, un sacco di suggerimenti...
prevedo una nottata molto corta ;-)
ciao ciao e vi faro' sapere cosa ho fatto...


 Questo post è stato scritto con bit riciclati.
:-))))
ciao ciao e ancora mille grazie....
