Newsgroup: it.comp.lang.visual-basic
Titolo: Ecco la seconda: controllo date

Ciao a tutti
rieccomi con una domandina facile facile...
ho una TextBox, con la proprieta' MaxLenght impostata a 10.
Vorrei controllare che in questa casella di testo, venissero inserite solo
delle date, la prima cosa che mi viene in mente e' di usare la funzione
IsDate nell'evento Validate della casella di testo... esempio
If Not IsDate (txtData.Text) Then .....
problema:
non mi scatta l'evento di controllo dentro il blocco If... Then
txtData.Text = 01/01/2006 OK
txtData.Text = 31/01/2006 OK
txtData.text = 01/31/2006 NOOOOO
non ho provato altre combinazioni, ma e' possibile ricevre True dalla
funzione IsDate solo se si inserisce la data nel formato "italiano"
(giorno-mese-anno)?
Grazie e ciao... Maurizio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 (giorno-mese-anno)?
ISDate ti dice solamente se il seguente CDate fallirà o meno.
L'interpretazione del valore, che eseguirà il CDate, è invece lasciata 
alle impostazioni locali, più tutta una serie di 'agevolazioni' che a 
me sembrano comunque minchiate.
Se vuoi testare che la data sia impostata in modalità italiana, l'unica 
è confrontare due variabili Date, una ricavata dal CDate del 
TextBox.Text, l'altra ricavata dal DateSerial con i vari Val(Mid$....
Se le due date sono uguali, allora la data è stata scritta in formato 
italiano.
Volendo semplificare, puoi anche convertire direttamente la data col 
DateSerial, e prenderla per buona, ma facendo così ti esponi a cose 
tipo 31/ nei mesi con meno di 31gg (che però forse vengono intercettate 
dal IsDate, quindi può essere che sia sufficiente).
Ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 IsDate nell'evento Validate della casella di testo... esempio
Usa un DateTimePicker (Microsoft Common Controls) al posto della textbox.
Ciao 

 (giorno-mese-anno)?
Concordo con Fabio sull'utilizzo del DateTimePicker, anche se purtroppo 
l'utilizzo di questo control implica un riferimento ad una libreria esterna 
Common Control 2 (con tutto quello che ne consegue).
Io, quando è possibile, evito l'utilizzo di oggetti di libreria, per 
svariati motivi.
Uno fra tanti: se sviluppi su un sistema in inglese, con VB in inglese, e 
distribuisci l'applicativo con il setup, l'utente finale italiano installerà 
un OCX in una lingua che non gli appartiene. Questo non accade sempre, il 
più delle volte l'utente ha già la libreria nella sua lingua, per cui non 
viene sovrascritta. Ma a volte capita che un sistema ne è sprovvisto, quindi 
prende per buona quella che viene insieme tuo applicativo e la installa nel 
sistema.
In questo caso, pur essendo lui italiano, ogni volta che aprirà il 
calendarietto del DateTimePicker leggerà scritto: "Today" al posto di 
"Oggi".   :-/
Ma, nel tuo caso, credo che non sia possibile farne a meno... il datepicker, 
salvo queste piccole rogne, è davvero utilissimo.
Ciao.
B. 


La funzione IsDate ti da' per valida la data 31/01/2006 ed anche la
data 01/31/2006.
Per fare quello che vuoi tu tu consiglio di utilizzare la seguente
funzione:
-------------------------------------------------------------------------------------------------------------
Public Function IsValidDate(Data As String) As Boolean
  ' Controlla la validità della data "Data" che arriva nel formato
(teorico) dd/mm/yyyy
  Dim dd     As String
  Dim mm     As String
  Dim yy     As String
  Dim Days(1 To 12) As Byte
  IsValidDate = True      ' default = data corretta
  ' Estrazione dd, mm, yy
  dd = Left$(Data, 2)
  mm = Mid$(Data, 4, 2)
  yy = Right$(Data, 4)
  ' I valori di giorno, mese e anno devono essere numerici
  If Not IsNumeric(dd) Then
    IsValidDate = False
    Exit Function
  End If
  If Not IsNumeric(mm) Then
    IsValidDate = False
    Exit Function
  End If
  If Not IsNumeric(yy) Then
    IsValidDate = False
    Exit Function
  End If
  ' Imposto i giorni della settimana
  Days(1) = 31
  Days(2) = 28
  Days(3) = 31
  Days(4) = 30
  Days(5) = 31
  Days(6) = 30
  Days(7) = 31
  Days(8) = 31
  Days(9) = 30
  Days(10) = 31
  Days(11) = 30
  Days(12) = 31
  ' Test se anno bisestile
  If yy Mod 4 = 0 Then Days(2) = 29
  ' test anno
  If yy = 0 Or yy < 1900 Then
    IsValidDate = False
    Exit Function
  End If
  ' test mese
  If mm < 1 Or mm > 12 Then
    IsValidDate = False
    Exit Function
  End If
  ' test giorno
  If dd < 1 Or dd > Days(mm) Then
    IsValidDate = False
    Exit Function
  End If
End Function
-----------------------------------------------------------------------------------------
La funzione riceve una data nel formato GG/MM/AAAA, ma la puoi
modificare per poter ricevere in ingresso una data formattata in modo
diverso.
Spero che ti possa risolvere il problema.
Ciao.
Nedi


  If yy Mod 4 = 0 Then Days(2) = 29
C'e' un errore nel calcolo del bisestile:
http://it.wikipedia.org/wiki/Anno_bisestile
hth,
Lokar