Newsgroup: it.comp.lang.visual-basic
Titolo: [?] problemi con eventi degli oggetti withevents

Salve a tutti, ho scoperto da poco la possibilita' di crere oggetti con eventi.
Vorrei sfruttare questa possibilita' per crearmi delle classi per gestire delle texbox e fare dei
controlli su di queste senza passare dalla form.
Un esempio, mi construisco una classe come di gestisca l'imput di un data su una textbox favendomi i
dovuti controlli di esattezza della data (questo gia' lo facevo ma direttamente sulla form).
A questo punto mi costruisco la mi a form creo due textbox, creo due oggetti istanziati dalla mia
classe e associo le textbox ai due oggetto, questi in fase di editing fanno il loro dovere alla
pefezione, tra cui controllare in uscita dal controllo, utilizzando l'evento Validate, l'esattezza
della data inserita.
A questo punto vorrei usare l'evento Validate della form per fare altri tipi di controlli, per
esempio vedere se la data1 e' maggiore di una data2.
Il problema e' che l'evento Validate della form viene eseguito prima di quello della classe e quindi
vengono prima controllate le due date se una e' maggiore dell'altra e soltanto dopo se il valore
inserito nella textbox e' esatto.
Io vorrei che avvenisse esattamenti il contrario, mi sapete dare un'idea di come fare?
Non ditemi di usare l'evento lostfocus perche' con questo in caso ci sia qualcosa di sbagliato nella
condizione controllata non permette di interrompere lo spostamento del fuoco.
Qui sotto vi posto il codice che ho scritto:
Form Form1
------------------------
Option Explicit
Dim data1 As clsTextData
Dim data2 As clsTextData
Private Sub Form_Load()
    Set data1 = New clsTextData
    Set data2 = New clsTextData
 
    Set data1.setTextBox = txtData1
    Set data2.setTextBox = txtData2
End Sub
Private Sub txtData1_Validate(Cancel As Boolean)
    Dim s As String
 
    If txtData1.Text > txtData2.Text Then
        s = "data1 > data2"
    Else
        s = "data2 > data1"
    End If
    Call MsgBox("Avviso", vbInformation + vbOKOnly, s)
End Sub
Private Sub txtData2_Validate(Cancel As Boolean)
    Dim s As String
 
    If txtData1.Text > txtData2.Text Then
        s = "data1 > data2"
    Else
        s = "data2 > data1"
    End If
    Call MsgBox("Avviso", vbInformation + vbOKOnly, s)
End Sub
-----------------------------------------
Classe clsTextData
-----------------------------------------
Option Explicit
Dim WithEvents objTextBox As TextBox
Dim formparent As Form
Public Property Set setTextBox(oggetto As TextBox)
    Set objTextBox = oggetto
    objTextBox.Tag = "D"
End Property
Public Property Get setTextBox() As TextBox
    setTextBox = objTextBox
End Property
' ****************************************************************************************
' *************                  EVENTI SUL OGGETTO objTextBox           *****************
' ****************************************************************************************
Private Sub objTextBox_GotFocus()
    Call lib.formattxt(objTextBox, LIB_VISUALIZZA_CAMPO)
End Sub
Private Sub objTextBox_KeyPress(KeyAscii As Integer)
    Call lib.formattxt(objTextBox, KeyAscii)
End Sub
Private Sub objTextBox_Validate(Cancel As Boolean)
 
    If lib.formattxt(objTextBox, LIB_CONTROLLA_CAMPO) = 1 Then
        Call MsgBox("Data errata" & vbCrLf & "ripetere l'inserimento", vbExclamation + vbOKOnly,
"ERRORE")
        Cancel = True
    End If
End Sub


Hai provato giocando un po' con la proprietà CauseValidation.
Potresti disabilitarlo per poi abilitarlo nella classe e generare l'evento
direttamente dalla classe.
E' la prima cosa che mi è venuta in mente.
Cmq faresti meglio a costruirti un controllo personalizzato.
Saluti