Gambas-it

Gambas3 => Programmazione => Topic aperto da: tornu - 04 Maggio 2016, 22:54:16

Titolo: [RISOLTO] Modalità sovrascrittura
Inserito da: tornu - 04 Maggio 2016, 22:54:16
Buonasera a tutti,
pensavo fosse di facile implementazione, ma mi son dovuto ricredere almeno per le mie conoscenze.
Vi spiego cosa voglio ottenere:
disegnate una Form contenente una TextBox o qualsiasi oggetto sul quale si può inserire del testo,
questi di default sono impostati in modalità "inserimento". Inserite del testo e provate a sovrascriverlo,
quello che otterrete e che il nuovo testo verrà affiancato a ciò che già avevate scritto. Quello che io
voglio ottenere e quello che avviene in un qualsiasi word processor premendo il tasto Ins sulla tastiera,
il cursore del mouse cambia forma e mi permette di sovrascrivere ciò che avevo inserito precedentemente,
o parte di esso a seconda della necessità.
Pensavo che ci fosse una funzione tipo UCase per forzare il testo in maiuscolo, ma per la sovrascrittura
non ho trovato niente.
Titolo: Re:Modalità sovrascrittura
Inserito da: Gianluigi - 05 Maggio 2016, 02:46:21
Ho dovuto reinstallare completamente Ubuntu e ho fatto notte e poi... ci mancavi tu  :P

Un modo potrebbe essere questo:
Codice: [Seleziona]
Private $bOK As Boolean

Public Sub Form_Open()

  TextBox1.Text = "Frase di prova"
  TextBox1.Pos = 0
 
End

Public Sub TextBox1_KeyRelease()
 
  Dim s As String
  s = TextBox1.Text
  Select Key.code     
      Case Key.Insert       
        If TextBox1.Pos < Len(s) Then
          If $bOK Then
            $bOK = False
          Else
            TextBox1.Select(TextBox1.Pos, 1)
            $bOK = True
          Endif         
        Endif     
      Case Key.Space
        If $bOK Then
          If TextBox1.Pos < Len(s) Then 
            TextBox1.Select(TextBox1.Pos, 1)           
          Else
            $bOK = False
          Endif
        Endif     
   End Select
   Select Case Key.Text
     Case "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"
        If $bOK Then
          If TextBox1.Pos < Len(s) Then                               
            TextBox1.Select(TextBox1.Pos, 1)                       
          Else
            $bOK = False
          Endif
        Endif
     Case "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"
        If $bOK Then
          If TextBox1.Pos < Len(s) Then                               
            TextBox1.Select(TextBox1.Pos, 1)           
          Else
            $bOK = False
          Endif
        Endif
     Case "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
        If $bOK Then
          If TextBox1.Pos < Len(s) Then                               
            TextBox1.Select(TextBox1.Pos, 1)           
          Else
            $bOK = False
          Endif
        Endif
     Case "\\", "|", "\"", "!", "£", "$", "%", "&", "/", "(", ")", "=", "?", "ì", "^", "{", "}", "~", "\'"
       If $bOK Then
         If TextBox1.Pos < Len(s) Then                               
           TextBox1.Select(TextBox1.Pos, 1)           
         Else
           $bOK = False
         Endif
       Endif
      Case "è", "é", "+", "*", "ò", "à", "ù", "°", "[", "]", "#", "@", "ç", "<", ">", "§", "€"
       If $bOK Then
         If TextBox1.Pos < Len(s) Then                               
           TextBox1.Select(TextBox1.Pos, 1)           
         Else
           $bOK = False
         Endif
       Endif
   End Select

End
:ciao:
Titolo: Re:Modalità sovrascrittura
Inserito da: vuott - 05 Maggio 2016, 03:25:09
...... e poi... ci mancavi tu  :P

     :rotfl:
Titolo: Re:Modalità sovrascrittura
Inserito da: vuott - 05 Maggio 2016, 04:27:00
Propongo questo codice:

Codice: [Seleziona]
Private bb As Byte[]
Private i As Integer


Public Sub Form_Open()

  TextBox1.Text = "prova"
  bb = Byte[].FromString(TextBox1.Text)
  TextBox1.Pos = 0

End


Public Sub TextBox1_KeyPress()
 
  If i = bb.Count Then bb.Push(32)
 
  bb[i] = Asc(Key.Text)

  Inc i
   
  TextBox1.Text = bb.ToString(0, bb.Count)
 
  TextBox1.Pos = i
 
  Stop Event
 
End
Titolo: Re:Modalità sovrascrittura
Inserito da: Gianluigi - 05 Maggio 2016, 10:43:44
Sono troppo fuso per studiare adesso il codice di vuott.
Per quanto riguarda il mio invece, malgrado quanto qui (http://www.gambas-it.org/smf/index.php?topic=4875.msg38316#msg38316) detto, ho sbagliato evento devi usare KeyRelise al posto di KeyPress e aggiungere
Codice: [Seleziona]
TextBox1.Select(TextBox1.Pos, 1)
a
Codice: [Seleziona]
Else   
   $bOK = True
su
Codice: [Seleziona]
Case Key.Insert

Naturalmente il codice va completato con tutti i case delle Key che devono essere usate per scrivere nella textbox (tipo ,;:- ecc.).
 :ciao:

PS: Ho aggiornato il codice precedente dimmi se funziona.
Titolo: Re:Modalità sovrascrittura
Inserito da: Gianluigi - 05 Maggio 2016, 16:15:25
Propongo questo codice:
...

Ok, qualche caffè e ora ho capito, se quello che digitiamo è superiore alla lunghezza della stringa più uno (il count del vettore bb), allora accodiamo altrimenti lo sostituiamo sovrascrivendo la posizione, ristampiamo (toString) il vettore e tutta la scritta nuova nella textbox fermando gli eventi scatenati dalla digitazione.
Qui direi che "soluzioni non convenzionali" ci può stare :D il fatto è che impedisce un "normale" funzionamento, per esempio non si può tornare indietro oppure non riconosce qualche carattere (es. £) .
 :ciao:
Titolo: Re:Modalità sovrascrittura
Inserito da: Gianluigi - 05 Maggio 2016, 16:19:10
Circa la mia proposta direi di togliere i tanti copia e incolla, ad esempio così:
Codice: [Seleziona]
Private $sFrase As String
Private $bOK As Boolean

Public Sub Form_Open()

  TextBox1.Text = "Frase di prova"
  TextBox1.Pos = 0
 
End

Public Sub TextBox1_KeyRelease()
 
  Dim s As String
  $sFrase = TextBox1.Text
  Select Key.code
      Case Key.Insert
        If TextBox1.Pos < Len($sFrase) Then
          If $bOK Then
            $bOK = False
          Else
            TextBox1.Select(TextBox1.Pos, 1)
            $bOK = True
          Endif
        Endif     
      Case Key.Space
         mySel()
   End Select
   Select Case Key.Text
     Case "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"
         mySel()
     Case "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"
         mySel()
     Case "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
         mySel()
     Case "\\", "|", "\"", "!", "£", "$", "%", "&", "/", "(", ")", "=", "?", "ì", "^", "{", "}", "~", "\'"
       mySel()
      Case "è", "é", "+", "*", "ò", "à", "ù", "°", "[", "]", "#", "@", "ç", "<", ">", "§", "€"
       mySel()
   End Select

End

Private Sub mySel()
 
  If $bOK Then
     If TextBox1.Pos < Len($sFrase) Then
       TextBox1.Select(TextBox1.Pos, 1)
     Else
       $bOK = False
     Endif
   Endif
 
End
:ciao:
Titolo: Re:Modalità sovrascrittura
Inserito da: vuott - 05 Maggio 2016, 16:27:00
Qui direi che "soluzioni non convenzionali" ci può stare
...non direi che l'uso di un vettore di tipo Byte[ ] sia una soluzione non convenzionale.
Titolo: Re:Modalità sovrascrittura
Inserito da: Gianluigi - 05 Maggio 2016, 16:36:41
Qui direi che "soluzioni non convenzionali" ci può stare
...non direi che l'uso di un vettore di tipo Byte[ ] sia una soluzione non convenzionale.

 :D Si hai ragione era per scherzare un po con quello che aveva detto Tornu... ricordi

Invece è un codice parecchio interessante che mostra in modo semplice le potenzialità di un vettore di tipo Byte, e ti ringrazio di avercelo ricordato (http://www.gambas-it.org/wiki/index.php?title=Convertire_i_valori_di_tipo_Byte_di_un_vettore_in_valori_di_tipo_Stringa)
 :ciao:
Titolo: Re:Modalità sovrascrittura
Inserito da: vuott - 05 Maggio 2016, 17:09:56
era per scherzare
L'avevo capito, ma gli eventuali principianti potrebbero interpretare in modo errato la frase, pensando che l'uso di una variabile vettoriale di tipo non strettamente corrispondente al tipo String, come lo è appunto il vettore di tipo  Byte[ ], non sia opportuno e mai conveniente nella gestione di una stringa di caratteri.....che poi non sono altro che valori da 8 bit ciascuno.  :D
Titolo: Re:Modalità sovrascrittura
Inserito da: tornu - 05 Maggio 2016, 21:19:57
Ho dovuto reinstallare completamente Ubuntu e ho fatto notte e poi... ci mancavi tu  :P
:evil:

...... e poi... ci mancavi tu  :P

     :rotfl:
:evil:
Cari ragazzi un consiglio, a certe ore...è meglio andare a dormire ;D
Veniamo ai vostri suggerimenti,
vuott
il tuo codice funziona quasi perfettamente, ma come ha fatto notare Gianluigi non è usabile in quanto impedisce
l'uso dei tasti funzione quali Frecce direzione sx e dx, Canc, BackSpace, ecc...

Gianluigi
per quanto riguardo il tuo suggerimento non sortisce nessun effetto, e come che non ci sia. L'ho provato più volte
ma niente
Titolo: Re:Modalità sovrascrittura
Inserito da: Gianluigi - 05 Maggio 2016, 21:49:53

Gianluigi
per quanto riguardo il tuo suggerimento non sortisce nessun effetto, e come che non ci sia. L'ho provato più volte
ma niente

A me funzionano tutti anche se non avevo capito bene il funzionamento che volevi ora che l'ho rivisto ho capito che serve molto meno codice.
Questo a me lavora "quasi" come Ins di Writer
Codice: [Seleziona]
' Gambas class file

Private $bOK As Boolean    ' Se Inserimento è attivo o no

Public Sub Form_Open()
' Inserisce la frase e ne porta il cursore all'inizio.

  TextBox1.Text = "Frase di prova"
  TextBox1.Pos = 0
 
End

Public Sub TextBox1_KeyRelease()
' Controlla che sia attivo l'inserimento e se ci sono caratteri da sostituire lo fa.
  Dim s As String, i As Integer
 
  s = TextBox1.Text
  Select Key.code
      Case Key.Insert, Key.Ins         
          If $bOK Then
            $bOK = False
            TextBox1.Unselect()
          Else
            TextBox1.Select(TextBox1.Pos, 1)
            $bOK = True
          Endif       
      Case Key.Left, Key.BackSpace
        i = TextBox1.Pos - 1       
        TextBox1.Select(i, 1)     
      Case Else
        TextBox1.Select(TextBox1.Pos, 1)
   End Select
   
End
Potrebbe essere che il tuo sistema riconosce solo Ins e non Insert e occorra come per Enter usare i due codici, sappimi dire.
 :ciao:
Titolo: Re:Modalità sovrascrittura
Inserito da: tornu - 05 Maggio 2016, 22:39:50
 :ok:
Vedi che in ore più consone....ragioni meglio :rotfl:
Grazie anche per aver commentato il codice  ;)
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: Gianluigi - 05 Maggio 2016, 23:09:53
 :D Diciamo che anche i commenti subiscono la mancanza di sonno.  ;D
In realtà KeyRelease si limita a selezionare il carattere successivo o come nel caso di Left e Backspace a selezionare quello precedente il resto succede di conseguenza.
Quindi il codice non sostituisce nulla.
Come avrai notato se finisci di digitare e ti sposti col tasto Left la selezione salta l'ultimo carattere.
Comunque essendo il carattere evidenziato, l'operatore non dovrebbe essere tratto in inganno.
Backspace invece funziona.
Ora chiudo e cerco di recuperare un po di sonno.  :sleepy:
Buonanotte
 :ciao:
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: vuott - 06 Maggio 2016, 00:58:00
Changeons les dames !


Sempre più difficile: con una sola riga essenziale di codice:    :D
Codice: [Seleziona]
Public Sub Form_Open()

  TextBox1.Text = "prova"

  TextBox1.Pos = 0

End


Public Sub TextBox1_KeyPress()

  If Key.Code < 220 Then TextBox1.Select(TextBox1.pos, 1)

End
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: tornu - 06 Maggio 2016, 20:53:56
Che dire
 :o :o
You're the best
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: Gianluigi - 07 Maggio 2016, 00:31:53
Changeons les dames !

(http://forum.dueruote.it/upload/2012/12/8/2d79758becd22003dd5b581fd70fc11d_7035.jpg__thumb)  (http://www.immagini-divertenti.org/wp-content/uploads/2013/11/foto-di-donne-brutte-donna-tigre.jpg)

Oui, je suis d'accord
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: vuott - 07 Maggio 2016, 00:36:16
...queste non sono  the best, ma sono "le bestie" !!!   :devil:
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: tornu - 04 Ottobre 2016, 22:28:16
Buonasera a tutti,
riapro questa discussione per chiedervi un ulteriore aiuto in merito.
Uso il codice suggeritomi in questo post (l'ultimo postato da Vuott per semplicità rispetto a quello di Gianluigi),
che funziona benissimo per l'esigenza che avevo allora, ora è sorta un'altra necessità, e cioè quella di limitare l'input
solo ai numeri, per fare questo ho inserito un controllo che funziona perfettamente, ma unito al codice di questa
discussione mi impedisce l'uso di tasti come frecce direzione, canc, backspace, ecc..
Vi allego un piccolo esempio per farvi capire meglio cosa intendo.
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: vuott - 05 Ottobre 2016, 00:06:38
...se tu avessi letto con un Print il comando Key.Code...... 


Codice: [Seleziona]
Public Sub TextBox1_KeyPress()
 
   If (Key.Code > 47) And (Key.Code < 58) Then TextBox1.Select(TextBox1.pos, 1)
   If ((Key.Code > 47) And (Key.Code < 58)) Or Key.Code > 220 Then
     Return
   Else
     Stop Event
  Endif

End
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: Gianluigi - 05 Ottobre 2016, 11:46:21
Non ho capito se vuoi che i numeri si allineino a destra, se si:
Codice: [Seleziona]
Public Sub Form_Open()

  TextBox1.Alignment = 2
  TextBox2.Alignment = 2
 
End

 :ciao:
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: tornu - 05 Ottobre 2016, 21:25:14
...se tu avessi letto con un Print il comando Key.Code...... 


Codice: [Seleziona]
Public Sub TextBox1_KeyPress()
 
   If (Key.Code > 47) And (Key.Code < 58) Then TextBox1.Select(TextBox1.pos, 1)
   If ((Key.Code > 47) And (Key.Code < 58)) Or Key.Code > 220 Then
     Return
   Else
     Stop Event
  Endif

End

Ciao vuott,
chiedo venia ma mi sono perso proprio in uno sputo... :-[

@ Gianluigi
Non hai letto con attenzione ciò che ho chiesto.... :nono:
Grazie comunque per la risposta
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: Gianluigi - 05 Ottobre 2016, 21:52:57

@ Gianluigi
Non hai letto con attenzione ciò che ho chiesto.... :nono:
Grazie comunque per la risposta

Prego, ma ho capito cosa non avrei letto con attenzione.
Ho visto questo codice:
Codice: [Seleziona]
Public Sub TextBox1_MouseUp()
  TextBox1.Alignment = 1  ' ***** Codice suggerito da Vuott
'   TextBox1.SelectAll()  ' Metodo 1
'   TextBox1.Select(0, Len(TextBox1.Text))  ' Metodo 2
End

E dato che non mi sembravi particolarmente ispirato ho completato così il codice di vuott:
Codice: [Seleziona]
' Gambas class file


Public Sub Form_Open()

  TextBox1.Alignment = 2
  TextBox2.Alignment = 2
 
End


Public Sub TextBox1_KeyPress()
 
   If (Key.Code > 47) And (Key.Code < 58) Then TextBox1.Select(TextBox1.pos, 1)
   If ((Key.Code > 47) And (Key.Code < 58)) Or Key.Code > 220 Then
     Return
   Else
     Stop Event
   Endif

End

Public Sub TextBox1_Activate()
  TextBox2.Text = TextBox1.Text
End
Titolo: Re:[RISOLTO] Modalità sovrascrittura
Inserito da: vuott - 05 Ottobre 2016, 22:50:03
Codice: [Seleziona]
  TextBox1.Alignment = 1  ' ***** Codice suggerito da Vuott
'   TextBox1.SelectAll()  ' Metodo 1
'   TextBox1.Select(0, Len(TextBox1.Text))  ' Metodo 2
End
...ma....... non mi pare che questa parte di codice sia mia !    :rolleyes: