Gambas-it

Gambas3 => Programmazione => Topic aperto da: dregi - 10 Settembre 2019, 12:23:28

Titolo: Message prepotente!
Inserito da: dregi - 10 Settembre 2019, 12:23:28
Codice: [Seleziona]
Public Sub txtIndirizzo_LostFocus()
txt = txtIndirizzo.Text

If Len(txt) > 2 Then
  If f.TrovaNum(txt) = False Then
    txt = txt & " "
    Message.Info("Manca il numero civico!", "OK")
    txtIndirizzo.Text = txt
    txtIndirizzo.Pos = Len(txt)
    txtIndirizzo.SetFocus 
  Endif
Endif
End

Il codice sopra esegue solo la riga txtIndirizzo.SetFocus dopo Message.Info. Se commento Message.Info invece esegue tutto il codice. Qualcuno mi sa dire perchè?
Titolo: Re:Message prepotente!
Inserito da: vuott - 10 Settembre 2019, 12:43:33
Che Oggetto è "txtIndirizzo" ?
Titolo: Re:Message prepotente!
Inserito da: dregi - 10 Settembre 2019, 12:55:53
E' un TextBox
Titolo: Re:Message prepotente!
Inserito da: vuott - 10 Settembre 2019, 15:24:24
A me viene sollevato un errore (vedi immagine allegata).
Titolo: Re:Message prepotente!
Inserito da: Gianluigi - 10 Settembre 2019, 15:25:34
Penso, ma non ne sono certo, si tratti di un bug.
Si comporta così perché usi le librerie gtk, con le qt darebbe direttamente errore (vuott dixit).
Ho visto che per qualche ragione a me sconosciuta l'evento si ripete due volte, forse è causato da quello.
Ti conviene spostare i controlli in un'unica routine che azioni al momento di inviare i dati al database, così sei tranquillo che qualunque libreria usi funzionerà.
Altrimenti, visto che ho comunicato la questione, puoi attendere un'eventuale rara risposta rapida.
Titolo: Re:Message prepotente!
Inserito da: dregi - 10 Settembre 2019, 15:37:04
attendere un'eventuale rara risposta rapida.

 :)

questa è proprio spassosa! :)
Titolo: Re:Message prepotente!
Inserito da: dregi - 10 Settembre 2019, 15:42:12
Visto che ci sono e l'obiettivo era quello di impedire la digitazione di lettere in un textbox per numeri, in VB6 con keyascii=0 si annullava il tasto premuto e sul textbox non veniva visualizzato nulla, è possibile avere qualcosa di analogo in gambas?
Titolo: Re:Message prepotente!
Inserito da: dregi - 10 Settembre 2019, 15:54:37
Ho risoltoooooo, basta spostarlo dopo le righe di codice di cui si vuole l'esecuzione.
Codice: [Seleziona]
txtIndirizzo.Text = txt
    txtIndirizzo.Pos = Len(txt)
    txtIndirizzo.SetFocus
    f.Suona("beep.wav")
    Message.Info("Manca il numero civico!", "OK")
Titolo: Re:Message prepotente!
Inserito da: vuott - 10 Settembre 2019, 19:22:58
Visto che ci sono e l'obiettivo era quello di impedire la digitazione di lettere in un textbox per numeri, in VB6 con keyascii=0 si annullava il tasto premuto e sul textbox non veniva visualizzato nulla, è possibile avere qualcosa di analogo in gambas?

Io userei l'Oggetto ValueBox !

Ad ogni modo, volendo usare il TextBox, si può proporre un codice come il seguente:
Codice: [Seleziona]
Public Sub TextBox1_Change()

  Dim i As Integer
   
  For i = 1 To Len(TextBox1.Text)
    If IsLetter(Mid(TextBox1.Text, i, 1)) Then
      Mid(TextBox1.Text, i, 1) = Null
      TextBox1.Pos = i - 1
    Endif
  Next
   
End
Titolo: Re:Message prepotente!
Inserito da: allegfede - 13 Settembre 2019, 12:10:08
si, anche io metterei il numero civico in un altro "field".
In questo modo puoi evitare di fare il parse dell'intero indirizzo, che potrebbe avere anche "falsi positivi" tipo VIA 20 SETTEMBRE 32.

in ogni caso, come dici tu, se metti la generazione di una "azione" all'interno di un ciclo, ci puo' stare che venga ripetuta :D
Titolo: Re:Message prepotente!
Inserito da: dregi - 21 Settembre 2019, 17:33:44
Vuott, non uso il Valuebox perchè il contenuto non è formattabile:  1.550,30 mentre col textbox a livello di formattazione faccio quello che voglio. Comunque ispirandomi al tuo codice, ho risolto così:
Codice: [Seleziona]
Public Sub txtImporto_Change()
  Dim s As String
  s = txtImporto.Text
  If Len(s) > 0 Then
  If Not IsNumber(s) Then
    txtImporto.Text = ""
    f.suona("chord.wav")
  Endif
  Endif
End
Titolo: Re:Message prepotente!
Inserito da: vuott - 21 Settembre 2019, 17:51:54
...ma con questa riga:
   
Codice: [Seleziona]
txtImporto.Text = ""
in caso di immissione di un carattere non numerico ti cancella tutti i numeri precedentemente immessi nel textbox !
Titolo: Re:Message prepotente!
Inserito da: dregi - 22 Settembre 2019, 00:27:34
Vero, hai ragione, anche se io presupponevo che l'utente solo inizialmente facesse l'errore di inserire testo in un textbox importo. Comunque, meglio il tuo codice.
Titolo: Re:Message prepotente!
Inserito da: vuott - 22 Settembre 2019, 00:30:36
Vuott, non uso il Valuebox perchè il contenuto non è formattabile:  1.550,30

...non è proprio proprio così:

https://www.gambas-it.org/wiki/index.php?title=Rappresentare_in_un_ValueBox_un_numero_avente_i_punti_delle_migliaia_e_la_virgola_dei_decimali
Titolo: Re:Message prepotente!
Inserito da: Gianluigi - 22 Settembre 2019, 19:06:18
Visto che ci sono e l'obiettivo era quello di impedire la digitazione di lettere in un textbox per numeri, in VB6 con keyascii=0 si annullava il tasto premuto e sul textbox non veniva visualizzato nulla, è possibile avere qualcosa di analogo in gambas?

Se l'obbiettivo è quello di avere una casella con numeri divisi per migliaia e per decimali e senza la € allora propongo qualcosa di simile:
Codice: [Seleziona]
Public Sub TextBox1_KeyPress()

  Dim iPos As Integer = TextBox1.Pos

  Select Case Key.Code
    Case Key.Left, Key.Right, Key.BackSpace, Key.Delete, Key.Enter, Key.Return, Key.Escape, Key.Home, Key.End, Key.Tab, Key.BackTab
      Return
  End Select

  Select Case Key.Text
    Case "0" To "9"
      Return
    Case ",", "."
      If iPos = 0 Then Stop Event
    Case Else
      Stop Event
  End Select

End

Public Sub TextBox1_LostFocus()

  If TextBox1.Text <> Format(Val(TextBox1.Text), "#,###.00") Then
    TextBox1.Text = Format(Val(TextBox1.Text), "#,###.00")
    Balloon.Delay = 4000
    Balloon.Warning("<b>Valore Riformattato</b>.\nControllane la correttezza", TextBox1)
    TextBox1.SetFocus()
    TextBox1.SelectAll()
  Endif

End
Titolo: Re:Message prepotente!
Inserito da: naderit - 29 Settembre 2019, 21:19:34
Ciao ho risolto il problema solo numeri o dolo lettere in questo modo:
Codice: [Seleziona]
Public Function Numeri() 'solo numeri' 
 If Key.Code >= 48 And Key.Code <= 57 Then
   Else If key.Code = key.BackSpace Then
   Else If key.Code = key.Delete Then
   Else If Key.Code = Key.Left Then
   Else If Key.code = Key.Right Then
   Else If Key.Code = Key.Tab Then 
    Else
      Stop Event
  End If
 End 

Public Function Lettere()
 
  If Key.code >= 64 And Key.Code <= 90 Then
  Else If key.Code = key.BackSpace Then
  Else If key.Code = key.Up Then 
  Else If Key.code = Key.Down Then
  Else
    Stop Event
  Endif 
End
Titolo: Re:Message prepotente!
Inserito da: Gianluigi - 29 Settembre 2019, 22:20:03
Scusa ma hai letto cosa vuole dregi?
non uso il Valuebox perchè il contenuto non è formattabile:  1.550,30 mentre col textbox a livello di formattazione faccio quello che voglio.
Titolo: Re:Message prepotente!
Inserito da: naderit - 01 Ottobre 2019, 19:49:34
si ho letto...
Citazione
Visto che ci sono e l'obiettivo era quello di impedire la digitazione di lettere in un textbox per numeri, in VB6 con keyascii=0 si annullava il tasto premuto e sul textbox non veniva visualizzato nulla, è possibile avere qualcosa di analogo in gambas?
se all'evento TextBox_KeyPress() usi la funzione che ho scritto, vengono escluse le lettere della tastiera  :-\

se invece uso
Codice: [Seleziona]
Public Sub TextBox1_Change()
If TextBox1.text > "" Then
TextBox1.text = Format(Replace(TextBox1.Text, ",", Null) / 100, "0.00")
Endif 
End
ho la virgola automatica