Newsgroup: it.comp.lang.visual-basic
Titolo: Propare la stessa funzione a piu' form (non banale)

Salve a tutti.
A prima lettura il soggetto sembra banale. 
Ma cosi' non e'.
Ho la necessità di rendere multilingua un progetto in VB 6.0.
Il progetto è costituito da molti form, l'ho ereditato già codificato 
alrimenti non avrei mai scelto Visual Basic.
Vorrei caricare le caption dei controlli da un file esterno.
Ogni riga di questo file (csv) contiene
- nome del form
- nome del controllo
- stringa della caption.
Vorrei propagare la funzione di caricamento della lingua a tutti i form,
ma scrivendo il codice solo in un punto.
Io ho sempre usato linguaggi di programmazione ad oggetti "veri" come C, C
++, (C# adesso).
Se il sw fosse stato sviluppato con C++ allora avrei esteso la classe 
base dei form con la possibilità di caricare il file della lingua ad 
esempio nel metodo Form_Load,cosi' automaticamente tutti i form dericati 
dalla classe Form avrebbero acquisito la possibilità di caricare il file 
multilingua.
E' possibile in VB6.0 fare la stessa cosa?
Cioe' estendere la funzionalità della class base Form per poter caricare 
il file delle lingue?

 il file delle lingue?
Che io sappia, no.
Ciao
stefano

 ma scrivendo il codice solo in un punto.
Una public sub in un modulo, da richiamare al load di ogni form,
non andrebbe bene ?
Al load del solo form principale carichi in una matrice i dati dal file,
e al load di ogni form cicli la (pseudo-)collection Controls e hai risolto.
Non è il massimo della tecnologia, ma è semplice e manutenibile.
Così a occhio eh, ma non mi pare complicato.
Bye, G. 

 ma scrivendo il codice solo in un punto.
Questo dovrebbe fare al caso tuo...
http://tinyurl.com/2hnzqh
--
Ciao Fede
By Chicco Production
http://www.webalice.it/bychicco/

 e al load di ogni form cicli la (pseudo-)collection Controls e hai risolto.
Ho fatto un esempio, provalo. La parte che devi fare tu ovviamente
è quella della lettura dei CSV.
Crea un progetto nuovo, due form e un modulo, nomi standard.
Su ogni form metti un tasto e tre labels.
Incolla questo codice e lancia.
Nel modulo:
'****************************
Option Explicit
Public TestoControllo() As TestiControlli
Public NumeroTesti As Long
Public Type TestiControlli
      NomeForm As String
      NomeControllo As String
      TestoControllo As String
End Type
Public Sub CaricaCaptions(QuestoForm As Form)
      Dim N As Integer
      Dim M As Integer
      For N = 0 To QuestoForm.Controls.Count - 1
            For M = 0 To NumeroTesti
                  If TestoControllo(M).NomeForm = QuestoForm.Name Then
                        If TestoControllo(M).NomeControllo = 
QuestoForm.Controls(N).Name Then
                              QuestoForm.Controls(N).Caption = 
TestoControllo(M).TestoControllo
                              Exit For
                        End If
                  End If
            Next M
      Next N
End Sub
'****************************
Nel Form principale:
'****************************
Option Explicit
Sub CaricaTestiTasti()
'Qui ovviamente è finto, con dati immessi da codice
'nella realtà lo leggi dal CSV.
      NumeroTesti = 7
' leggendo da file devi usare Redim Preserve
      ReDim TestoControllo(NumeroTesti)
      TestoControllo(0).NomeForm = "Form1"
      TestoControllo(0).NomeControllo = "Label1"
      TestoControllo(0).TestoControllo = "Prima label"
      TestoControllo(1).NomeForm = "Form1"
      TestoControllo(1).NomeControllo = "Label2"
      TestoControllo(1).TestoControllo = "seconda label"
      TestoControllo(2).NomeForm = "Form1"
      TestoControllo(2).NomeControllo = "Label3"
      TestoControllo(2).TestoControllo = "terza label"
      TestoControllo(3).NomeForm = "Form2"
      TestoControllo(3).NomeControllo = "Label1"
      TestoControllo(3).TestoControllo = "Prima label secondo form"
      TestoControllo(4).NomeForm = "Form2"
      TestoControllo(4).NomeControllo = "Label2"
      TestoControllo(4).TestoControllo = "Seconda label secondo form"
      TestoControllo(5).NomeForm = "Form2"
      TestoControllo(5).NomeControllo = "Label3"
      TestoControllo(5).TestoControllo = "Terza label secondo form"
' non c'è neanche bisogno che siano in ordine, volendo.
      TestoControllo(6).NomeForm = "Form1"
      TestoControllo(6).NomeControllo = "Command1"
      TestoControllo(6).TestoControllo = "Primo tasto"
      TestoControllo(7).NomeForm = "Form2"
      TestoControllo(7).NomeControllo = "Command1"
      TestoControllo(7).TestoControllo = "Primo tasto 2° form"
End Sub
Private Sub Command1_Click()
      Form2.Show
End Sub
Private Sub Form_Load()
      CaricaTestiTasti
      CaricaCaptions Me
End Sub
'****************************
Nel secondo form:
'****************************
Option Explicit
Private Sub Form_Load()
      CaricaCaptions Me
End Sub
'****************************
Bye, G. 

 Bye, G.
Tu sei un mostro :)
-- 
Greg 

 Tu sei un mostro :)
Guarda che quello è solo un inizio. A parte che manca la sezione
di lettura del CSV, si dovrebbe mettere un po' di If TypeOf (o meglio
una Select Case), per gestire i controlli la cui proprietà testo non
è .Caption; poi si dovrebbe prevedere, sempre nella parte relativa
al CSV, un sistema di escape per poter inserire virgole, virgolette,
a capo e altri caratteri che non possono essere messi normalmente
in un CSV... c'è ancora da fare, eh.
Bye, G.

 stefano

 Sarebbe decisamente più maneggiabile.
Perche' non voglio essere io fare le traduzioni.
Io do' al cliente il file csv.
Gli dico che deve tradurre la colonna X.
Mi rida' il file e io lo salvo con csv (tab come separatore).
Ok che per l'XML ci sono dei parser già pronti, ma con un semplice editor 
di testo è ostico leggere e/o modificare XML.
Grazie comunque del consiglio.

 
http://tinyurl.com/2hnzqh
Ho guardato ma purtroppo utilizzo il campo Tag in alcuni Form come 
riferimento per altre cose.
Comunque grazie.

 Oops, una svista. Volevo eliminarlo poi ho dimenticato :-P
:-)
ciao
stefano

 Io do' al cliente il file csv.
In effetti non hai tutti i torti.
Cmq Paperino ti ha dato un'ottima dritta.
Ciao
stefano

 stefano

 L'unica differenza è che io ricarico sempre dal file.
Scusa, ma allora dov'è il problema ?
La routine unica generica ce l'hai, in ogni form metti la
chiamata e basta. Se il problema è un altro, spiegalo.
Bye, G.

Ho già risposto ad un quesito del genere al 3D "APPLICAZIONE MULTILINGUA" 
del 16/11/07 di cui ti riporto uno stralcio:
In un mio applicativo ho usato una tabella per convertire oltre un centinaio
tra Caption, ToolTipText e testi dei messaggi dall'italiano nelle principali
lingue europee. La cosa funziona benissimo, anche se non ho mai affrontato
altre lingue come arabo, cinese, giapponese, cirillico, ecc.
Le Caption e i ToolTipText vengono convertiti in fase di Load del Form in
funzione del valore di una variabile Lingua, effettuando una scansione di
tutti i controlli del Form (evidentemente in caso di Lingua="Italiano" non
viene fatto nulla) .
Per la conversione, invece, dei testi dei messaggi al posto del testo "Testo
del Messaggio" inserisco la chiamata ad una funzione Traduzione("Testo del
Messaggio") che traduce il testo prima di utilizzarlo, sempre in funzione
del valore di Lingua.
...
Ettore Massimo Albani 


Probabilmente vuole evitare di dover ripetere la chiamata in ogni
evento Load, per tutte le form presenti e future, da cui il motivo per
cui accennava all'ereditarieta'.
Una soluzione potrebbe essere quella di fare una funzione tipo:
Sub ShowLocalized(ByVal f as Form, ByVal flagModal As Long)
'Questo precarica i controlli, in modo che possano essere modificati
prima di mostrare la finestra
Load f
'[...] qui il codice di caricamento delle traduzioni, in funzione di
f.Name
'Infine lo Show vero e proprio
f.Show flagModal
End Sub
e da qui in poi usare sempre questa al posto dei vari Form.Show()
diretti

 cui accennava all'ereditarieta'.
Deve pur sempre modificare le presenti e scrivere le future.
Mettere una riga ciascuna mi pare più semplice che cambiare
la logica del programma: io nella _load, nella _initialize e nella
_paint spesso faccio qualcosa che magari [voglio|non voglio]
che venga ripetuto ad ogni Show.
Bye, G.