Newsgroup: it.comp.lang.visual-basic
Titolo: X Ivan, scusate.

Che casino!
Ho messo il controllo non nel Private Sub Text3_Change() onde ottenere un 
controllo in tempo reale cel campo Text3 (il CAP) ma all'intenro della Sub 
Command1_click()  e temo sia sbagliato.
In pratica seguendo le tue preziose e cortesi informazioni  ho strutturato 
il programma di esempio come mi hai indicato però vorrei controllare la 
validità del campo (in questo caso l'ho chiamato CAP) subito dopo il suo 
inserimento e non quando premo il tasto "conferma".
Mi fa male la testa....
Scusate se ho stravolto la netiquette...
(G)


Ciao Guido, allora vedo che inizi a muoverti un pò autonomamente ed allora 
vediamo qualche concetto nuovo.
Ebbene si, se tu volessi controllare la validità del campo già mentre questo 
è in digitazione ovviamente la Sub Command1_Click non è la piu adatta, come 
ti spiegavo il programma và alla SUB COMMAND1_CLICK appunto al seguito di un 
click nel pulsante, L'evento che ti sevrve invece è proprio Private Sub 
Text3_Change() infatti per ogni modifica che si apporti alla text3 a livello 
di digitazione caratteri, provoca un salto a tale routine.
Supponiamo che tu voglia controllare che il CAP raggiunga ad esempio la 
lunghezza di 5 caratteri altrimenti il pulsante Command viene disabilitato 
ovvero:
Command1.Enabled = False
Tu dovresti scrivere una cosa del genere nella SUB Text3_Change:
Private Sub Text3_Change()
If  Len(Text3.Text) < 5 then
Command1.Enabled = False
Else
Command1.Enabled = True
End if
End Sub
Nel codice qui sopra in pratica abbiamo detto: nella Text3, se la lunghezza 
in caratteri e minore di 5 disabilita la proprietà  .Enabled  del Command1 
ponendola su False, altrimenti abilitala ponendola su True
Ti spiego come raggiungere e modificare le proprietà da codice, la sintassi 
è NomeComando.NomeProprietà = Valore.
Un pò di esempi di modifica di  varie proprietà da linguaggio cioè in 
RunTime, naturalmente ogni controllo ha le sue, io tengo come esempio il 
Command1 per ora:
Command1.Enabled = True : Rem Abilita il pulsante, per disabilitare il 
valore si imposta su False
Command1.Visible = True : Rem Rendo un pulsante visibile True, oppure 
invisibile False
Command1.Caption = "Salve" : Rem Cambio la scritta del pulsante direttamente 
in RunTime quando mi pare e piace
Tuttavia si può anche controllare in che stato si trova un determinata 
proprietà:
IF Command1.Visible = True Then
Fai questo
Else
Fai Quello
end if
oppure
IF Command1.Enabled= True  Then
Fai questo
Else
Fai quello
End If
Una piccola precisazione, dopo che nella SUB Text3_Change avrai inserito il 
codice che ti ho suggerito resta ancora un piccolo particolare, se vuoi che 
il pulsante Command parta già disabilitato, cioè non cliccabile hai 2 
possibili strade:
1) Se vuoi modifica la proprietà nel modo consueto, cioè a programma fermo, 
piu precisamente Seleziona il Command1 e con il tasto destro del mouse fai 
Proprietà cerca Enabled e ponilo su False (Falso) quindi salva il progetto, 
si può fare questo perchè VB6 si ricorda anche lo stato di partenza di una 
proprietà a programma fermo quindi già avviando il programma il pulsante è 
disabilitato se tu lo hai fatto dalle proprietà e poi hai salvato il 
progetto.
2) Per la seconda strada scopriamo insieme gli Eventi di una Form, fai 
questa prova è importante per il tuo apprendimento, sempre mentre sei in 
fase di progettazione (programma fermo) doppioclicca in un punto vuoto della 
Form (cioè su nessun oggetto) e ti si apre la finestra eventi della Form, 
osserva quanti eventi possono essere intercettati anche in una form, per ora 
ti spiego i primi e fondamentali 3 cioè:
(A) Activate  ' questo evento si scatena ogni volta che tu attivi una form 
ad esempio stavi lavorando su un altra finestra anche di un programma non VB 
e tu riattivi (Activate) la tua fom cliccandoci sopra per compiere un 
qualsiasi operazione.
(B) Load ' questo evento si scatena ogni volta che viene caricata 
fisicamente la form in memoria nel tuo caso quando avvierai con F5 il 
programma.
(C) Unload ' questo evento si scatena quando viene scaricata fisicamente la 
form in memoria esempio:  cliccando ad esempio il relativo pulsante di 
chiusura.
Dicevamo il tuo pulsante dovrebbe partire già disabilitato, infatti questo 
secondo metodo disabilita da codice il pulsante e siccome noi vorremmo che 
questo accada in RunTime ed al caricamento della form fisicamente in memoria 
l'evento che ci interessa è appunto Load, ed è li che puoi disabilitare il 
tuo pulsante in alternativa.
Quindi cosi:
Private Form1_Load()
Command1.Enabled = False
End Sub
Ricorda quindi, l'evento Load  si scatena una volta sola al caricamento 
fisico della form, se avessimo inserito la stessa cosa in Activate invece si 
disabiliterebbe il pulsante anche solo se ti sposti a lavorare su un altro 
programma e poi torni sulla tua finestra che avevi solo ridotto ad icona 
magari comportamento che non credo faccia al nostro caso.
Fammi sapere eventualmente cosa volevi controllare nella Text del CAP.
Ivan 

 inserimento e non quando premo il tasto "conferma".
Tu continui a regionare da vecchio GWBasichista ;)
Quello che vuoi fare tu ti porterà inevitabilmente a frustranti mal di
testa.
La validazione dei dati è buona norma farla tutta alla fine, in una sola
sub.
Questo evita
- continue messagebox all'utente (che alla terza spegne il PC e usa il
blocchetto dei post-it)
- a te di arrotolarti in programmazione carpiata per validare in tempo reale
i valori mantenendo usabile l'interfaccia
- di disperdere la logica di verifica in 80 punti diversi nel programma
Eventualmente se proprio vuoi puoi sfruttare l'evento Validate di ogni
controllo e lì decidere se il dato è corretto oppure no.
Questo si scatena un attimo prima della perdita di fuoco del controllo, cioè
quando l'utente sta uscendo dal controllo con il cursore.
Ciao
--
Reporting tool: 
http://www.neodatatype.net

 ha scritto nel messaggio 
news:43675b53$0$13353$4faf...@reader2.news.tin.it...

Grazie Zanna, l'evento Validate non lo avevo carpito nella sua essenza 
ovvero non credevo si scatenasse prima di LostFocus che invece utilizzavo io 
per poi rimettere il fuoco con SetFocus, anche io oggi apprendo una cosa 
nuova, mi ero sempre chiesto cosa fosse questo Validate, inoltre sono 
perfettamente daccordo con la tua politica anti messagebox, anche io tento 
sempre di emetterne il meno possibile, perchè secondo me un programma non 
intelligente che ad esempio ti lascia immettere caratteri alfanumerici dove 
andrebbero solo numeri, per poi dirti ''errore sono accettati solo numeri" 
mi fa venire il mal di fegato, io personalmente se l'utente immette un 
carettere ad esempio in una textbox che accetta solo numeri, io leggo sempre 
l'utimo inserito a destra con il Change e se non rientra nel campo di 
validità lo cancello da codice invece di emettere inutili e fastidiose 
messagebox.
 

 non rientra nel campo di validità lo cancello da codice...
Ti consiglio di usare la KeyPress anziché la Change. Se il
carattere (che ti arriva come KeyAscii) non è "buono" assegni
KeyAscii = 0 lo annulli ed è come non avesse premuto nulla.
Sempre con la KeyPress, puoi intercettare il <CR> (Invio) con
(If KeyAscii = 13) ed usarlo per passare al campo successivo o
(se sei sull'ultimo campo) per validare il tutto e chiudere
l'intera finestra.
Ciao.
Mauro 

 ha scritto nel messaggio 
news:QTJ9f.17876$65.5...@twister1.libero.it...

Grazie a tutti voi per le preziose indicazioni.
Per favore mi spieghi meglio questo punto del "KeyPress"?
Posso, cioè, in fase di digitazione "bloccare" al volo il carattere 
"intruso"?
Grazie.
(G)

CUT
Ivan ti ringrazio moltissimo per la pazienza! Sto imparando più così che non 
a leggere i testi. Grazie.
Molto interessante la possibilità di abilitare/disabilitare al volo il 
bottone "Command1" e di regolarsi di conseguenzxa a secondo dello stato 
dello stesso.
Se io volessi però lasciare il "Command1" attivato onde permettere lo 
svolgersi di operazioni successive (il salvataggio dei dati) e volessi solo 
controllare la validità del capo Text.CAP (5 numeri, niente lettere) come 
posso fare durante l'inserimento dello stesso?
Oppure mi conviene, come da detto Zanna, "incorporare" tutti i vari 
controlli successivamente alla compilazione della maschera di input?
Grazie ancora se vorrai rispondermi.
(G)

 quando l'utente sta uscendo dal controllo con il cursore.
E qui mi vuoi male!
Puoi per cortesia essere un po' più chiaro? diciamo molto più chiaro!
Grazie ancora.
(G)

 quando l'utente sta uscendo dal controllo con il cursore.


 (G)
Copiati questa routine dentro la sub Change del text3:
Private Sub Text3_Change()
Dim Counter  As Integer
Dim Scratch As String
For Counter = 1 to Len(Text3.Text)
If  Asc(Mid$(Text3.Text, Counter, 1)) > 47 And  Asc(Mid$(Text3.Text, 
Counter, 1)) < 58 Then
Scratch=Scratch & Mid$(Text3.Text, Counter, 1)
Else
End If
Next
Text3.Text = Scratch
End Sub
(1) In pratica creo la variabile stringa Scratch (questa variabile ha valore 
solo in questa Sub e viene distrutta all'uscita, stesso discorso per 
Counter) che ovviamente è vuota.
(2) Quindi con il contatore For/Next, leggo carattere per carattere tutta le 
textbox, quando un carattere è un numero viene copiato in Scratch se non lo 
è non viene copiato, quindi ho realizzato un filtro, infatti in qualsiasi 
posizione da sinistra a destra non si trovi un carattere numerico viene 
filtrato automaticamente, anzi che avvertire l'utente di ridigitare o 
eliminare il carattere errato con noisi messaggi hai reso la textbox 
intelligente.
(3) Dopo il Next assegno il testo filtrato countenuto in Scratch alla 
textbox ed il gioco è fatto.
Ti dò un suggerimento, se vuoi che l'utente non immetta piu di 5 caratteri 
vai a vedere nelle proprieta di text3, troverai MaxLength che se fissata a 
zero significa nessun limite di lunghezza, ma se la fissi su 5 nella Textbox 
dopo il quinto carattere non puoi piu immettere altro, naturalmente se lo 
vuoi fare da codice scrivilo allora nella routine evento Load della form, 
cosi:
Private Sub Form_Load()
Text3.Maxlength = 5 : Rem quando si carica questo Form assegno la lunghezza 
di 5 caratteri massimi alla tua TextBox numero 3.
End Sub 

 CUT
Ti ringrazio moltissimo!
Quindi in VB6 OGNI variabile deve essere dichiarata con un DIM!
Ma se io, per ipotesi, volessi portarmi dietro la variabile "a" indenne tra 
le varei Sub...End sub e quindi dichiararla solo all'inzio come faccio?
Per favore puoi darmi un'occhiata anche al nuovo post di qualche minuto fa e 
realtivo alla gestione dei fil ad accesso casuale?
Grazie se vorrai ancora aiutarmi.
(G) 

 (G)
Allora devi aggiungere un Modulo.Bas, seguimi attentamente
1) Vai sul Menu Progetto di VB6 e seleziona "Inserisci Modulo", ti verrà 
creato il modulo vuoto
2) Vai sulla ToolBar di VB6 e clicca su Gestione Progetti, si apre una 
finestra e nella cartella modoli troverai MODULO1.BAS
3) Apri Il modulo con un doppioClick, lo troverai vuoto
Qui dentro puoi dichiarare le variabili Globali, cioè visibili in qualuque 
form o subroutine del tuo programma ecco qualche esempio di dichiarazione:
Global  Nome    As String  : Rem dichiaro la stringa Nome
Global  Codice  As Integer : Rem Dichiaro la variabile Codice di tipo 
Integer (Numero Intero a 16Bit)
Adesso una matrice:
Global Tabella(10,10) As String
I tipi di variabili sono:
Byte, String, Integer, Long, Double, Currency
Questi i piu importanti
Comunque le variabili Global dichiarate in un modulo.bas sono note a tutto 
il programma come avveniva in GWBASIC dal momento che a me non serviva 
conserarle nell'esempio precedente le ho dichiarate nella Sub, le ho usate e 
gettate :-)

 e gettate :-)
Sprecone ;-))))
Quindi le variabili "fisse" (orami sono fuso... varibili fisse!) devono
essere esterne al programma vero e proprio!
Ovviamente, però, posso sempre ricalcolarle all'interno di una Sub però -
così facendo - alla chiusura della Sub che l'ha ricalcolata perdo il valore
della variabile in questione.
O no?
Per favore mi aiuti ancora anche con la gestione dei file ad accesso
casuale?
Sei veramente molto gentile.
Grazie.
(G) 

 (G)
Le variabili globali sono in un area riservata ad esse quindi, le puoi 
macinare in form e non le perdi, rimacinarle in un altro e un'altro ancora 
finchè il programma non termina non le perdi.
Però occhio ai nomi, infatti se dichiari anche privatamente lo stesso nome 
di una variabile globale anche con DIM in una SUB allora ottieni errore da 
VB6, ferma il programma e ti avverte che è già dichiarata.
Puoi invece usare lo stesso nome tra variabili private di SUB diverse in 
quanto come ti dicevo il loro ciclo di vita è limitato alla durata della Sub 
stessa, quindi anche con ugualnome non ci sono problemi.
Per quanto riguarda il tuo Post sui File Random qui c'è molto di piu da 
scrivere per cui dammi un pò di tempo.
Per ora ti anticipo che la struttura dei campi record viene anch'essa di 
chiarata in un modulo .Bas come le variabili globali, anche nello stesso 
modulo, non necessariamente ne devi creare altri.

 modulo, non necessariamente ne devi creare altri.
Non ho parole: sei veramente molto cortese e gentile.
Grazie di cuore.
Adesso provo a fare pratica con le variabili globali ed manipolarle 
all'interno di una Sub stando attento ai nomi, come mi hai detto.
Ancora grazie.
(G)

 gettate :-)
Ancora un po' di teoria sullo scope di una variabile.
Esistono 3 livelli di scope: Applicazione, Modulo, Sub/Function.
Le var dichiarate pubbliche in un modulo sono pubbliche per tutta
l'applicazione.
Le var dichiarate private in un modulo sono pubbliche solo all'interno del
modulo.
Le var dichiarate in una sub/function sono visibili solo all'interno della
sub/function.
Un caso particolare sono le var dichiarate pubbliche in un modulo di
classe/form che sono pubbliche ma solo relativamente all'istanza della
classe contenitore (non sto a spiegarlo :P ).
E' sempre consigliato usare lo scope più limitato possibile per mantenere il
codice pulito e il più modulare possibile.
Ciao
--
- Reporting tool
http://www.neodatatype.net

 codice pulito e il più modulare possibile.
Quanto rimpiango il GWBasic! ;-)
Comunque ti ringrazio moltissimo, le tue spiegazioni - compatibilimente con 
le mie conoscenze - sono molto chiare: adesso devo trovare MSDN in italiano 
per il vb6 ed il mulo latita...
Temo che ti/vi "romperò" ancora per un bel po'! Porta pazienza per favore!
Ciao e grazie ancora.
(G)

 l'intera finestra.
mi pare una logica pericolosa e difficile da gestire, considerato
che con le GUI l'utente puo` iniziare a scrivere dove gli pare,
proprio come su un foglio di carta.
-- 
ciao, hal

 per il vb6 ed il mulo latita...
MSDN """dovrebbe""" stare nella scatola insieme a vb6 ;)
Comunque, non è in italiano ma la sezione è questa.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/htm
l/vbmscHeadStart.asp
Eventualmente potrebbe anche servire un link all'indice di MSDN
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/ht
ml/vistoolsanchor.asp


 Comunque, non è in italiano ma la sezione è questa.
Bene, almeno posso guardare 
q.sa
.
Come sempre sei stato molto cortese e ti ringrazio.
Ciao!
(G)

 Me lo hanno prestato ;-)
E fatti prestare anche MSDN :)
Ciao

 E fatti prestare anche MSDN :)
Ehhhhhh! L'amico č partito e si č portato via la scatola.... ;-)
Grazie ancora ed abbi pazienza!
(G)