Newsgroup: it.comp.appl.access
Titolo: eseguire procedura in fase di progettazione maschera

ho un mia applicazione multilingua
 
ho creato una tabella Language con i testi in 4 lingue delle label, button e altro. All'aapertura della maschera ciclo sui controlli e modifico in base alla lingua il contenuto.
Ora aggiungento maschere il dizionario ha milti record (circa 2000) e noto che c'e' un rallentamento all'apertura delle maschere.
 
Pensavo ad un'altra soluzione:
sfruttare per i controlli delle maschere la proprietò Tag dove metto il valore di default (italiano)
Vorrei che in fase di progettazione riuscissi ad eseguire una procedura che mi modifica il valore della caption delle label e me lo traducesse una tantum e mi salvasse la maschera col valore tradotto.
 
Come posso eseguire una procedura in modalità progettazione maschera?
E' possibile
GRAZIE


Premesso che non ho capito come gestisci i testi tradotti... ma non può essere lento a caricare una maschera che avrà al massimo qualche decina di Controlli da editare....
 
Ora non si comprende cosa vuoi fare... 
Se vuoi assegnare nella proprietà TAG il valore in IT... devi pur sempre leggerlo ed applicarlo...
 
Qualche cosa non torna.
Puoi descrivere lo scenario delle TABELLA in cui salvi le MULTILINGUE e mostrare il codice con cui recuperi i dati e li applichi...?
 
@Alex


anche io uso una tabella per le traduzioni con 4 colonne  ITA;FRA;ENG;GER
 
di default tutte le label sono in italiano
se il parametro della lingua scelta è diversa da ITA ad ogni apertura 
maschera/report tutte le label che hanno il tag "DaTradurre" vengono 
sostituite leggendo il valore dalla tabella tramite un dlookup
 
anche su report con 50-60 label da tradurre l'apertura è istantanea 
tanto che non mi sono mai posto il problema di soluzioni più performanti 
(tipo precaricarmi le parole tradotte in un array all'avvio del programma)
 
Come hai strutturato la tabella delle traduzioni? che indici hai messo?
 
hai provato a misurare il tempo di apertura form con e senza 
l'operazione di traduzione? che il problema non sia altro.
 
 
BFS
 
 
 
 


grazie a entrambi. vi trasmetto il codice 
la mia curiosità sarebbe quella di eseguire da progettazione una procedura che mi eseguisse la traduzione
 


Quindi faresti la Traduzione delle LABEL, bene, ma c'è molto altro:
1) Le Caption dei Button/OptionGroup/TabControl ecc
2) I MSGBOX informativi di Interazione con l'utente
3) I menù rapidi...
4) I Ribbons
5) I titoli delle Maschere...? (Caption di Form/Report)
&) dimentico qualche altra cosa...
 
Da tener presente poi che ci sono le convenzioni internazionali i Regional Settings, €/$/Sterlina, e poi Virgola/Punto e tutto quello che compete al Paese di destinazione.
 
Rimanendo alle cose necessarie: se vuoi vedere questo esempio, ovviamente è BANALE ed assolutamente incompleto, ma se ti sarà utile lo guarderai tu:
 
http://forum.masterdrive.it/access-79/access-gestione-applicativi-multilingua-49341/
 
 
Prevede ovviamente delle Tabelle di storage delle conversioni in relazione alla Lingua, ed un sistema gestione sia delle Label che dei MsgBox vari ed eventuali.
 
La proprietà TAG non serve a nulla nel mio caso in quanto le CAPTION sono di DEFUALT nella lingua in cui viene sviluppato, e la modifica RUNTIME non le altera.
 
Di fatto apro un RS sulla Tabella filtrando per OGGETTO[Tipo(Report/Form)e Nome] recuperando tutti i Records... ogni Record è un controllo. 
 
Un ciclo e vengono cambiati tutti.
 
Questo in sostanza, non è una questione solo di Velocità come accennava anche BSF che dubito possa impattare con una manciata di controlli... ma mi è comodo in quanto non scrivo nemmeno 1 riga di codice in nessuna maschera, e centralizzo la gestione in un solo punto.
 
Saluti
@Alex


grazie! la analizzo e ti faccio sapere
 
questo e ayanto faccio
 
 
' ------------------------
' DA METTERE NEL FORM_LOAD
' ------------------------
'
'  ' =========== Translate ======================
'  Call Main_Language
'
'  If sLanguage <> "IT" And sLanguage <> "" Then
'     'Traduci (sLanguage)
'     Call CicloTraduci(sLanguage, Me.Name)
'  End If
'  ' =========== Translate ======================
'
 
'  ' =========== MSGBOX =========================
'  MsgBox Traduzione("Salva e Esci", CurrentProject.Name, Me.Name, ActiveControl.Name, "Msgbox"), _
'         vbOKOnly, _
'         Traduzione("Avviso", CurrentProject.Name, Me.Name, ActiveControl.Name, "Msgbox")
'  ' =========== MSGBOX =========================
 
Public dbLanguage As Database
Public rsLanguage As Recordset
 
Public sLanguage As String  ' DA FILE Ini sigla nazione to Translate
 
Public Function Main_Language()
  Set dbLanguage = CurrentDb
  Set rsLanguage = dbLanguage.OpenRecordset("SELECT * FROM Language", dbOpenDynaset, dbSeeChanges)
 
  sLanguage = LanguageIni()
  '
  With rsLanguage
       If pfm_SQL_RS_Pieno(rsLanguage) Then
          ' carico il recordset
          .MoveLast
          .MoveFirst
       Else
          MsgBox "Dizionario vuoto"
          sLanguage = ""
       End If
  End With
End Function
 
Public Function LanguageIni() As String
  LanguageIni = GetStrFromIni(CurrentProject.Path & "\" & "pfm.ini", "International", "Language", "Quale linguaggio")
End Function
 
Public Function Traduzione(sITaliano As String, sNomeProgetto As String, sNomeMaschera As String, sNomeControllo As String, sTipoControllo As String) As String
 
   ' Linguaggio
   Dim sSqlAccoda_noLanguage As String
 
   ' cerco se c'e' già il testo anche NON tradotto
 
   ' solo se c'e' una stringa
   If Len(Trim(sITaliano)) > 0 Then
 
      rsLanguage.MoveLast
      rsLanguage.MoveFirst
 
      'rsLanguage.FindFirst "IT = '" & sITaliano & "'"
      rsLanguage.FindFirst "IT = " & Chr(34) & sITaliano & Chr(34)
 
      If rsLanguage.NoMatch Then
         'NON trovato - accodo no language"
         sSqlAccoda_noLanguage = "INSERT INTO Language ( IT, Nota, Project, MascheraReport, Controllo, TipoControllo, Sospeso, DateHour ) " & _
                                 "SELECT " & _
                                           Chr(34) & sITaliano & Chr(34) & ", " & _
                                           Chr(34) & " " & Chr(34) & ", " & _
                                           Chr(34) & sNomeProgetto & Chr(34) & ", " & _
                                           Chr(34) & sNomeMaschera & Chr(34) & ", " & _
                                           Chr(34) & sNomeControllo & Chr(34) & ", " & _
                                           Chr(34) & sTipoControllo & Chr(34) & ", " & _
                                           vbTrue & ", " & _
                                           "#" & pfm_SQL_Date(Now) & " " & Time & "#"
         dbLanguage.Execute sSqlAccoda_noLanguage
      Else
         ' trovato - non Traduco se Sospeso
         If rsLanguage!sospeso <> vbTrue Then
            Debug.Print "_ok " & rsLanguage.Fields("IT") & " --> " & sLanguage & " - " & rsLanguage.Fields(sLanguage)
            Traduzione = Nz(rsLanguage.Fields(sLanguage), "")
         End If
      End If
   End If '    If Len(Trim(sITaliano)) > 0
End Function
 
 
Public Function CicloTraduci(siglaLingua, sNomeForm As String, Optional bTraduciCtrlNascosti As Boolean = False)
 
 Debug.Print sNomeForm
 Debug.Print Forms(sNomeForm).Caption
 
  Dim myCtrl As Control
  Dim sTranslate As String
 
  ' la caption della Maschera
  Forms(sNomeForm).Caption = Traduzione(Forms(sNomeForm).Caption, CurrentProject.Name, sNomeForm, "Caption Form", "")
  'Forms(sNomeForm).Caption = Traduzione(sStringaITA, CurrentProject.Name, sNomeForm, "Caption Form", "")
 
  For Each myCtrl In Forms(sNomeForm).Controls
 
      'Debug.Print "Name: " & myCtrl.Name & ", ControlType: " & myCtrl.ControlType & ", Value: " & myCtrl.value
 
                                             '       Debug.Print "Progetto: ---> " & CurrentProject.Name
                                             '       Debug.Print "Maschera: ---> " & Me.Name ' nome maschera
                                             '       Debug.Print "Controllo: --> " & myCtrl.Name
                                                   ' Debug.Print "CurrentObjectName --> "; CurrentObjectName ' nome maschera
 
 
        With myCtrl
            Debug.Print "myCtrl.Name --> " & myCtrl.Name & " ==> " & _
                        "TypeName: " & TypeName(myCtrl) & " ---> " & .ControlType
            If UCase(myCtrl.Tag) = "NO TRANSLATE" Then
              ' non traduco
              ' ===========
            Else
               Select Case .ControlType
                   Case acLabel
                        ' se bTraduciCtrlNascosti = true -- TRADUCO ANCHE SE NASCOSTI
                        '
                        If myCtrl.Visible = vbTrue Or bTraduciCtrlNascosti Then
                           sTranslate = Traduzione(myCtrl.Caption, CurrentProject.Name, sNomeForm, myCtrl.Name, TypeName(myCtrl))
 
                           If sTranslate <> "" Then
                               myCtrl.Caption = sTranslate
                           End If
                          ' myCtrl.Caption = Traduzione(myCtrl.Caption)
                          ' myCtrl.Caption = Nz(DLookup("SP", "LANGUAGE", "IT = '" & myCtrl.Caption & "'"), myCtrl.Caption)
                        End If
 
                   Case acCommandButton
                        Debug.Print myCtrl.Name
                        Debug.Print myCtrl.Caption
 
                        ' se bTraduciCtrlNascosti = true -- TRADUCO ANCHE SE NASCOSTI
                        '
                        If myCtrl.Visible = vbTrue Or bTraduciCtrlNascosti Then
                           sTranslate = Traduzione(myCtrl.Caption, CurrentProject.Name, sNomeForm, myCtrl.Name, TypeName(myCtrl))
 
                           If sTranslate <> "" Then
                               myCtrl.Caption = sTranslate
                           End If
                        End If
 
                   Case acOptionGroup ' frame
                       ' Debug.Print "TypeName: " & TypeName(myCtrl) & " ---> " & .ControlType
                       '
                       ' Debug.Print myCtrl.Name
                       ' Debug.Print myCtrl.Value
 
                   ' ========================
                   Case acTextBox
                       ' MsgBox ("The control is a Textbox.")
                      '  Debug.Print myCtrl.Name
                      '  Debug.Print myCtrl.Value
 
               End Select
 
            End If
        End With
  Next
End Function
 
 
 

Il giorno domenica 26 maggio 2019 21:41:01 UTC+2, pfm ha scritto:

Crea un modulo a parte e apri la tua form in design view facendo quello che vuoi
MA

apri la tua form in design view facendo quello che vuoi
si puo' eseguire del codice che va a modirifare le proprietà di una maschera quando questa e' aperta in design view?
 
 
 

Ovviamente puoi modificare tutto in modalità Struttura... ma valuta se operi con il RUNTIME perché sviluppi con un metodo che poi non funzionerà... il runtime non consente l'accesso alla struttura.
Questo è uno dei motivi per cui di norma si evita questo, pur fattibile, approccio.
 
@Alex

Grazie come sempre dei suggerimenti. Sono consapevole che è meglio tradurre in runtime. Ma per mia cultura personale come posso eseguire del codice in visualizzazione struttura?

>>>> Ora aggiungento maschere il dizionario ha milti record (circa 2000) e noto che c'e' un rallentamento all'apertura delle maschere.
 
Ho diverse applicazioni con più lingue e molto più record nel dizionario 
anche col codice chiamato all'apertura ma quasi senza effetto alla 
prestazione. La cosa più impotante sarebbe di capovolgere metodo:
 
Invece di ciclare i controlli e tante volte perlustrare il vocabulario 
dovresti aprire un recordset con solo le traduzioni per l'oggetto 
attuale (clausola WHERE) e ciclando il recordset una sola volta riempire 
i caption ecc. nel oggetto.
 
-- 
Ciao
Karl
*********
http://www.AccessDevCon.com
 
Access FAQ: 
http://www.donkarl.com/it
 

 Karl
 
 
Concordo sul metodo Karl, è esattamente quello che fa l'esempio che ho proposto.
 
Saluti
 
@Alex


grazie e' vero e in affetti per un'altra applicazione ho adottato il metoto di filtro. Resta il fatto che c'e' il problema di possibile duplicazione delle voci da tradurre se questa e' su + mascehre

mi resta sempre in sospeso se qualcuno e' riuscito a eseguire in modalità struttura del codice per modificare valori nelle proprietà dei controlli

Scusa ma siccome è banale farlo amche in modalità struttura... quale problema trovi...?
@Alex

 
 
 
personalmente l'ideale sarebbe Access si adeguasse a ide più moderni 
tipo quello di android studio. dove ogni stringa usata nell'applicazione 
non è scritta direttamente ma rappresenta un "puntatore/riferimento" a 
un valore contenuto in un file xml della lingua scelta.  (file risorsa)
 
Esempio in un pulsante di stampa non scriverò "Stampa" ma inserirò un 
+@stampa. Idem per messaggi di errori o caption di form
 
in automatico quel +@stampa verrà sostituito dal valore xml della lingua 
scelta, nel xml-ita  da "stampa" nel xml-eng da "print" etc in tutti i 
punti del programma dove viene usato.
Senza dover scrivere una riga di codice
 
Aggiungere una lingua ad una applicazione esistente diventa operazione 
banale, una semplice aggiunta di un xml con le traduzioni senza dover 
modificare l'applicazione
 
BFS
 

Ma si riesce quando una maschera è aperta in modalità visualizzazione struttura e inserisco  una label eseguire nel codice VB a che mi va modificare la proprietà captions della etichetta e poi Salvo la maschera che è rimasta in visualizzazione struttura?

Ma si... lanci il codice... apri La maschera in modalità Struttura... assegni ad un oggetto Access.Form la maschera aperta e li cicli la collection CONTROLS come faresti normalmente...
Finito di pasticciarla... chiudi la form salvando.
 
@Alex


Per capirci:
 
Questo è l'approccio di ciclare tutte le LABEL, ma è solo per un tuo esempio...
 
Function xTranslation(Lingua As Byte, NomeMaschera as string)
    Dim frm     As Access.Form
    Dim ctl     As Access.Control
 
    DoCmd.OpenForm "NomeMaschera", acDesign
    Set frm = Forms("NomeMaschera")
    For Each ctl In frm.Controls
        Select Case ctl.ControlType
            Case acLabel
                ' Logica di recupero della Caption esempio con il DLOOKUP...
                ctl.Caption = "Nuova Caption"
            Case Else
                ' Quello che serve
        End Select
    Next
    DoCmd.Close acForm, frm.Name, acSaveYes
End Function
 
@Alex