Newsgroup: it.comp.lang.visual-basic
Titolo: [Bug]: Evento validate textbox in VB6

Create un nuovo progetto, aggiungete due textbox e inserite il seguente
codice
Private Sub Text1_Validate(Cancel As Boolean)
    MsgBox "Validate"
    Text1.Enabled = False
End Sub
Se entrate in text1 e poi ne uscite vedrete l'msgbox apparire due volte!!
L'impostazione della proprieta' Enabled all'interno dell'evento validate fa
fare il raise dell'evento una seconda volta.
Questo accade sia nell'IDE del VB che nel compilato definitivo
Non ho trovato da nessuna parte questo bug evidenziato.
CIAO
------------------------------------------------------------
+ Dott. Bruni Emiliano - Graduated in Physics +
------------------------------------------------------------
+ Cisco Certificated Designer Associate +
+ Software developer & Network Administrator +
+ Nick Handle: EB1346-RIPE BE1484 ICQ: #16774468 +
+ E-Mail: bruni at micso dot it +
+ Web: 
http://www.ebruni.it
 +
+----------------------------------------------------------+
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.426 / Virus Database: 239 - Release Date: 02/12/2002


-CUT-
Sei sicuro sia un bug?
Sarà casomai un evento poco gradito, talvolta ridondante...ma io penso che
sia una tra le più grosse invenzioni fra la 5 e la 6 il Validate!
Tutte le volte(tranne il bug del command button come dice anche nel librozzo
Balena!) che il controllo prende il focus...passa prima di abbandonarlo per
il validate...e siccome per "Disattivare qualcosa"...bisogna che "Questa
cosa sia attivata"...il tuo codice passa 2 volte dal validate...dov'è il
problema?
Suggerisco:
Private Sub Text1_LostFocus()
 Text1.Enabled = False
End Sub
Private Sub Text1_Validate(Cancel As Boolean)
    MsgBox "Validate"
End Sub
Un solo Validate!
Saluti e Buon Anno!

 End Sub
uhm... ma mettiamo che la disabilitazione del text box debba essere effettuata solo se il
contenuto ha "superato" il test contenuto nell'evento validate.... e che questo test sia
alquanto "pesante".
Temo che a quel punto la cosa possa essere risolta solo con una variabile static che
indichi se il contenuto è già stato validato... oppure si potrebbe vedere se anche
l'impostazione della proprietà locked comporta la doppia validazione (se così fosse
sarebbe decisamente la soluzione preferibile)
Salutoni
Sergio

 [Wodka4U(Nbook)]ha scritto:
Ehm!
Secondo me sono impostazioni "forma mentis"....non BUG!
Ossia sono scelte di progetto del programmatore!
Tu hai ragione ...Il dottore ha ragione [A dottò ho visto il
sito......mischi sesso e VB eh! Birichino!!!!:o) ]
però ho ragione anche io!
Nel senso che Voi fate la disattivazione e controlli pesi nel validate...io
ci metto poco solo controlli
"formali"(numero/lettere..formattazione...controllo tabella
opzioni...ricerca nel db se è un valore valido etc etc) e mai disattivo un
controllo all'utente!
L'Utonto odia scrivere in campi che li si disattivano mentre
scrive!...almeno questa è la mia esperienza...che di sicuro è diversa dalla
vostra....ma legittima come la vostra!
Per me (siccome son stato uTonto prima di programmatore) quando presento un
form deve essere già "completo"
.... se ha dei campi disattivi...son già disattivi!
Il massimo che ho fatto è un campo text che se ci scrivi attiva dei combobox
correlati....
Ma dai!... per me far scrivere l'utonto ed a un certo punto disattivarli
campi sotto il naso non mi piace!
I controlli "Pesanti" li faccio nel "salva"...se qualcosa non va:
 o si incazza
 o riporta il form con i textbox sbagliati colorati di giallo! Come nei form
di internet hai presente?
I miei uTonti apprezzano....capiscono subito dove è la digitazione
sbagliata...
Ma questa è la mia esperienza....
Saluti!
:o)

 wrote in message
news:YLdQ9.41758$Q%4.13...@news1.tin.it...



 fare il raise dell'evento una seconda volta.
La guida dice:
"Viene generato prima che lo stato attivo venga spostato su un (secondo)
controllo la cui proprietą CausesValidation č impostata su True."
L'evento validate di Text1 si verifica prima che "lo stato attivo venga
spostato...", ovvero lo stato attivo č ancora di Text1.
Basta mettere (per forzare un po' le cose) un Text2.SetFocus prima del
Text1.Enabled=False

 sbagliata...
Personalmente non consento di abbandonare un campo se non č corretto e
coerente col contesto, salvo per, ovviamente, vari bottoni di ricerca o di
abbandono.


Va bene ed infatti lo stato attivo e' ancora su Text1, sta per essere
spostato su Text2 e allora raise dell'evento Validate. Dentro all'evento
validate viene impostato l'enabled del controllo. Perche' viene fatto di
nuovo il raise del validate?
Paradossalmente questo codice
Private Sub Text1_Validate(Cancel As Boolean)
    MsgBox "Validate"
    Text1.Text = "pippo"
End Sub
produce un solo raise dell'evento (questo l'avrei accettata un po' di piu'
se me lo avesse fatto due volte). Se non e' un buco questo.


 nuovo il raise del validate?
Perchè la disabilitazione di Text1 (che è ancora il controllo attivo) avvia
un nuovo "stato di abbandono" dello stesso.

 vuole
Beh non e' proprio cosi'. Il campo in oggetto e' primary-key di una tabella.
Se l'utente inserisce un valore per la PK non presente nel DB va avanti e fa
l'inserimento di un nuovo record altrimenti, se inserisce nel textbox un
valore gia' presente nel DB, il form viene riempitocon i dati relativi al
record presente. Ovviamente la PK non puo' essere modificabile e quindi il
textbox viene disabilitato....in pseudo-codice
Private Sub Text1_Validate(Cancel As Boolean)
    if esisteRecordCheHaComePrimaryKey( Text1.text) then
        ValorizzaFormDaRecordConPrimaryKey(Text1.text)
        ImpostaStatoDocumento(modificaRecord)
    else
        ImpostaStatoDocumento(nuovoRecord)
    end if
End Sub
dove, tra le altre cose, ImpostaStatoDocumento(modificaRecord) fa
l'enabled=false della primary key ossia di Text1 stesso.
CIAO


 Beh non e' proprio cosi'. Il campo in oggetto e' primary-key di una
tabella.
Io facevo un discorso in generale, collegandomi a quanto detto da wodka.
Ovviamente il contesto specifico può/deve imporre altre modalità.

 se me lo avesse fatto due volte). Se non e' un buco questo.
Non ti seguo. Non è un buco. Questo codice non cambia le carte in tavola, ma
si limita ad assegnare una proprietà. Questo genera solo l'evento Change,
non cambia lo Screen.ActiveControl.
Ho la sensazione che tu stia mal interpretando il significato di alcuni
eventi.

 wrote in message
news:aurr9l$9l1ao$1...@ID-174464.news.dfncis.de...

Hai ragione...vista sotto questo aspetto la cosa assume una sua logica, un
po' contorta, ma comprensibile
Thanks.
