Buona sera a tutti,
ho un problema che non capisco riguardo la gestione dei messaggi, inserendo questo codice
PUBBLIC SUB TextBox1_LostFocus()
IF TextBox1.Text <> "" AND TextBox2.Text <> "" THEN
TextBox1.SelectAll
TextBox2.SelectAll
Message.Warning("Dati non corretti.")
TextBox2.SetFocus
ENDIF
END
PUBBLIC SUB TextBox2_LostFocus()
IF TextBox2.Text <> "" AND TextBox1.Text <> "" THEN
TextBox2.SelectAll
TextBox1.SelectAll
Message.Warning("Dati non corretti.")
TextBox1.SetFocus
ENDIF
END
quando lo eseguo, dopo aver inserito dei dati nelle due TextBox come mi sposto su un'altro campo dello stesso form appare il messaggio, e fin qui tutto ok, ma se dopo aver chiuso il messaggio clikko per esempio sulla TextBox1 mi va in errore:
Message box already displayed
Ivece di un piccolo form con l'ok da premere esce un fumetto come quello delle notifiche di kde con scritto il testo. Il fumetto sparisce poco dopo da solo (puoi settare dopo quanto).
dove control è l'oggetto del form a cui punta il fumetto (il textbox)
http://gambasdoc.org/help/comp/gb.form/balloon?it
Non ricordo se devi abilitare qualche componente. .....
PUBBLIC SUB TextBox1_LostFocus()
IF TextBox1.Text <> "" AND TextBox2.Text <> "" THEN
TextBox1.SelectAll
TextBox2.SelectAll
ballon.Warning("Dati non corretti.",textbox1)
TextBox2.SetFocus
ENDIF
END
PUBBLIC SUB TextBox2_LostFocus()
IF TextBox2.Text <> "" AND TextBox1.Text <> "" THEN
TextBox2.SelectAll
TextBox1.SelectAll
ballon.Warning("Dati non corretti.",textbox1)
TextBox1.SetFocus
ENDIF
END
@leo:
grafica ok, forse non avevo abilitato qualche componente...mah!!
Ora, come vi avevo detto precedentemente il codice seguente funziona perfettamente con le Qt (esclusi i messaggi), mentre con le Gtk ho dei problemi:
PUBLIC SUB TextBox1_LostFocus()
DIM valore, valore2 AS String
DIM i AS Integer
valore = TextBox1.Text
valore2 = ""
FOR i = 1 TO Len(valore)
SELECT CASE Mid(valore, i, 1)
CASE "0" TO "9"
valore2 &= Mid(valore, i, 1)
CASE ",", "."
valore2 &= ","
CASE ELSE
valore2 &= ""
END SELECT
NEXT
IF TextBox1.Text <> "" THEN
TextBox1.Text = Format(Val(valore2), "#0.00")
ENDIF
IF TextBox1.Text <> "" AND TextBox2.Text <> "" THEN
TextBox2.SelectAll
TextBox1.SelectAll
Message.Warning("Dati non corretti.")
TextBox2.SetFocus
ENDIF
END
PUBLIC SUB TextBox1_KeyPress()
SELECT Key.Code
CASE Key.Enter, Key.BackSpace, Key.Delete, Key.Left,
Key.Right, Key.space, Key.Tab
RETURN
END SELECT
IF Key.Text LIKE "[0-9]" OR Key.Code = Key[","] OR Key.Code = key["."] THEN
RETURN
ELSE
STOP EVENT
ENDIF
END
Le differenze sono che:
non mi accetta ne il punto ne la virgola, di conseguenza non posso inserire decimali diversi dagli zeri che inserisce automaticamente se non digito decimali, se inserisco dati nella TextBox1 e nella 2 viene evidenziata solo la TextBox2 dopo la visualizzazione del messaggio...insomma qualche differenza c'è, non capisco :-?
Se togli l'evento TextBox1_KeyPress il codice funziona.
Secondo me hai realizzato un controllo _troppo_ rigido sulla digitazione, rallentando oltremodo l'esecuzione del programma.
Io metterei solo un evento TextBox1_Change per controllare l'eventuale inserimento del punto ed immediata sostituzione con la virgola:
IF Instr(TextBox1.Text, ".") THEN
TextBox1.Text = Replace(TextBox1.Text, ".", ",")
ENDIF
e poi metterei l'evento LostFocus.
Ma devi per _forza_ impedirlo? Non puoi semplicemente parsare con l'evento LostFocus e togliere tutte le lettere? Non è più semplice e meno costoso in termini di risorse?
Cmq, puoi usare l'evento KeyPress:
PUBLIC SUB TextBox1_KeyPress()
SELECT CASE Chr$(Key.Code)
CASE "a" TO "z", "A" TO "Z"
STOP EVENT
CASE ELSE
END SELECT
END
Ovviamente affinalo secondo le tue esigenze.
Vi ringrazio per le vostre risposte e delucidazioni tecniche.
A livello di codice ho trovato una soluzione che mi permette di avere il controllo totale sull'input da parte dell'utente evitando anche l'eventuale digitazione prospettata da leo (se l'utente ti inserisce 12,23,56 che numero è? 12,23? 23,56? 12,56), la formattazione automatica dei decimali (max due, sia che vengano digitati oppure no), la sola possibilità di inserire numeri, l'utilizzo dei tasti backspace, del, ecc...
Non so se la soluzione che ho utilizzato sia tecnicamente valida (aspetto eventuali commenti) ma di più non sono riuscito ad inventarmi con le mie conoscenze attuali.
PUBLIC SUB TextBox1_KeyPress()
IF Key.Text LIKE "[^0-9.,]" AND Asc(Key.Text) > 31 THEN
STOP EVENT
ELSE IF Key.Text LIKE "." AND InStr(TextBox1.Text, ".") THEN
ELSE IF Key.Text LIKE "," AND InStr(TextBox1.Text, ",") THEN
STOP EVENT
ENDIF
END
PUBLIC SUB TextBox1_LostFocus()
DIM valore, valore2 AS String
DIM i AS Integer
valore = TextBox1.Text
valore2 = ""
FOR i = 1 TO Len(valore)
SELECT CASE Mid(valore, i, 1)
CASE "0" TO "9"
valore2 &= Mid(valore, i, 1)
CASE ",", "."
valore2 &= ","
CASE ELSE
valore2 &= ""
END SELECT
NEXT
IF TextBox1.Text <> "" THEN
TextBox1.Text = Format(Val(valore2), "#0.00")
ENDIF
IF TextBox1.Text <> "" AND TextBox2.Text <> "" THEN
TextBox2.SelectAll
TextBox1.SelectAll
Message.Warning("Dati non corretti.")
TextBox2.SetFocus
ENDIF
CATCH
Balloon.Info("Caratteri non validi.", TextBox1)
END
Sono a completo digiuno sulle espressioni regolari.