tincho 15-04-2021, 16:38
Hola a todos.
En respuesta a Shell que proponía un ejemplo de como ordenar los elementos de un TableView, se me ocurrió proponer otra forma sin usar el evento _Data.
Código:
' Gambas class file

Private aState As Integer[]
Private aNamesSorted As New String[]
Private aAgesSorted As New Integer[]

Private aNames As String[] = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"]
Private aAges As New Integer[]
Private iLast As Integer = -1

Public Sub Form_Open()

  Dim i As Integer

  For i = 0 To aNames.Max
    aAges.Add(Rand(1, 100))
  Next

  aState = [0, 0]
  FormatTable(TableView1)

  aNamesSorted = aNames.Copy()
  aAgesSorted = aAges.Copy()

  DataTable(TableView1)

End

Public Sub FormatTable(tv As TableView)

  Dim r As Integer

  tv.Header = GridView.Horizontal
  tv.Columns.Count = 2
  tv.Rows.Count = aNames.Count
  'tv.Sorted = True
  tv.Columns[0].Title = ("Name")
  tv.Columns[1].Title = ("Age")

End

Public Sub DataTable(tv As TableView)

  Dim r As Integer

  For r = 0 To aNamesSorted.Max
    tv[r, 0].Text = aNamesSorted[r]
    tv[r, 1].Text = aAgesSorted[r]
  Next

End

Public Sub TableView1_ColumnClick(Column As Integer)

  Dim age As Integer
  Dim Name As String
  Dim id As Integer

  Select Column
    Case 0
      aNamesSorted.Clear
      aAgesSorted.Clear

      If aState[Column] = 0 Then
        aNamesSorted = aNames.Copy()
        aAgesSorted = aAges.Copy()
        aState[Column] = 1
      Else

        If aState[Column] = 1 Then
          aNamesSorted = aNames.Copy().Sort(gb.Ascent)
          aState[Column] = -1
        Else
          aNamesSorted = aNames.Copy().Sort(gb.Descent)
          aState[Column] = 0
        Endif

        For Each Name In aNamesSorted
          id = aNames.Find(Name)
          If id > -1 Then
            aAgesSorted.Add(aAges[id])
          Endif
        Next

      Endif

    Case 1
      aNamesSorted.Clear
      aAgesSorted.Clear

      If aState[Column] = 0 Then
        aAgesSorted = aAges.Copy()
        aNamesSorted = aNames.Copy()
        aState[Column] = 1
      Else

        If aState[Column] = 1 Then
          aAgesSorted = aAges.Copy().Sort(gb.Ascent)
          aState[Column] = -1
        Else
          aAgesSorted = aAges.Copy().Sort(gb.Descent)
          aState[Column] = 0
        Endif

        For Each age In aAgesSorted
          id = aAges.Find(age)
          If id > -1 Then
            aNamesSorted.Add(aNames[id])
          Endif
        Next

      Endif

  End Select

  DataTable(TableView1)

End
Saludos.
Shell 15-04-2021, 14:01
Buenas!.

Pues ya que estamos. Tengo una tabla tal como esta.

[Imagen: 1c1Gyun.png]

Tiene dos columnas, nombres y edades por ejemplo. La columna de las edades es editable.
Me gustaría ordenarla tanto por nombres como edades y un orden que sea "natural" ( por decirlo de alguna manera).

Como tal, no son números lo que vemos en la tabla, son textos o caracteres. De ahí el problema.

De principio este es el código:

Código:
Private nombres As New String[]
Private edades As New Byte[]

Public Sub Form_Open()

  nombres = ["Ana López Ruíz", "Carlos García Domingo", "José Zampaña Castillo", "Olivia Torres Ramirez",
    "Antonio Pardo Casas", "María Castro Arenas", "Luis Cavanillas Torres", "Enrique Duarte Panda",
    "Manuel Bonilla Perez", "Elisa Gutierrez Loma"]

  With tbEjemplo
    .Header = tbEjemplo.Horizontal
    .Rows.Count = nombres.Count
    .Columns.Count = 2
    .Columns[0].Title = "Nombres"
    .Columns[0].Alignment = Align.Center
    .Columns[1].Title = "Edades"
    .Columns[1].Alignment = Align.Center
    .Sorted = True  
  End With

  edades.Resize(nombres.Count)

End

Public Sub tbEjemplo_Data(Row As Integer, Column As Integer)

  If Column = 0 Then tbEjemplo[Row, 0].Text = nombres[Row]
  If Row Mod 2 = 0 Then tbEjemplo[Row, Column].Background = &hDDDDFF
  tbEjemplo.Columns[0].Width = -1 'Ancho automático

End

Public Sub tbEjemplo_Activate()

  If tbEjemplo.Column = 0 Then tbEjemplo.Edit

End

Public Sub tbEjemplo_Click()

  If tbEjemplo.Column = 1 Then tbEjemplo.Edit

End

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

  tbEjemplo[Row, Column].Text = Value
  If Column = 1 Then
    edades[Row] = Value
  Else
    nombres[Row] = Value
  Endif

End

Public Sub tbEjemplo_ColumnClick(Column As Integer)

  tbEjemplo.Save

  With tbEjemplo
    '.Sorted = True
    .Columns.Sort = Column
  End With  
  OrdenarTabla(tbEjemplo, Column, tbEjemplo.Columns.Ascending, Column = 1)
    
End

Public Sub OrdenarTabla(latabla As TableView, Column As Integer, ascendente As Boolean, numerico As Boolean)

  Dim z As New String[]
  Dim y As New String[]
  Dim s As String
  Dim i, j As Integer

  For i = 0 To latabla.Rows.Max
    If numerico Then
      s = latabla[i, Column].Text
      s = String(5 - Len(s), "0")
    Else
      s = latabla[i, Column].Text
    Endif
    For j = 0 To latabla.Columns.Max
      s &= "-" & latabla[i, j].Text
    Next
    z.Add(s)
  Next

  If ascendente Then
    z.Sort(gb.Ascent)
  Else
    z.Sort(gb.Descent)
  Endif

  For i = 0 To z.Max
    y = Split(z[i], "-")
    For j = 1 To y.Max
      latabla[i, j - 1].Text = y[j]
    Next
  Next

End

'Modificado para el ejemplo usando el disponible en la ayuda online de Gambas
' Public Sub tbEjemplo_Sort()
'
'   Dim Values, ValueSorted As New String[]
'   Dim Nx, iNx As Integer
'
'   ' Load sort column into string array
'   For Nx = 0 To tbEjemplo.Rows.Max
'     Values.Add(tbEjemplo[Nx, tbEjemplo.Columns.Sort].Text)
'   Next
'
'   ' Copy values to new array and sort it based on status of sort indicator
'   ValueSorted = Values.Copy()
'   ValueSorted.Sort(IIf(tbEjemplo.Columns.Ascending, gb.Ascent, gb.Descent))
'
'   ' Iterate through table swapping appropriate values
'   For Nx = 0 To ValueSorted.Max
'     For iNx = 0 To tbEjemplo.Columns.Max
'       Swap tbEjemplo[Nx, iNx].Text, tbEjemplo[Values.Find(ValueSorted[Nx], 0, Nx), iNx].Text
'     Next
'
'     ' Pick up new order to preserve proper handling of indexing and duplicate values
'     Values.Clear()
'     For iNx = 0 To tbEjemplo.Rows.Max
'       Values.Add(tbEjemplo[iNx, tbEjemplo.Columns.Sort].Text)
'     Next
'   Next
'
'   tbEjemplo.Refresh()
'
' End

No tengo problema con ordenar los nombres, pero si con los números.
Con los nombres:

[Imagen: ZmoIYn2.png]

Con los números (texto).

[Imagen: ztUzgWi.png]

 ¿ Qué estoy haciendo mal ?.

Podría crear un array y ordenar esos números y luego mostrarlos, pero entonces,¿ que hago con la columna de los nombres ?.
¿ Qué debería hacer para que quedasen juntos el nombre y la edad en su fila correspondiente al ordenarse ?.

Marchando el código.

Algo complicado...(Esto hubiera sido otro mensaje, contestando al anterior..pero es otro lio con el editor).
O al menos no encuentro la forma adecuada.

17.7.4 GridView - Sorting the data

El ejemplo se puede bajar en alemán, se puede traducir. Desde Gambas se puede traducir ciertas partes de la aplicación. Lo que vemos
se traduce, el contenido de un botón, la parte visual de un formulario.

Pregunto. Si el ejemplo si se sube a la comunidad. ¿ En que  idioma debe subirse ?

"Sprichst du Deutsch ? "

En parte me parece enrevesado, crear una clase. Y por otro lado que aún no se haya solucionado o pretendido dar una solución en el IDE de Gambas.
O es propio de la librería.

Saludos
Archivos adjuntos
.gz
EjemploConTabla-0.0.1.tar.gz (Tamaño: 12.72 KB Descargas: 2)
Shell 15-04-2021, 13:18
Buenas!.

En el tutorial de Gambas que estaba leyendo para repasar encontré sentencias o formas de escribir el código de otra manera.
Pueden cambiarte la forma de escribir ciertas instrucciones en Gambas.

Supongamos el for, que se me hace muy raro. Nosotros declaramos en una línea la variable y luego la usaríamos en el bucle.
Ahora que veo la forma me recuerda en parte a "Java".

Código:
Public Sub Ejemplo2()
 
  For a As Integer = 0 To 10
    Print "Paso " & a
  Next
 
End

¿ Qué pasa en esa línea ?.

Bien, pues que en el caso de que solo vayamos a usar la variable "a" una vez puede valernos.
Si esa misma variable la usáramos en otra parte del mismo procedimiento o función, no nos vale y debemos hacerlo
de la forma tradicional.

Otra es el no declarar las variables automáticamente.. jajaja..

Creo que he visto algo más, pero ahora no me acuerdo (la fuerza de la costumbre. Tongue )

¿ Qué otras habéis visto vosotros y os acordaís ?.

Posiblemente conozcáis el pdf.  Ah, pues mejor os muestro la wiki. Si ya quereís bajaros el pdf, seguro que lo encontráis.

Programming Gambas from Zip

Tiene cosas que a vece me choca, cada uno escribe el  código como quiere. Las declaraciones de las variables me mata en ciertas partes del libro.
Opino que si quieres enseñar tienes que enseñar bien a hacer las cosas desde el principio. Hay que ir "modelando" una buena forma de hacer
las cosas. Pero no quiero quitarle meritos al que ha creado el tutorial. En los libros pasa igual. No hay nada perfecto. Bueno si...yo. Que era coña.. Big Grin

Dejé parado el libro cuando llegué al tema de ordenar un TableView o GridView. Si, la propiedad sort que no existe como tal.
Comencé a liarme a buscar códigos parecidos, de Vuott, de otros compañeros. Pero me parece que no acabé de solucionar el problema.
A ver si con tranquilidad os subo un ejemplo y hablamos de soluciones. A veces cuando leo y encuentro algo que no entiendo, no paro,
no encuentro solución y me frusto, me fusto mucho!.

Saludos y buen día.
Páginas (551):    1 448 449 450 451 452 551   
Bienvenido, Invitado
Tienes que registrarte para poder participar en nuestro foro.
Recordarme?
Miembros: 279
Último miembro: pepe70
Temas del foro: 1,700
Mensajes del foro: 8,832
Últimos temas
gb.db2: columnas calculad...
Foro: Bases de Datos
Último mensaje por: Shordi, Ayer, 12:16
Respuestas: 13 - Vistas: 452
Gambas + ERP = GamERP.
Foro: Aplicaciones/Fragmentos de Código
Último mensaje por: tercoide, 30-04-2025, 15:57
Respuestas: 25 - Vistas: 2,005
Manejando imágenes desde ...
Foro: Videotutoriales
Último mensaje por: Shordi, 30-04-2025, 06:00
Respuestas: 2 - Vistas: 99
Imprimir resultados en el...
Foro: General
Último mensaje por: Turriano, 28-04-2025, 11:53
Respuestas: 5 - Vistas: 185
¿ Qué hay de nuevo en la ...
Foro: Instalación
Último mensaje por: tercoide, 27-04-2025, 15:20
Respuestas: 2 - Vistas: 122
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.