Gambas-it

Gambas3 => Programmazione => Topic aperto da: simo97 - 17 Maggio 2013, 19:44:45

Titolo: estendere il like a tutto l'unicode
Inserito da: simo97 - 17 Maggio 2013, 19:44:45
il titolo dice quasi tutto
ho letto che per farlo bisogna attivare il componente gb.pcre ma non ho letto come percui data la mia nota pigrizia chiedo a voi gentilissimi sigrori e (forse) signore....
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 18 Maggio 2013, 01:12:35
Cioè tu intendi dire: estendere la capacità del Like di riconoscere ogni carattere dell'Unicode ?


Una cosa simile a questa ?    :-X
Codice: gambas [Seleziona]

Private s As String


Public Sub Form_Open()
 
  s = "ali" & String.Chr(&1D160) & "baba"

End


Public Sub Button1_Click()

   If s Like "*" & String.Chr(&1D160) & "ba*" Then
   
      Print "Verificata corrispondenza !"

   Endif

End
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 18 Maggio 2013, 17:35:29
Codice: gambas [Seleziona]
 
If key.Text Like "[^0-9.,-]" Then
   Stop Event
 Endif

.........
in teoria con questo dovrei essere sicuro che altri caratteri non vangano inseriti...
ma non è così
perchè sulla spiezazione (il popup) di like c'è scritto che funziona solo con gli UTF-8, accenna al componente gb.prce

ora dovrebbe essere comprensibile a tutti qual'è il problemino ;)
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 18 Maggio 2013, 19:06:07
ora dovrebbe essere comprensibile a tutti qual'è il problemino

Io ancora no.  :-\
Ho provato il tuo codice e premendo qualunque tasto sulla tastiera compreso fra 0 e 9, nonché la virgola, il punto ed il trattino del meno non viene passata la verifica. Cioè se io, ad esempio, metto:
Codice: gambas [Seleziona]

Public Sub Form_KeyPress()

   If key.Text Like "[^0-9.,-]" Then
  
      Print "verifica"

   Endif  

End

e premo il tasto di un simbolo presente nel Pattern di Like, nella console non viene scritto niente.

Oppure tu intendi una verifica di Like, oltre relativa ad un tasto, anche relativa ad una qualunque stringa di caratteri ?
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 18 Maggio 2013, 22:44:31
no....
se con il mio codice dai "è","ò","à" etc... viene inserito mentre non dovrebbe essere possibile
io chedevo solamente come estendere il controllo like a tutti i vari "codici"(simboli,lettere,altre combinazioni di tasti etc..) possibili
 :ciao:
ora spero di essermi spigato :P
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 18 Maggio 2013, 23:29:46
se con il mio codice dai "è","ò","à" etc... viene inserito mentre non dovrebbe essere possibile
io chedevo solamente come estendere il controllo like a tutti i vari "codici"(simboli,lettere,altre combinazioni di tasti etc..) possibili

Se io provo con il tuo codice, un po' modificato (ossia quello che ho inserito poco sopra), e premo i tasti "è","ò","à", nella console non viene scritto niente.  :-\
Proprio come nelle tue intenzioni.
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 19 Maggio 2013, 07:36:09
Riepilogo un minuto :
Obbiettivo :Essre sicuro che non vengano scritti altri caratteri.

Con il mio codice però Ci sono dei caratteri che sfuggono a questo controllo tipo quelli che ho scritto.
Inserendo quei caratteri in un altro case si escludono anche quelli
Ma qelli non sono gli unici, tutte le combinazioni di scift, alt+control etc


Lascate stare gli errori di grammatica...
Ho scritto col telefono in macchina  :rolleyes:
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: pastrank - 19 Maggio 2013, 10:46:57
Obbiettivo :Essre sicuro che non vengano scritti altri caratteri.

Metti uno zero (a seconda del caso) nella tag del controllo, la routine di controllo nell'evento Change, se quello che hai combacia con la maschera che vuoi con il like allora e' ok, e inserisci il valore che hai sul momento nella tag ancora, se non lo e' ripeschi il valore della tag e lo riassegni al text del controllo.
Il controllo lo puoi fare con isnumber, aiutato da una prova precedente tipo

Codice: [Seleziona]
If TextBox1.text = "," Then
    TextBox1.text = "0,"
Endif

Do While Left(TextBox1.text, 2) = "00"
    TextBox1.text = Mid(TextBox1.text, 2)
Loop

Do While Left(TextBox1.text, 3) = "-00"
    TextBox1.text = "-0" & Mid(TextBox1.text, 3)
Loop

'qui ci metti tutti i like che vuoi, che devono comprendere anche i numeri parziali ovviamente
dim procedi as boolean
if textbox1.text like cosi' o cosa' o pomi'
  'con le regexp duro fatica, figurati a scriverne una a mente che prenda piu' casi
  'in ogni caso puoi fare un ciclo: se tieni in valor in array che puoi richiamare a seconda del caso, definiti globali, puoi
  'anche riusarli in tutto il programma
  ' i numeri accettabili se non mi sfugge qualcosa sono, mentre li scrivi, "-", "-0", "0,"
  procedi=true
endif

if procedi=true then
   TextBox1.tag = TextBox1.text   
else
   TextBox1.text = TextBox1.tag
endif 

Ovviamente, qui c'e' il controllo con la virgola come separatore, ma devi controllare quale adopera il sistema dove lo usi, in una funzione all'inizio che lo metta in una variabile. Funziona anche per il copia incolla. Ricorda che e'  un numero anche 1.0344e15, quindi se vuoi evitare la c controllo da fare. Alla fine, prima dei calcoli, devi vedere ancora se questi sono numeri, ma con una sola prova, giusto per vedere che non ci sia un numero incompleto, tipo -0.

Una versione semplificata e' questa, per i numeri non esponenziali: ben lungi dall'essere perfetta, sembra quasi funzionare, ma ovviamente intendi tutto come un suggerimento e non come una cosa da fare copia e incolla.
Codice: [Seleziona]
If TextBox1.text = "," Then
    TextBox1.text = "0,"
Endif

Do While Left(TextBox1.text, 2) = "00"
    TextBox1.text = Mid(TextBox1.text, 2)
Loop

Do While Left(TextBox1.text, 3) = "-00"
    TextBox1.text = "-0" & Mid(TextBox1.text, 3)
Loop

If InStr(TextBox1.text, "e") Then
    TextBox1.text = Replace(TextBox1.text, "e", "")
Endif

If IsNumber(TextBox1.text & "0") = False Then
   TextBox1.text = TextBox1.tag
Endif
TextBox1.tag = TextBox1.text   
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 19 Maggio 2013, 18:31:30
Ora non ho tempo ma un mille grazie c'è sempre
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 21 Maggio 2013, 18:16:18
se con il mio codice dai "è","ò","à" etc... viene inserito mentre non dovrebbe essere possibile
io chedevo solamente come estendere il controllo like a tutti i vari "codici"(simboli,lettere,altre combinazioni di tasti etc..) possibili

Se io provo con il tuo codice, un po' modificato (ossia quello che ho inserito poco sopra), e premo i tasti "è","ò","à", nella console non viene scritto niente.  :-\
Proprio come nelle tue intenzioni.
si ma non perchè il like lo ferma, ma perchè il like non accetta quei caratteri quindi la verifica non viene neppure eseguita

questo viene dalla documentazione di like
Citazione
Attenzione! LIKE si occupa come solo dei caratteri ASCII. Per ricercare stringhe con il set di caratteri UTF-8, Usare la gb.pcre componenti.
chiedo spigazioni in merito...

per il codice di pastrank quando ci capirò qualcosa lo applicherò da qualche parte
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 21 Maggio 2013, 18:21:24
si ma non perchè il like lo ferma, ma perchè il like non accetta quei caratteri quindi la verifica non viene neppure eseguita

Non ne comprendo la differenza.  ???
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 21 Maggio 2013, 18:30:25
Codice: gambas [Seleziona]
 If key.Text Like "[^0-9.,-]" Then
  Stop Event
 Endif

la differenza la capisci qui...

se gli dò "4" il like lo lascia passare (nel senso che non lo stoppa)
se gli dò "g" il like eseguendo la verifica vede che non è tra quelli consentiti e quindi lo stoppa
se gli dò "è" il like non lo accetta e non esegue neanche la verifica passando avanti e quindi il carattere non viene stoppato

Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 21 Maggio 2013, 19:14:49
se gli dò "4" il like lo lascia passare (nel senso che non lo stoppa)
se gli dò "g" il like eseguendo la verifica vede che non è tra quelli consentiti e quindi lo stoppa
se gli dò "è" il like non lo accetta e non esegue neanche la verifica passando avanti e quindi il carattere non viene stoppato


....io credo :-X che la verifica, in quanto tale, dell' IF venga sempre compiuta. La sua risposta è altra cosa.
Ad ogni modo, ripeto che sulla base di quel codice qualunque riga di comando posta all'interno della verifica condizionale dell'IF mi viene eseguita, se premo un qualunque tasto sulla tastiera, anche combinato, ad eccezione dei numeri, della virgola, del punto, del meno e dei caratteri: è, é, à, °, ù, §, ò, ç, ì.
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 21 Maggio 2013, 19:26:46
Citazione
è, é, à, °, ù, §, ò, ç
non sono gli unici....ce ne sono una trentina(che conosco), l'unicode è lungo....

ma per il controllo questi non dovrebbero essere inseriti
ora si potrebbe fare un case ma l'unicode è lungo


come posso usare le informazioni contenute qui??
Citazione
Attenzione! LIKE si occupa come solo dei caratteri ASCII. Per ricercare stringhe con il set di caratteri UTF-8, Usare la gb.pcre componenti.
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 21 Maggio 2013, 19:34:11
non sono gli unici....ce ne sono una trentina(che conosco),

Io ti parlavo semplicemente di quelli presenti sulla tastiera italiana,  :-\ e sui quali ho fatto le prove.


come posso usare le informazioni contenute qui??
Citazione
Attenzione! LIKE si occupa come solo dei caratteri ASCII. Per ricercare stringhe con il set di caratteri UTF-8, Usare la gb.pcre componenti.
...aprendo un progetto nuovo e studiandosi il componente gb.pcre...... ;D
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 21 Maggio 2013, 19:40:25
si ma non capisco il collegamento con il like...
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 21 Maggio 2013, 19:50:43
si ma non capisco il collegamento con il like...
...questa tua discussione è un mistero assoluto.  ;D
(http://misterorisolto.files.wordpress.com/2013/05/shadow_credit.gif)

Ad ogni modo, se elimino tutte le righe dell'intero condizionale IF (anche quelle interne):
Codice: gambas [Seleziona]

Public Sub Form_KeyPress()  
  
     Print "verifica"

End

ovviamente ad ogni tasto premuto viene stampata in console la stringa stabilita.
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 21 Maggio 2013, 19:56:59
nooooooo veramente :o
 :rotfl: :rotfl:

ci capirò qualcosa prima o poi :-\
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 21 Maggio 2013, 20:24:45
..... qualunque riga di comando posta all'interno della verifica condizionale dell'IF mi viene eseguita, se premo un qualunque tasto sulla tastiera, anche combinato, ad eccezione dei numeri, della virgola, del punto, del meno e dei caratteri: è, é, à, °, ù, §, ò, ç, ì.

Ora mi domando  :rolleyes: come mai vengono assimilati quei simboli  (è, é, à, °, ù, §, ò, ç, ì) ai caratteri posti nel pattern di Like del tuo esempio. Infatti, come ho già detto, cliccando su un tasto che li rappresenta, la riga di codice condizionta dalla verifica dell'IF, non viene eseguita.... nonostante quei caratteri non siano ricompresi nel pattern.  :-\
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 21 Maggio 2013, 21:27:05
semplicemente perchè il like rifiuta totalmente tutti gli altri caratteri dell'unicode
 :hatecomputer:
mi sono letto tutta la documentazione sul componente Regexp (gb.pcre) e non ci ho capito niente
però ho letto
Citazione
PCRE Sintassi [...]
CLASSI - corrispondenti a un intervallo o un insieme di caratteri. Ad esempio, "[abc]" sarebbe partita sia a, b o c.[...]
[^ ...] Carattere negativo
[...]
e sarebbe proprio quello che fa al caso mio, ma non dice come usarlo: cosa mettere al posto del like...
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 21 Maggio 2013, 21:39:12
in alternativa qualcosa che controlla se è un ASCII oppure appartiene ad un altro set...
qualcosa tipo
Codice: gambas [Seleziona]

If not  isascii(key.Text) Then 
 Stop Event   
Endif 


però cosi dovrei tralasciare alcuni caratteri, tipo le freccie etc...
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: pastrank - 21 Maggio 2013, 23:09:52
in alternativa qualcosa che controlla se è un ASCII oppure appartiene ad un altro set...

Io mi ripeto dicendo che controllare se e' un numero e' piu' semplice che controllare tutto quello che non dovrebbe essere.
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 22 Maggio 2013, 00:59:34
in alternativa qualcosa che controlla se è un ASCII oppure appartiene ad un altro set...

però cosi dovrei tralasciare alcuni caratteri, tipo le freccie etc...

Rileggendo un po' tutta la discussione sono scoppiato a ridere  :rotfl: ......perché non ho capito bene ancora con precisione cosa vuoi !   :rotfl: :rotfl:

    :'(

Voglio tenere come base il mio esempio di prima, ossia questo:
Codice: gambas [Seleziona]

Public Sub Form_KeyPress()

   If ............. Then
      Print "Scrivo in console"
   Endif

End



Dunque:
* se vuoi che premendo un numero non venga eseguita l'istruzione all'interno dell'IF, allora va bene il suggerimento di pastrank (ovviamente la soluzione pastrankiana può essere utilizzata - in modo diverso - anche se vuoi che l'istruzione venga eseguita, poiché la funzione IsNumber è comunque relativa ai numeri);

* se vuoi che venga eseguita l'istruzione all'interno dell'IF, soltanto se si preme un tasto avente come simbolo una lettera dell'alfabeto, anche se accentata (quindi niente numeri ed altri simboli), allora puoi fare così:
Codice: gambas [Seleziona]

Public Sub Form_KeyPress()

' In questo caso usiamo il "Select Case":
  Select Case key.Text
    Case "A" To "Z", "a" To "z", "ì", "è", "é", "ò", "à", "ù"
      Print "Scrivo in console"
  End Select

End
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 22 Maggio 2013, 15:22:12
l'obbiettivo era e è ancora di essrere sicuro che non vengano inseriti altri caratteri oltre a quelli del like

ora, il like mi gestisce l'acii e fin qui funziona

il not isascii(...) mi gestisce il resto e va bene...
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 22 Maggio 2013, 16:33:56
ora, il like mi gestisce l'acii e fin qui funziona

il not isascii(...) mi gestisce il resto e va bene...

...sembrerebbe quindi essere risolto !  :-\
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 22 Maggio 2013, 16:45:44
si il risultato è stato trovato con questa....
Codice: gambas [Seleziona]
'' **filtro caratteri***
'' ***
'' da inserire in un keypress
'' ***
'' **ARGOMENTI:**
'' - stringa: il testo della text box da controllare
'' da inserire!!
Public Function Filtro(stringa As String)  
 If key.Text Like "[^0-9.,-]" Then
   Stop Event
 Endif
If Key.Text = "." Then
  If ricerca(stringa, ".") = 1 Then
    Stop Event
  Endif
Endif
If Key.Text = "-" Then
  If ricerca(stringa, "-") = 1 Then
    Stop Event
  Endif
Endif
If Key.Text = "," Then
  If ricerca(stringa, ".") = 1 Then
    Stop Event
  Endif
Endif
If Not IsAscii(Key.Text) Then
  Select Case Key.Text
    Case Not ""
    Stop Event
  End Select
Endif
End


 :danger: ma  :danger:
ancora non ho capito come estendere il like
gambas lo permette ma non riesco a capire come

diciamo che è risolto a metà
 :ciao:
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: vuott - 23 Maggio 2013, 16:58:15
come posso usare le informazioni contenute qui??
Citazione
Attenzione! LIKE si occupa come solo dei caratteri ASCII. Per ricercare stringhe con il set di caratteri UTF-8, Usare la gb.pcre componenti.

Prova ad attivare innanzitutto il componente in questione: gb.pcre .
Poi, potresti studiarne classi, funzioni e proprietà magari iniziando così:    :-\
Codice: gambas [Seleziona]

Private p As New Regexp


Public Sub Form_Open()

   With p
' qui richiami le risorse della classe ponendo un punto, come di consueto...
   End With

End

:-X
Titolo: Re: estendere il like a tutto l'unicode
Inserito da: simo97 - 23 Maggio 2013, 19:28:06
io avevo letto tutta la documentazione
farò gli esperimenti :ok: