Newsgroup: it.comp.lang.visual-basic
Titolo: Salvare

Ho una form con diversi scontrolli: text, chkbox, optionbox etc.
Quando ne modifico 1 vorrei impostare una variabile SALVARE = true senza
intervenire sull'evento di ogni singolo elemento.
Come si fa?

 ha scritto nel messaggio
news:9se4vn$4ge$1...@news.flashnet.it...

intervenendo sull'evento di ogni singolo elemento :-)
Scherzi a parte, non e' proprio immediato... un tentativo puo' essere
questo:
crea una classe, ad esempio  "CControlsState", incolla il codice in fondo,
dopo "- BEGIN...", e nella tua form inserisci qualcosa del genere
Dim ControlsState As CControlsState
Private Sub Form_Load()
Set ControlsState= New CControlState
ControlsState.SaveState Me
End Sub
Private Sub cmdChiudi_Click()
If ControlsState.StateChanged(Me) Then MsgBox "Salvare?"
End Sub
la classe l'ho ricavata velocemente da tutt'altra cosa, per cui non e' il
massimo in quanto a stile e commenti...il sistema comunque, per quanto
"brutale", funzionicchia ed e' estendibile un po' a tutti i controlli
- BEGIN CLASS CControlsState -
Private clControls  As Collection
Public Function StateChanged(objForm As Form) As Boolean
Dim ctlTemp     As Control
Dim varCtlValue As Variant
Dim varCtlCheck As Variant
Dim bSkip       As Boolean
Dim strKey      As String
For Each ctlTemp In objForm.Controls
    bSkip = False
    strKey = ""
    Select Case TypeName(ctlTemp)
    Case "TextBox"
        varCtlValue = ctlTemp.Text
    Case "CheckBox", "OptionButton"
        varCtlValue = ctlTemp.Value
    Case "ListBox"
        varCtlValue = ctlTemp.ListIndex
    Case "ComboBox"
        If ctlTemp.Style = vbComboDropdownList Then
            varCtlValue = ctlTemp.ListIndex
        Else
            varCtlValue = ctlTemp.Text
        End If
    Case Else
        bSkip = True
    End Select
    If Not bSkip Then
        strKey = ctlTemp.Name
        On Local Error Resume Next
        'esiste un modo migliore per verificare se un
        'controllo e' parte di un array?
        strKey = strKey & "-" & ctlTemp.Index
        On Local Error GoTo 0
        varCtlCheck = clControls(strKey)
        If varCtlCheck <> varCtlValue Then
            StateChanged = True
            Exit For
        End If
    End If
Next
End Function
Public Sub SaveState(objForm As Form)
Dim ctlTemp     As Control
Dim varCtlValue As Variant
Dim bSkip       As Boolean
Dim strKey      As String
Set clControls = New Collection
For Each ctlTemp In objForm.Controls
    bSkip = False
    strKey = ""
    Select Case TypeName(ctlTemp)
    Case "TextBox"
        varCtlValue = ctlTemp.Text
    Case "CheckBox", "OptionButton"
        varCtlValue = ctlTemp.Value
    Case "ListBox"
        varCtlValue = ctlTemp.ListIndex
    Case "ComboBox"
        If ctlTemp.Style = vbComboDropdownList Then
            varCtlValue = ctlTemp.ListIndex
        Else
            varCtlValue = ctlTemp.Text
        End If
    Case Else
        bSkip = True
    End Select
    If Not bSkip Then
        strKey = ctlTemp.Name
        On Local Error Resume Next
        strKey = strKey & "-" & ctlTemp.Index
        On Local Error GoTo 0
        clControls.Add varCtlValue, strKey
    End If
Next
End Sub
- END CLASS CControlsState -
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

non  intervenire sugli eventi può allungare il lavoro che vorresti evitare.
sicuramente hai tanti controlli e non vuoi scrivere codice per tutti.
sbaglio?
se è così ti consiglio di creare un array di controlli, vedrai che ti
semplificherà il lavoro al 90%
fammi sapere.
Valerio
Lorenzo ha scritto:


 Ho una form con diversi scontrolli: text, chkbox, optionbox [...]
Anch'io una volta avevo una Form con tanti scontrolli: non ho dormito tutta
notte...
Io uso la cara vecchia variabile di modulo booleana. Sarò grezzo, ma...
Ciao,
Carlo.