VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "CControl"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

Dim mForm As Form

' definizione de icontrolli VB su cui effettuare il multicast
Private WithEvents ctTextBox As TextBox
Attribute ctTextBox.VB_VarHelpID = -1
Private WithEvents ctFlatEdit As FlatEdit
Attribute ctFlatEdit.VB_VarHelpID = -1
'Private WithEvents ctLabel As Label
Private WithEvents ctComboBox As ComboBox
Attribute ctComboBox.VB_VarHelpID = -1
Private WithEvents ctComboXtr As XtremeSuiteControls.ComboBox
Attribute ctComboXtr.VB_VarHelpID = -1
Private WithEvents ctListBox As ListBox
Attribute ctListBox.VB_VarHelpID = -1
'Private WithEvents ctPushButton As PushButton
Private WithEvents ctReportControl As ReportControl
Attribute ctReportControl.VB_VarHelpID = -1
Private WithEvents ctPushButton As PushButton
Attribute ctPushButton.VB_VarHelpID = -1


Private Sub ctPushButton_Click()
   'If ctPushButton.Name = "CmdUTCC" Then
   '   Call fShowUTCC
   'End If
End Sub


'Public Function SetForm(pForm As Form) As Boolean
'   Set mForm = pForm
'End Function


' Metodo publico per passare il riferimento al singolo controllo del form
Public Function SetVbControl(oCtr As Object, pForm As Form) As Boolean
'Public Function SetVbControl(oCtr As Object) As Boolean
'   On Error GoTo gesterr

   Set mForm = pForm

   SetVbControl = True
   
'   If TypeOf oCtr Is Shape Then
'      Dim d As Shape
'      If oCtr.Name = "shpTop" Or oCtr.Name = "shpBottom" Then
'         oCtr.BackColor = CSSApp.gMenuBackColorPrimary
'      ElseIf oCtr.Name = "shpMaster" Then
'         oCtr.BackColor = CSSApp.gFormBackColor
'      End If
   
   If (TypeOf oCtr Is Label) Or (TypeOf oCtr Is XtremeSuiteControls.Label) Then
      If InStr(1, oCtr.Tag, "|ESCL|") Then Exit Function 'Se c'e' la "A" significa che lo devo escludere (questo per i campi a Matrice che non sono gestiti)
      
      oCtr.ForeColor = CSSApp.gTextForeColorStandard
      oCtr.Font.Name = CSSApp.gFontNameApp
      oCtr.Font.Size = CSSApp.gFontSizeApp
   
   
   ElseIf TypeOf oCtr Is PushButton Then
      If InStr(1, oCtr.Tag, "|ESCL|") Then Exit Function 'Se c'e' la "A" significa che lo devo escludere (questo per i campi a Matrice che non sono gestiti)
      
      'Dim f As PushButton
      If InStr(1, oCtr.Tag, "|DARK|") > 0 Then
         oCtr.Appearance = CSSApp.gCtrlAppearanceDark
      Else
         oCtr.Appearance = CSSApp.gCtrlAppearanceLight
      End If
      
      oCtr.Font.Name = CSSApp.gFontNameApp
      oCtr.Font.Size = CSSApp.gFontSizeApp
      
      
      If oCtr.Name = "CmdUTCC" Then
         'Set ctPushButton = oCtr
         
         oCtr.Appearance = xtpAppearanceFlat
         oCtr.FlatStyle = True
         oCtr.MousePointer = 16 'Mano
         'oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(5079, 24)
         oCtr.BackColor = oCtr.Container.BackColor
         oCtr.DrawFocusRect = False
         Exit Function
      
      ElseIf oCtr.Name = "CmdRefresh" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Refr, 24)
      
      ElseIf oCtr.Name = "CmdOrdina" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Sort, 24)
      
      ElseIf oCtr.Name = "CmdPrint" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Prin, 24)
         oCtr.Font.Size = 7
         
      ElseIf oCtr.Name = "CmdPrintSettings" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_PrtS, 24)
         oCtr.Font.Size = 7
      
      ElseIf oCtr.Name = "CmdAnalyze" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Anal, 24)
         oCtr.Font.Size = 7
         
      ElseIf oCtr.Name = "CmdExport" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Expo, 24)
         oCtr.Font.Size = 7
         
         
      ElseIf oCtr.Name = "CmdOK" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Save, 24)
         
      ElseIf oCtr.Name = "CmdRIGHT" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Righ, 24)
         
      ElseIf oCtr.Name = "CmdNEW" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID__PIU, 24)
         
      ElseIf oCtr.Name = "CmdDEL" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Dele, 24)
         
      ElseIf oCtr.Name = "CmdEDIT" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Edit, 24)
         
      ElseIf oCtr.Name = "CmdAnnulla" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Clos, 24)
         'oCtr.Font.Size = 7
      
      ElseIf oCtr.Name = "CmdRicerca" Then
         oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(icon_ID_Find, 24)
         oCtr.Font.Size = 7
      
      End If
      
      
      If InStr(1, oCtr.Tag, "|FIND|") > 0 Then
         oCtr.TextAlignment = xtpAlignMiddle + xtpAlignLeft
         oCtr.ImageAlignment = xtpAlignMiddle + xtpAlignLeft
         oCtr.Style = xtpButtonNormal
         oCtr.BorderGap = 5
         oCtr.ImageGap = 10
         'oCtr.Icon = MDIForm1.ImageManager.Icons.GetImage(5048, 16)
      End If
   
      'oCtr.ForeColor = CSSApp.gTextForeColorStandard
      'oCtr.BackColor = CSSApp.gMenuBackColorPrimary
   
   
   ElseIf (TypeOf oCtr Is TextBox) Or (TypeOf oCtr Is FlatEdit) Then
      'If InStr(1, oCtr.Tag, "A") Then Exit Function 'Se c'e' la "A" significa che lo devo escludere (questo per i campi a Matrice che non sono gestiti)
      If InStr(1, oCtr.Tag, "|ESCL|") Then Exit Function 'Se c'e' la "A" significa che lo devo escludere (questo per i campi a Matrice che non sono gestiti)
      
      oCtr.Font.Name = CSSApp.gFontNameApp
      oCtr.Font.Size = CSSApp.gFontSizeApp
      
      
      If (TypeOf oCtr Is TextBox) Then 'TEXT
         Set ctTextBox = oCtr
      
      Else 'FLATEDIT
         Set ctFlatEdit = oCtr
         'Qui faccio le prime impostazioni sul controllo laddove è possibile
            'Dim T As FlatEdit
            'T.Appearance =xtpAppearanceOffice2003'    xtpAppearanceOffice2013
            ctFlatEdit.Appearance = xtpAppearanceOffice2013 'CSSApp.gCtrlAppearanceLight
            
            'In questo caso si tratta di FlatEdit che contengono valori Percentuali
            If ctFlatEdit.Alignment = xtpEditAlignRight Then
               If InStr(1, ctFlatEdit.Tag, "%") > 0 Then
                  ctFlatEdit.SetMask SetMaskFlatEdit(ctFlatEdit, "mask"), SetMaskFlatEdit(ctFlatEdit, "literal", " "), " "
                  ctFlatEdit.Text = "0,00"
               End If
            End If
            
            'txtMaskedEdit.SetMask "Phone No: (000) 000-0000", "Phone No: (___) ___-____"
         
            'FlatEdit per le DATE
            If ctFlatEdit.Alignment = xtpEditAlignCenter Then
               If InStr(1, ctFlatEdit.Tag, "|T|") > 0 Then  'ORA
                  ctFlatEdit.SetMask "00:00", "__:__", "_"
                  ctFlatEdit.Text = ""
               Else                                         'DATA
                  ctFlatEdit.SetMask "00/00/0000", "__/__/____", "_"
                  ctFlatEdit.Text = ""
               End If
            End If
   
            'Se è il TxtFilter allora imposto la proprietà Text in modo appropriato
            If Mid(ctFlatEdit.Name, 1, 9) = "TxtFilter" Then
               ctFlatEdit.Text = "[Digita Filtro]"
            End If
      End If
      
      'oCtr.Appearance = CSSApp.gCtrlAppearanceLight 'xtpAppearanceVisualStudio2012Dark
      If oCtr.ForeColor <> CSSApp.gTextForeColorObbligo Then
         oCtr.ForeColor = CSSApp.gTextForeColorStandard
      End If
      
      If oCtr.Enabled Then
         oCtr.BackColor = CSSApp.gTextBackColorStandard
      Else
         oCtr.BackColor = CSSApp.gTextForeColorDisabled
      End If
      
      
   
   ElseIf (TypeOf oCtr Is ComboBox) Or (TypeOf oCtr Is XtremeSuiteControls.ComboBox) Then
      'If InStr(1, oCtr.Tag, "A") Then Exit Function 'Se c'e' la "A" significa che lo devo escludere (questo per i campi a Matrice che non sono gestiti)
      If InStr(1, oCtr.Tag, "|ESCL|") Then Exit Function 'Se c'e' la "A" significa che lo devo escludere (questo per i campi a Matrice che non sono gestiti)
      
      oCtr.Font.Name = CSSApp.gFontNameApp
      oCtr.Font.Size = CSSApp.gFontSizeApp
            
      If (TypeOf oCtr Is XtremeSuiteControls.ComboBox) Then 'Combo XTREME
         Set ctComboXtr = oCtr
         ctComboXtr.Appearance = CSSApp.gCtrlAppearanceLight

      Else 'ComboVB
         Set ctComboBox = oCtr
      
      End If
      
      oCtr.ForeColor = CSSApp.gTextForeColorStandard
      If oCtr.Enabled Then
         oCtr.BackColor = CSSApp.gTextBackColorStandard
      Else
         oCtr.BackColor = CSSApp.gTextForeColorDisabled
      End If
      
      
   ElseIf TypeOf oCtr Is ReportControl Then
      'If InStr(1, oCtr.Tag, "A") Then Exit Function 'Se c'e' la "A" significa che lo devo escludere (questo per i campi a Matrice che non sono gestiti)
      If InStr(1, oCtr.Tag, "|ESCL|") Then Exit Function 'Se c'e' la "A" significa che lo devo escludere (questo per i campi a Matrice che non sono gestiti)
      
      'Dim g As ReportControl
      Set ctReportControl = oCtr
      oCtr.VisualTheme = CSSApp.gCtrlVisualTheme
      ctReportControl.PaintManager.TextFont.Name = CSSApp.gFontNameApp '"CALIBRI"
      ctReportControl.PaintManager.TextFont.Size = CSSApp.gFontSizeApp
      ctReportControl.PaintManager.NoItemsText = ""
      ctReportControl.PaintManager.NoGroupByText = "Area di Raggruppamento (trascina qui le colonne su cui desideri effettuare un raggruppamento)"
            
'   ElseIf TypeOf oCtr Is ShortcutCaption Then
'
'      If InStr(1, oCtr.Tag, "|FC-BLACK|") Then 'significa che è uno Shortcut a cui devo cambiare il colore del Forecolor perchè di default è bianco ma a me serve nero
'         oCtr.ForeColor = &H5C3E2D 'Blu/Grigio Scuro    '&H404040  'grigio scuro
'      End If
      
      
   ElseIf TypeOf oCtr Is XtremeSuiteControls.TabControl Then
      'Dim t As XtremeSuiteControls.TabControl
      oCtr.Appearance = xtpTabThemeVisualStudio2012
      oCtr.Color = xtpTabColorVisualStudio2012
      oCtr.Font.Name = CSSApp.gFontNameApp
      oCtr.Font.Size = 9
      
   ElseIf TypeOf oCtr Is DockingPane Then
      'If InStr(1, oCtr.Tag, "A") Then Exit Function 'Se c'e' la "A" significa che lo devo escludere (questo per i campi a Matrice che non sono gestiti)
      If InStr(1, oCtr.Tag, "|ESCL|") Then Exit Function 'Se c'e' la "A" significa che lo devo escludere (questo per i campi a Matrice che non sono gestiti)
      
      'Dim g As ReportControl
      'Set ctReportControl = oCtr
      'oCtr.VisualTheme = CSSApp.gCtrlVisualTheme
      oCtr.VisualTheme = ThemeVisualStudio2012
      
      
   ElseIf TypeOf oCtr Is TabStrip Then
      oCtr.Font.Name = "Thaoma"
      oCtr.Font.Size = 10
      'Dim d As TabStrip
      'd.Font.Name
      
   ElseIf TypeOf oCtr Is MSFlexGrid Then
      oCtr.Font.Name = "Thaoma"
      oCtr.Font.Size = 9
      oCtr.BorderStyle = flexBorderNone
      oCtr.Appearance = flexFlat
      
   Else
      
'      'Qui controllo se si tratta degli Shortcup dell'Elelcno dell Form che mi serve che il Forecolor sia Blu _
'       e non Bianco (pur impostando il colore a DesignTime poi alla chiusura lo perde!)
'      If TypeOf oCtr Is ShortcutCaption Then
'         If InStr(1, oCtr.Tag, "|ELENCO|") Then
'            oCtr.ForeColor = &H8B4215
'         End If
'      End If
   
   '   MsgBox "Devi ampliare i controlli da gestire oppure saltare..."
      SetVbControl = False
   End If

End Function


'Private Sub ctPushButton_Click()
'   Dim lMyForm As Object
'   Dim lCtrFlat As Object
'
'   'Controllo se si tratta di un PushButton di selezione
'   If Len(Trim(ctPushButton.BuddyControl)) > 0 Then
'      'Set lCtrFlat = me.SetVbControl .BuddyControl
'      Set lMyForm = ctPushButton.Parent
'
'      If TypeOf lMyForm Is Form Then
'         MsgBox lMyForm.Name
'
'         ' Cicla tutti i controlli presenti nel form
'         For Each lCtrFlat In lMyForm
'
'            If lCtrFlat.Name = ctPushButton.BuddyControl Then
'
'               MsgBox lCtrFlat.DataField
'               Exit For
'               'Debug.Print
'            End If
'
'         Next
'
'      End If
'
'      'If TxtAnCodPag.Enabled = False Then Exit Sub
'      'Call RichiamaFormGriglia(Me, TxtAnCodPag, LblDesCodPag, "PAGAMENTI", "pagamenti", False, 2, "", "")
'      'TxtAnCodPag.SetFocus
'   End If
'
'End Sub



Private Sub ctflatedit_Change()

'   If Mid(ctFlatEdit.Name, 1, 9) = "TxtFilter" Then
'      If ctFlatEdit.Text = "[Digita Filtro]" Then
'         ctFlatEdit.ForeColor = vbInactiveCaptionText
'      Else
'         ctFlatEdit.ForeColor = vbButtonText
'      End If
'   End If

   'If InStr(1, ctTextBox.Tag, "N") Then
   If ctFlatEdit.Alignment = vbRightJustify Then
      'Call ControlloCampiNumero(KeyAscii, ctTextBox.Text, 0, ctTextBox)
      Call ChangeCampiNumerici(ctFlatEdit, ctFlatEdit.Text)
   End If


'''CAMPI NUMERICI (ALLINEAMENTO A DX)
'   If ctFlatEdit.Alignment = vbRightJustify Then
'      If InStr(1, TxtPrezzo.Tag, "%") > 0 Then 'Questo indica che un campo che accetta valori percentuali
'         ctFlatEdit.Text = Replace(ctFlatEdit.Text, " ", "")
'         If IsNumeric(ctFlatEdit.Text) = False Then ctFlatEdit.Text = "0"
'      End If
'   End If
End Sub
Private Sub ctflatedit_GotFocus()
   'Dim vLato As String 'il primo carattere sarà sempre "<" oppure ">" che indicano dove deve stare la parte fissa cioè a sinistra del testo editabile o a destra
   Dim vTestoFisso As String  'questo è il testo fisso
   Dim vVal As String

   'On Error GoTo gesterr
   
   If InStr(1, ctFlatEdit.Tag, "|!BC|") = 0 Then 'significa che NON devo colorare il BACKCOLOR
      ctFlatEdit.BackColor = ColorFocus(True)
   End If

   'vLato = Mid(ctlControl.DataFormat.Format, 1, 1) 'il primo carattere sarà sempre "<" oppure ">" che indicano dove deve stare la parte fissa cioè a sinistra del testo editabile o a destra
   vTestoFisso = Trim(Mid(ctFlatEdit.DataFormat.Format, 2)) 'questo è il testo fisso (usato ad esempio nei contratti per effettuare lo split di un articolo)

'CAMPI NUMERICI (ALLINEAMENTO A DX)
   If ctFlatEdit.Alignment = vbRightJustify Then
      
      'Se e' un campo numerico tolgo la formattazione
      ctFlatEdit.Text = Replace(ctFlatEdit.Text, " ", "")
      
      'vVal = IIf(Len(vTestoFisso) > 0, Mid(ctFlatEdit.Text, Len(vTestoFisso) + 1), ctFlatEdit.Text)
      If Len(vTestoFisso) > 0 Then
         vVal = Mid(ctFlatEdit.Text, Len(vTestoFisso) + 1)
      Else
         vVal = ctFlatEdit.Text
      End If
      
      
      'ctFlatEdit.Text = Replace(ctFlatEdit.Text, vTestoFisso, "",1,len()
      If IsNumeric(vVal) = False Then vVal = "0"
      ctFlatEdit = vTestoFisso & FormattaNumero(CDbl(vVal), ctFlatEdit.HelpContextID, 1)
   End If

   'Qui acquisisco il contenuto del Txt solo se si tratta di uno di quei campi dove poter fare ricerche
   If ctFlatEdit.ForeColor = CSSApp.gTextForeColorObbligo Then
      ContenutoTxtRicerca = ctFlatEdit
   End If

   If Mid(ctFlatEdit.Name, 1, 9) = "TxtFilter" Then
      If ctFlatEdit.Text = "[Digita Filtro]" Then ctFlatEdit.Text = ""
   End If
   
      
   'Controllo la DATA o l'ORA nei campi DATA/ORA (Campi con allineamento al CENTRO)
   If ctFlatEdit.Alignment = vbCenter Then
      If Len(Trim(ctFlatEdit.Text)) = 0 Then 'controllo che sia vuoto
         If InStr(1, ctFlatEdit.Tag, "|T|") > 0 Then   'qui Campo per ORA
            ctFlatEdit.Text = "__:__"
         Else                                            'qui Campo per DATA
            ctFlatEdit.Text = "__/__/____"
         End If
      End If
   End If
   
   
   Call SelezionaTesto(ctFlatEdit)
   
   
'NOTA: QUI SI VERIFICAVA L'ERRORE 91 A CAUSA DELLA MANCANZA DELLA dll "MSSTDFMT.dll" RICHIAMATA DALL'UTILIZZO DELLA _
       PROPRIETA' .DataFormat DEL FLATEDIT. IL PROBLEMA è CHE QUESTA DLL NON è PRESENTE IN TUTTI I PC.
       
'gesterr:
'   If Err.Number = 91 Then
'      Resume Next
'   ElseIf Err.Number <> 0 Then
'      'CHIUDO TUTTO E SUBITO!!!
'      End
'   End If
   
End Sub
Private Sub ctFlatEdit_KeyDown(KeyCode As Integer, Shift As Integer)
   Dim vPosVirg As Integer

'CAMPI NUMERICI (ALLINEAMENTO A DX)
   If ctFlatEdit.Alignment = vbRightJustify Then
      vPosVirg = InStr(1, ctFlatEdit.Text, ",")
      If vPosVirg > 0 Then
         If KeyCode = 110 Or KeyCode = 188 Then 'Punto o Virgola
            ctFlatEdit.SelStart = vPosVirg
            ctFlatEdit.SelLength = 0
         End If
      End If
   End If
   
End Sub
Private Sub ctFlatEdit_KeyPress(KeyAscii As Integer)
   If ctFlatEdit.Alignment = vbRightJustify Then
      Call ControlloCampiNumero(KeyAscii, ctFlatEdit.Text, ctFlatEdit.HelpContextID, ctFlatEdit)
   End If
   
   If InStr(1, ctFlatEdit.Tag, "|M|") Then
      Call Maiuscolo(KeyAscii)
   End If
End Sub
Private Sub ctFlatEdit_LostFocus()
   'Questo evento l'ho messo perchè ci sono delle condizioni in cui il Validate non si scatena

   '*** NOTA: VALUTARE SE METTERLO PER TUTTI GLI ALTRI CONTROLLI ***

   'Richiamo il Validate
   ctflatedit_Validate False
End Sub
Private Sub ctflatedit_Validate(Cancel As Boolean)
   'Dim vLato As String 'il primo carattere sarà sempre "<" oppure ">" che indicano dove deve stare la parte fissa cioè a sinistra del testo editabile o a destra
   Dim vTestoFisso As String  'questo è il testo fisso
   Dim vVal As String

   'On Error GoTo gesterr


   'vLato = Mid(ctlControl.DataFormat.Format, 1, 1) 'il primo carattere sarà sempre "<" oppure ">" che indicano dove deve stare la parte fissa cioè a sinistra del testo editabile o a destra
   vTestoFisso = Trim(Mid(ctFlatEdit.DataFormat.Format, 2)) 'questo è il testo fisso


   With ctFlatEdit

      If .Enabled = True Then
         If InStr(1, ctFlatEdit.Tag, "|!BC|") = 0 Then 'significa che NON devo colorare il BACKCOLOR
            .BackColor = ColorFocus(False)
         End If
      End If
   
   'CAMPI NUMERICI (ALLINEAMENTO A DX)
      'Se e' un campo numerico lo formatto
      If .Alignment = vbRightJustify Then
         .Text = Replace(.Text, " ", "")
         vVal = IIf(Len(vTestoFisso) > 0, Mid(ctFlatEdit.Text, Len(vTestoFisso) + 1), ctFlatEdit.Text)
      
         If IsNumeric(vVal) = False Then vVal = "0"
         ctFlatEdit = vTestoFisso & FormattaNumero(CDbl(vVal), .HelpContextID, IIf(InStr(1, .Tag, "F") > 0, 0, 1))
      End If
   
   
   'Qui controllo se un campo FILTRO
      If Mid(.Name, 1, 9) = "TxtFilter" Then
         If Len(Trim(.Text)) = 0 Then .Text = "[Digita Filtro]"
      End If
   
   
   
      'Controllo la DATA o l'ORA nei campi DATA/ORA (Campi con allineamento al CENTRO)
      If .Alignment = vbCenter Then
         
         If InStr(1, .Tag, "|T|") Then 'Se c'e' la "T" significa che un campo TIME (ORA)
            If .Text <> "__:__" Then
               .Text = ControllaOra(ctFlatEdit) 'Altrimenti e' sicuramente un campo ORA
               If .Text = "Errore" Then
                  .Text = "__:__"
                  Cancel = True
               End If
            Else
               .Text = ""
            End If
'            If Len(Trim(ctFlatEdit)) <> 0 Then
'               If Not IsDate(.Text) Then
'                  MsgBox "Ora errata", vbExclamation
'                  .Text = ""
'                  Cancel = True
'               Else
'                  ctFlatEdit = Format(ctFlatEdit, "hh:mm")
'               End If
'            End If
         Else
            If .Text <> "__/__/____" Then
               .Text = ControllaData(ctFlatEdit) 'Altrimenti e' sicuramente un campo DATA
               If .Text = "Errore" Then
                  .Text = "__/__/____"
                  Cancel = True
               End If
            Else
               .Text = ""
            End If
         End If
      
      End If

   
   
'      'Controlo se si tratta di un FlatEdit di Ricerca (con relativo PushBottom di Selezione)
'      If Len(Trim(.DataField)) > 0 Then
'         If InStr(1, ctFlatEdit.Tag, "|!RDC|") = 0 Then 'Questo idnica che NON devo eseguire la ricerca perchè lo faccio nel suo Evento VALIDATE per altri motivi
'
'            Dim vDescrizione As String
'            Dim ValoriTabella() As String
'            Dim vNomeCampoCodice As String
'            Dim vPos As Integer
'            Dim y As Byte
'
'            'Ciclo sui Controlli per verificare quali sono OBBLIGATORI
'            Dim ctlControl As Object
'            For Each ctlControl In mForm.Controls
'               If TypeOf ctlControl Is PushButton Then
'                  'Cerco il PushButton che abbia come valore di BuddyControl il Nome del FlatEdit su cui mi trovo
'                  If ctlControl.BuddyControl = .Name Then
'
'                        'verifico l'esistenza del Codice inserito
'                        If Len(.Text) <> 0 Then
'                           ReDim ValoriTabella(4) 'Dimensiono la matrice a 4 Indici: _
'                                                    0 = nome TABELLA _
'                                                    1 = nome CAMPO CODICE _
'                                                    2 = eventuale VALORE DI RICERCA da concatenare al valore del TEXT _
'                                                    3 = nome CAMPO DESCRIZIONE da prelevare
'                           ValoriTabella = Split(.DataField, "#")
'                           ValoriTabella(0) = Replace(ValoriTabella(0), "§CODAZ§", "") 'Pulisco il nome della Tabella
'
'                           'Faccio questo controllo perchè il II parametro con il campo codice potrebbe essere formato dalla CHIAVE+CODICE e quindi lo pulisco prendendo solo il nome del campo Codice
'                           For y = 1 To 3 'ciclo perchè ci sono casi in cui unisco 3 campi e quindi ci sono 2 '+'. per sicurezza faccio un ciclo a 3
'                              If InStr(vPos + 1, ValoriTabella(1), "+") > 0 Then
'                                 vPos = InStr(vPos + 1, ValoriTabella(1), "+")
'                              End If
'                           Next y
'                           vNomeCampoCodice = IIf(vPos > 0, Mid(ValoriTabella(1), vPos + 1), ValoriTabella(1))
'
'                           'Ricerco la DESCRIZIONE
'                           vDescrizione = DECOD_VALORE_CAMPO(ValoriTabella(0), ValoriTabella(1), ValoriTabella(2) & .Text, ValoriTabella(3), False, True, (.Alignment = vbRightJustify), vNomeCampoCodice, ctFlatEdit)
'                           'vDescrizione = DECOD_VALORE_CAMPO("ART_ICOL", "ARTIPART+ARCODICE", "ART" & .TextMatrix(i, 2), "ARGRUMER")
'
'                           If vDescrizione = "§null§" Then
'                              .Text = ""
'                              ctlControl.Caption = ""
'                              'Call VisualizzaMsgBoxPopUp("msg_exclamation", "ATTENZIONE!", "Valore non ammesso")
'                              'Call VisualizzaMsgBoxPopUp("msg_exclamation", "ATTENZIONE!", "Valore non ammesso")
'                              MsgBox "Valore non ammesso", vbExclamation
'                              Cancel = True
'                              'Exit Sub
'                           Else
'                              If InStr(1, ctlControl.Tag, "|!DES|") = 0 Then 'Controllo se è un Command che può accettare la descrizione
'                                 ctlControl.Caption = vDescrizione
'                              End If
'                           End If
'                        Else
'                           ctlControl.Caption = ""
'                        End If
'                        Exit For
'
'                  End If
'               End If
'            Next ctlControl
'
'         End If
'      End If
      
   
      If Cancel = True Then
         If (.Enabled = True) And (.Visible = True) Then .SetFocus
      End If
   End With
   
   

'NOTA: QUI SI VERIFICAVA L'ERRORE 91 A CAUSA DELLA MANCANZA DELLA dll "MSSTDFMT.dll" RICHIAMATA DALL'UTILIZZO DELLA _
       PROPRIETA' .DataFormat DEL FLATEDIT. IL PROBLEMA è CHE QUESTA DLL NON è PRESENTE IN TUTTI I PC.

'gesterr:
'   If err.Number = 5 Then
'      Resume Next
'   ElseIf err.Number <> 0 Then
'      MsgBox err.Number & " - " & err.Description, vbCritical
'   End If

End Sub




'Per tutti i TextBox
Private Sub ctTextBox_GotFocus()
   ctTextBox.BackColor = ColorFocus(True)

   'Se e' un campo numerico tolgo la formattazione
   If ctTextBox.Alignment = vbRightJustify Then
      ctTextBox = FormattaNumero(ctTextBox.Text, ctTextBox.HelpContextID, 1)
   End If
   
   Call SelezionaTesto(ctTextBox)
   
   'Qui acquisisco il contenuto del Txt solo se si tratta di uno di quei campi dove poter fare ricerche
   If ctTextBox.ForeColor = CSSApp.gTextForeColorObbligo Then
      ContenutoTxtRicerca = ctTextBox
   End If
End Sub
Private Sub ctTextBox_LostFocus()
   If ctTextBox.Enabled = True Then ctTextBox.BackColor = ColorFocus(False)
  
   'Se e' un campo numerico lo formatto
   If ctTextBox.Alignment = vbRightJustify Then
      If ctTextBox.Text = "-" Then ctTextBox.Text = "0"
      
      ctTextBox = FormattaNumero(ctTextBox.Text, ctTextBox.HelpContextID, IIf(InStr(1, ctTextBox.Tag, "F") > 0, 0, 1))
   End If
End Sub
Private Sub ctTextBox_Validate(Cancel As Boolean)
   Dim MancaObbligatorio As Boolean
    
'   'VERIFICO SE E' UN CONTROLLO OBBLIGATORIO _
'    Se il Testo e' di colore Blu (&HC00000) e c'e' nel TAG il simbolo "!" significa che e' un campo obbligatorio! _
'    La doppia combinazione mi serve perche' a volte non devo controllare il campo pur essendo obbligatorio come _
'    quando entro in un form che si imposta in INTERROGA e devo poter lasciare libiri i campi che devo essere obbligatori _
'    solo se sto CARICANDO o MODIFCANDO.
'   If ctTextBox.ForeColor = CSSApp.gTextForeColorObbligo And InStr(1, ctTextBox.Tag, "!") Then
'      Select Case ctTextBox.Alignment
'         Case vbRightJustify  'NUMERICO
'            If CDbl(ctTextBox.Text) = 0 Then Cancel = True
'         Case Else 'vbLeftJustify(STRINGA); vbCenter(DATA)
'            If Len(Trim(ctTextBox.Text)) = 0 Then Cancel = True
'      End Select
'      If Cancel = True Then
'         Call VisualizzaMsgBoxPopUp("msg_exclamation", "ATTENZIONE!", "Campo obbligatorio")
'      End If
'   End If
   
   
   'Controllo la DATA o l'ORA nei campi DATA/ORA (Campi con allineamento al CENTRO)
   If ctTextBox.Alignment = vbCenter Then
      
      If InStr(1, ctTextBox.Tag, "T") Then 'Se c'e' la "T" significa che un campo TIME (ORA)
         If Len(Trim(ctTextBox)) <> 0 Then
            If Not IsDate(ctTextBox.Text) Then
               'MsgBox "Ora errata", vbExclamation
               'Call VisualizzaMsgBoxPopUp("msg_exclamation", "ATTENZIONE!", "Ora errata")
               MsgBox "Ora errata", vbExclamation
               ctTextBox.Text = ""
               Cancel = True
            Else
               ctTextBox = Format(ctTextBox, "hh:mm")
            End If
         End If
      Else
         ctTextBox.Text = ControllaData(ctTextBox) 'Altrimenti e' sicuramente un campo DATA
         If ctTextBox.Text = "Errore" Then
            ctTextBox.Text = ""
            Cancel = True
         End If
      End If
   
   End If


   'Qui pulisco il contenuto della variabile ContenutoTxtRicerca cosi' da non avere problemi _
    in caso di codice inesistente. Senza questo codice capitava che se avevo caricato un codice, esempio 1, _
    e poi selezionavo un codice isistente per ridigitare succ. il codice 1 questi non veniva caricato perhce' _
    nell'evento Validate dei controlli c'e' il controllo per evitare di ricaricare un codice gia' caricato
   If ctTextBox.ForeColor = CSSApp.gTextForeColorObbligo Then
      ContenutoTxtRicerca = ""
   End If

End Sub
Private Sub ctTextBox_KeyPress(KeyAscii As Integer)
   If ctTextBox.Alignment = vbRightJustify Then
      Call ControlloCampiNumero(KeyAscii, ctTextBox.Text, ctTextBox.HelpContextID, ctTextBox)
   End If
   
   If InStr(1, ctTextBox.Tag, "|M|") Then
      Call Maiuscolo(KeyAscii)
   End If
End Sub
Private Sub ctTextBox_Change()
   'If InStr(1, ctTextBox.Tag, "N") Then
   If ctTextBox.Alignment = vbRightJustify Then
      'Call ControlloCampiNumero(KeyAscii, ctTextBox.Text, 0, ctTextBox)
      Call ChangeCampiNumerici(ctTextBox, ctTextBox.Text)
   End If
End Sub


'Per tutti i ComboBox
Private Sub ctComboBox_GotFocus()
  ctComboBox.BackColor = ColorFocus(True)
End Sub
Private Sub ctComboBox_LostFocus()
  If ctComboBox.Enabled = True Then ctComboBox.BackColor = ColorFocus(False)
End Sub

'Per tutti i ComboBox XTREME
Private Sub ctComboXtr_GotFocus()
  ctComboXtr.BackColor = ColorFocus(True)
End Sub
Private Sub ctComboXtr_LostFocus()
  If ctComboXtr.Enabled = True Then ctComboXtr.BackColor = ColorFocus(False)
End Sub

'Per tutti i ListBox
Private Sub ctListBox_GotFocus()
  ctListBox.BackColor = ColorFocus(True)
End Sub
Private Sub ctListBox_LostFocus()
  'ctComboBox.BackColor = ColorFocus(False)
  If ctListBox.Enabled = True Then ctListBox.BackColor = ColorFocus(False)
End Sub


'Private Sub ctTextBox_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'    ShowToolTips ctTextBox, ctTextBox.Tag
'End Sub
'Private Sub ctLabel_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'    ShowToolTips ctLabel, ctLabel.Tag
'End Sub

'Public Sub ShowToolTips(ByRef ctl As Control, ByVal s As String)
'  ctl.ToolTipText = s
'End Sub


Private Function ColorFocus(ByVal bOnFocus As Boolean) As Long
  If bOnFocus Then
    'ColorFocus = &HC0FFFF
    ColorFocus = CSSApp.gTextBackColorOnFocus
  Else
'    ColorFocus = CSSApp.gTextBackColorStandard
    ColorFocus = CSSApp.gTextBackColorStandard
  End If
End Function


Private Function ControlloCampiNumero(Tasto As Integer, ContenutoTXT As String, Decimali As Byte, Optional Controllo As Object)
   Dim char As String       '(Valore del Tasto premuto, Contenuto del text, Quanti decimali accettare)
   Dim PosVirgola As Byte
   Dim Virgola As Boolean
   
   'evito l'inserimento dello ZERO se c'e' solo uno ZERO
   If ContenutoTXT = "0" And Tasto = 48 Then  'ancora 0
      Tasto = 0
      Controllo.SelStart = 1
      Exit Function
   End If

'************************************************************

   'Qui verifico se far usare la virgola o meno
   If Decimali = 0 Or Decimali = 255 Then
      Virgola = False
   Else
      Virgola = True
   End If


   'se c'è lo 0 e digito la virgola allora mi posiziono all fine del txt altrimenti non riesco a scrivere i numeri con la virgola
   If Virgola = True Then
      If ContenutoTXT = "0" And Tasto = 46 Then  'ancora 0
         Tasto = 0
         Controllo = "0,"
         Controllo.SelStart = 2
         Exit Function
      End If
   End If


   'char = Chr(tasto)
   If Tasto >= 48 And Tasto <= 57 Then 'Se >= di 0 e <= di 9
      Tasto = Tasto

   'Se il tasto premuto è un numero....

   '***   09/12/2001   ***
      'If InStr(1, Controllo.Tag, "E") > 0 Then 'controllo se c'e la "E" significa che nel campo e' espresso un importo
         If Controllo.SelLength = 0 Then
            PosVirgola = InStr(1, ContenutoTXT, ",")
            If PosVirgola > 0 Then  'se c'è la Virgola...
               'If Len(Mid(ContenutoTXT, PosVirgola)) = 3 Then 'controllo quanti caratteri ci sono dalla Virgola in poi (..,xx) Quindi se sono 3 significa che ci sono già 2 decimali dopo la virgola!!
               If Len(Mid(ContenutoTXT, PosVirgola)) = (Decimali + 1) Then 'controllo quanti caratteri ci sono dalla Virgola in poi (..,xx) Quindi se sono 3 significa che ci sono già 2 decimali dopo la virgola!!
                  Tasto = 0
                  Beep
                  Exit Function
               End If
            End If
         End If
      'End If
   '**********************


      'Qui controllo che non si stia tentando di scrivere numeri alla sinistra del segno "-" negativo
      If Controllo.SelStart = 0 And Controllo.SelLength = 0 And InStr(1, ContenutoTXT, "-") > 0 Then
         Tasto = 0   'non scrivo niente
         'Controllo.SelStart = Len(Controllo.Text)
      End If
      '**********************
      
   
   ElseIf Tasto = 44 Then    'VIRGOLA
      If Virgola = True Then 'Controllo se nel campo si deve poter scrivere la virgola oppure e' un numero intero
         If Len(ContenutoTXT) > 0 Then
            If InStr(1, ContenutoTXT, ",") < 1 Then 'se non c'è già...
               Tasto = Tasto
            Else
               Tasto = 0   'altrimenti non scrivo niente
            End If
         Else
            Tasto = 0   'altrimenti non scrivo niente
         End If
      Else
         Tasto = 0   'altrimenti non scrivo niente
      End If


   ElseIf Tasto = 46 Then    'se PUNTO....
      If Virgola = True Then 'Controllo se nel campo si deve poter scrivere la virgola oppure e' un numero intero
         If Len(ContenutoTXT) > 0 Then
            If InStr(1, ContenutoTXT, ",") < 1 Then 'se non c'è già...
               Tasto = 44          'lo faccio diventare virgola
            Else
               Tasto = 0   'altrimenti non scrivo niente
            End If
         Else
            Tasto = 0   'altrimenti non scrivo niente
         End If
      Else
         Tasto = 0   'altrimenti non scrivo niente
      End If


   ElseIf Tasto = 45 Then    'SEGNO "-" per i numeri negativi
      If InStr(1, Controllo.Tag, "-") > 0 Then 'Controllo se è un campo che prevede il segno negativo
         If Len(ContenutoTXT) > 0 Then
            If ContenutoTXT <> "-" Then 'questo controllo serve per evitare che si possa scrivere "--"
               If CDbl(ContenutoTXT) = 0 Then
                  Tasto = 0   'devo comunque annullare l'inserimento altrimenti avviene due volte
                  Controllo.Text = "-"
                  Controllo.SelStart = Len(Controllo.Text)
               Else
                  If InStr(1, ContenutoTXT, "-") < 1 Then 'se non c'è già...
                     Tasto = 0   'devo comunque annullare l'inserimento altrimenti avviene due volte
                     Controllo.Text = "-" & Controllo.Text
                     Controllo.SelStart = Len(Controllo.Text)
                  Else
                     Tasto = 0   'altrimenti non scrivo niente
                  End If
               End If
            Else
               Tasto = 0   'altrimenti non scrivo niente
            End If
         Else
            Tasto = 0   'altrimenti non scrivo niente
         End If
      Else
         Tasto = 0   'altrimenti non scrivo niente
      End If


   ElseIf Tasto = 43 Then    'se +
      If InStr(1, Controllo.Tag, "-") > 0 Then 'Controllo se è un campo che prevede il segno negativo
         If InStr(1, ContenutoTXT, "-") > 0 Then 'se non c'è già...
            Tasto = 0   'devo comunque annullare l'inserimento altrimenti avviene due volte
            Controllo.Text = Replace(Controllo.Text, "-", "")
            Controllo.SelStart = Len(Controllo.Text)
         Else
            Tasto = 0   'altrimenti non scrivo niente
         End If
      Else
         Tasto = 0   'altrimenti non scrivo niente
      End If
   
   
   ElseIf Tasto = 8 Then    'se tasto cancella
      Tasto = Tasto

   Else
      Tasto = 0   'altrimenti non scrivo niente
   End If

End Function

Private Function ChangeCampiNumerici(Tasto As Object, ContenutoTXT As String)
   Dim char As String
   Dim ValoreOLD As Double

   'controllo che il txt non sia vuoto
   If Len(Trim(ContenutoTXT)) = 0 Then
      Tasto = "0"
      'Exit Function
      GoTo salta
   Else

'   'controllo che non venga scritto "01..."
'   If Mid(Trim(ContenutoTXT), 1, 1) = 0 And Mid(Trim(ContenutoTXT), 2, 1) <> "," Then
'         Tasto = "0"
'         'Exit Function
'         GoTo salta
'      End If
   End If

   'controllo che non sia inserito sola la virgola
   If ContenutoTXT = "," Then
      Tasto = "0"
      'Exit Function
      GoTo salta
   End If

   'controllo che non sia inserito sola la virgola e 0
   If ContenutoTXT = ",0" Then
      Tasto = "0"
      'Exit Function
      GoTo salta
   End If

   
   If Tasto.Text = "0," Or Tasto.Text = "0,0" Or Tasto.Text = "0,00" Or Tasto.Text = "0,000" Then
      GoTo salta
   End If
   
   
'=== Se arriva qui allora signific ache devo selezioanre tutto il contenuto del campo ===
         If IsNumeric(Tasto.Text) Then
            If CCur(Tasto.Text) = 0 Then
               Call SelezionaTesto(Tasto)
            End If
         End If

   'Se arrivo qui significa che ho scritto un numero senza problemi _
    quindi posso uscire altrimenti mi si sposta il cursore
   Exit Function

salta:
   'Mi posiziono alla Fine del text
   If CCur(Tasto.Text) <> 0 Then
      Tasto.SelStart = Len(Tasto.Text)
   End If

'   'controllo che non sia inserito sola la virgola e 0
'   If ContenutoTXT = "-" Then
'      Tasto = "0"
'      Exit Function
'   End If

End Function


Private Sub SelezionaTesto(ByRef Ctl As Control)
   On Error Resume Next
   
   Ctl.SelStart = 0
   Ctl.SelLength = Len(Ctl.Text)

   On Error GoTo 0
End Sub

Private Function Maiuscolo(Tasto As Integer)
   Dim char As String
   
   'If InStr(1, tasto.tag, "-") > 0 Then 'se non c'è già...
      char = Chr(Tasto)
      Tasto = Asc(UCase(char))
   'End If
End Function


'Public Function ControllaData(ByVal LaData As Variant) As String
'   'Permette anche l'inserimento della data nel formato GGMMAA.
'   Dim NoGood As Boolean
'   Dim vStrEmpty As String
'
''   'Qui decido il tipo di stringa vuota che cambia se si tratta di un FlatEdit formattato o un TextBox non formattato _
''    Questo almeno finchè non sostituisco tutti i TextBox con i Flatedit formattati (SetMask)
''   If TypeOf LaData Is FlatEdit Then
''      vStrEmpty = "__/__/____"
''   Else
''      vStrEmpty = ""
''   End If
'
'   NoGood = False
'
'   'Qui decido il tipo di stringa vuota che cambia se si tratta di un FlatEdit formattato o un TextBox non formattato _
'    Questo almeno finchè non sostituisco tutti i TextBox con i Flatedit formattati (SetMask)
'   If TypeOf LaData Is FlatEdit Then
'
'      If LaData <> "__/__/____" Then
'         If IsDate(LaData) Then
'            LaData = Format(LaData, "dd/mm/yyyy")
'         Else
'            If LaData = "0_/__/____" Then
'               LaData = Format(Date, "dd/mm/yyyy")
'            Else
'
'               'Se è vuoto esco subito tanto poi sarà formattato
'               If Len(Trim(LaData)) = 0 Then
'                  Exit Function
'               End If
'
'               'Innanzitutto controllo che nel giorno e nel Mese ci siano caratteri validi (quindi senza "_")
'               If InStr(1, Mid(LaData, 1, 6), "_") > 0 Then
'                  NoGood = True
'                  GoTo Salta
'               End If
'
'               'Qui controllo che il MESE sia un nuomero valido (così aggiro anche il problema che VB inverte autnomamente giorno e mese ed accetta cnhe le date 11/15 trasformadola in 15/11)
'               If Not (Mid(LaData, 4, 2) >= 1 And Mid(LaData, 4, 2) <= 12) Then
'                  NoGood = True
'                  GoTo Salta
'               End If
'
'               'Qui verifico che se l'anno è vuoto (quindi "____") sostituendolo con l'Annogestione la data sia valida
'               If Mid(LaData, 7, 4) = "____" Then
'                  LaData = Replace(LaData, "____", AnnoGestione)
'                  If IsDate(LaData) = False Then
'                     NoGood = True
'                  End If
'                  GoTo Salta
'               End If
'
'               'Qui verifico che se le ultime due cifre dell'anno sono vuoto (quindi "20__") sostituendolo con l'Annogestione la data sia valida
'               If Right(LaData, 2) = "__" Then
'                  LaData = Format(Replace(LaData, "_", ""), "dd/mm/yyyy")
'                  If IsDate(LaData) = False Then
'                     NoGood = True
'                  End If
'                  GoTo Salta
'               End If
'
'               'Se arriva qui faccio semplicemente il controllo sulla data
'               If IsDate(LaData) = False Then
'                  NoGood = True
'               End If
'               GoTo Salta
'
'            End If
'         End If
'
'      Else
'
'         LaData = ""
'         Exit Function
'
'      End If
'
'   Else  '...TextBox
'
'      If LaData <> "" Then
'         If IsDate(LaData) Then
'            LaData = Format(LaData, "dd/mm/yyyy")
'         Else
'            If LaData = "0" Then
'               LaData = Format(Date, "dd/mm/yyyy")
'            Else
'               If Len(LaData) = 4 Then
'                  LaData = Left(LaData, 2) & "/" & Right(LaData, 2) & "/" & AnnoGestione
'                  If IsDate(LaData) Then
'                     LaData = Format(LaData, "dd/mm/yyyy")
'                  Else
'                     NoGood = True
'                  End If
'               ElseIf Len(LaData) = 6 Then
'                  LaData = Left(LaData, 2) & "/" & Mid(LaData, 3, 2) & "/" & Right(LaData, 2)
'                  If IsDate(LaData) Then
'                     LaData = Format(LaData, "dd/mm/yyyy")
'                  Else
'                     NoGood = True
'                  End If
'               ElseIf Len(LaData) = 8 Then
'                  LaData = Left(LaData, 2) & "/" & Mid(LaData, 3, 2) & "/" & Right(LaData, 4)
'                  If IsDate(LaData) Then
'                     LaData = Format(LaData, "dd/mm/yyyy")
'                  Else
'                     NoGood = True
'                  End If
'               Else
'                  NoGood = True
'               End If
'
'               'If NoGood Then
'               '   MsgBox "Data errata!", vbExclamation, "ATTENZIONE"
'               '   LaData = "Errore"
'               'End If
'
'            End If
'         End If
'
'      Else
'
'         LaData = ""
'         Exit Function
'
'      End If
'
'   End If
'
'Salta:
'
'   If NoGood = True Then
'      MsgBox "Data errata!", vbExclamation, "ATTENZIONE"
'      LaData = "Errore"
'   Else
'      'Qui effettuo un ulteriore controllo giusto per rvitare che la data non abbia un valore valido ma totalmente fuori senso
'      If Year(LaData) < 1900 Or Year(LaData) > 2100 Then
'         NoGood = True
'         GoTo Salta
'      End If
'   End If
'
'   ControllaData = LaData
'
'End Function








