Shell   28-12-2022, 00:37
#1
Buenas!.

TextBox soporta el método Insert para escribir en el lugar del cursor del ratón.
Mi idea era cambiar a mayúscula o convertir a mayúsculas lo que se escriba, en este caso solo un carácter y parar el evento.
Esto lo hago en un TextBox.

Código:
Public Sub Form_Open()

  With TextBox1
    .Font = Font["Mono noto,Bold, 24"]
  End With

End

Public Sub TextBox1_KeyPress()

  TextBox1.Insert(Upper(Key.Text))
  Stop Event

End

Pero en un TableView no veo la forma adecuada.

Código:
Public Sub Form_Open()

  With TableView1
    .Rows.Count = 15
    .Columns.Count = 1
    .Font = Font["Mono noto, Bold, 24"]
  End With

End


Public Sub TableView1_Click()

  TableView1.Edit

End


Public Sub TableView1_Save(Row As Integer, Column As Integer, Value As String)

  If Len(TableView1.Current.Text) >= 1 Then
    Stop Event
  Else
    TableView1[Row, Column].Text = Upper(Value)
  Endif


End

El texto continua escribiéndose y al pulsar intro se convierte a mayúscula.
Probablemente diréis que por que no uso el evento KeyPress, no me soluciona mucho.
Algo así tampoco muestra la letra pulsada en la celda.

Código:
Public Sub TableView1_KeyPress()

  Message.Info("La tecla pulsada es: " & Key.Text)

End

En la ayuda de Gambas dice que soporta Insert, pero no parece el mismo comportamiento que TextBox.
 
Cita: 
This event is raised when the user requested an insertion by hitting the RETURN key inside the bottom-right cell.

Saludos
Última modificación: 28-12-2022, 00:44 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   29-12-2022, 14:04
#2
Tableview dispone de la propiedad "Editor" que es una referencia al control que se esté utilizando para edición (textbox o combobox). Deberías poder hacer con ella lo mismo que con un textbox individualizado.
Es cosa de probar

No podemos regresar
Shell   29-12-2022, 14:50
#3
(29-12-2022, 14:04)Shordi escribió: Tableview dispone de la propiedad "Editor" que es una referencia al control que se esté utilizando para edición (textbox o combobox). Deberías poder hacer con ella lo mismo que con un textbox individualizado.
Es cosa de probar

Estoy en ello. Por eso estuve con el ejemplo del textbox para que solo permitiese la pulsación de una sola tecla.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   29-12-2022, 19:57
#4
La solución es con el apoyo de un observador para el control TextBox interno.

Código:
' Gambas class file

Private tb As TableView
Private masdeuncaracter As Boolean
Private miobservador As Observer

Public Sub Form_Open()

  With Me
    .w = 170
    .h = 170
    .Center()
  End With

  tb = New TableView(Me) As "ManipulaTabla"
  With tb
    .Rows.Count = 5
    .Columns.Count = 1
    .Font = Font["Noto Mono, Bold 24"]
    .W = 150
    .H = 150
    .Left = 10
    .Top = 10
  End With


End

Public Sub ManipulaTabla_Click()

  Dim tbxeditor As TextBox

  tb.Edit()
  tbxeditor = tb.Editor
  miobservador = New Observer(tbxeditor) As "ManipulaCTexto"

End

Public Sub ManipulaTabla_Save(row As Integer, column As Integer, value As String)

  tb[row, column].text = value

End

Public Sub ManipulaCTexto_Change()

  If Len(Last.text) >= 1 Then masdeuncaracter = True

End

Public Sub ManipulaCTexto_KeyRelease()

  masdeuncaracter = False

End

Public Sub ManipulaCTexto_KeyPress()

  If masdeuncaracter Then
    Stop Event
  Else
    Last.Insert(Upper(Key.Text))
    Stop Event
  Endif

End

El problema que tenía es como manipular los eventos la caja de texto interno del TableView.

Os subo el ejemplo. El efecto que quería lograr es el mismo que hice hace poco con la caja de texto, que permitiese escribir solo un carácter cada vez que pulsamos
una tecla.

Saludos

Y si cambiamos el evento KeyPress por este, ya no puede escribirse más de un carácter en cada celda.

Código:
Public Sub ManipulaCTexto_KeyPress()

  If masdeuncaracter Or Len(Last.text) >= 1 Then
    Stop Event
  Else
    Last.Insert(Upper(Key.Text))
    Stop Event
  Endif

End
Archivos adjuntos
.gz
PropiedadEditorTableView-0.0.2.tar.gz (Tamaño: 12.03 KB Descargas: 0)
Última modificación: 29-12-2022, 20:09 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   30-12-2022, 19:23
#5
Y si lo cambias por este tampoco:

Código:
Public Sub TextBox1_KeyPress()

  If String.Len(TextBox1.text) > 0 Then Stop Event

End

... además de no necesitar masdeuncaracter ni nada más. Con eso mi propuesta es:

Código:
' Gambas class file

Private tb As TableView
Private miobservador As Observer
Private tbxeditor As TextBox

Public Sub Form_Open()

  With Me
    .w = 170
    .h = 170
    .Center()
  End With

  tb = New TableView(Me) As "ManipulaTabla"
  With tb
    .Rows.Count = 5
    .Columns.Count = 1
    .Font = Font["Noto Mono, Bold 24"]
    .W = 150
    .H = 150
    .Left = 10
    .Top = 10
  End With

End

Public Sub ManipulaTabla_Click()

  tb.Edit()
  tbxeditor = tb.Editor
  miobservador = New Observer(tbxeditor) As "ManipulaCTexto"

End

Public Sub ManipulaTabla_Save(row As Integer, column As Integer, value As String)

  tb[row, column].text = value

End

Public Sub ManipulaCTexto_KeyPress()

  If String.Len(tbxeditor.text) > 0 Then Stop Event

End

Verás que declaro el tbxeditor como private, menos lío para el compilador a la hora de crear y destruir las referencias al control, pero no por ello mejor que hacerlo local.

Saludos
Última modificación: 30-12-2022, 19:26 por Shordi.

No podemos regresar
Shell   30-12-2022, 22:54
#6
(30-12-2022, 19:23)Shordi escribió: Verás que declaro el tbxeditor como private, menos lío para el compilador a la hora de crear y destruir las referencias al control, pero no por ello mejor que hacerlo local.

Al cerrar el formulario debería de liberar las referencias de alguna forma. Más o menos lo que debería hacer Quit.

Gracias por la optimización.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 6 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.