Autore Topic: [RISOLTO] Modalità sovrascrittura  (Letto 1668 volte)

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
[RISOLTO] Modalità sovrascrittura
« il: 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.
« Ultima modifica: 05 Maggio 2016, 22:40:45 da tornu »
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #1 il: 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:
« Ultima modifica: 05 Maggio 2016, 14:05:38 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #2 il: 05 Maggio 2016, 03:25:09 »
...... e poi... ci mancavi tu  :P

     :rotfl:
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #3 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #4 il: 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 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.
« Ultima modifica: 05 Maggio 2016, 14:04:14 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #5 il: 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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #6 il: 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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #7 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #8 il: 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
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #9 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #10 il: 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
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #11 il: 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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re:Modalità sovrascrittura
« Risposta #12 il: 05 Maggio 2016, 22:39:50 »
 :ok:
Vedi che in ore più consone....ragioni meglio :rotfl:
Grazie anche per aver commentato il codice  ;)
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:[RISOLTO] Modalità sovrascrittura
« Risposta #13 il: 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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:[RISOLTO] Modalità sovrascrittura
« Risposta #14 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »