sábado, 30 de julio de 2011

8.2 Añadiendo la función Ordenar

n este capítulo vamos a añadir otra interesante subrutina a nuestro supergridviews, se trata de hacer que ordene las filas del gridviews, proporcionandole la columna con la queremos que se ordene.

De nuevo, abrimos nuestro proyecto “supergridviews” y vamos a la clase supergridviews añadiendo el siguiente código :

la sección 3 (zona donde definimos la variables):
'-----------------------------------------------------------
'variables para llevar el control de ordenar
'-----------------------------------------------------------
PRIVATE ordenadoalgunavez AS Boolean 'comprueba si se ha ordenado algunavez
PRIVATE titulosiniciales AS String 'almacena los titulos de las columnas incialmente antes de ordenar
PRIVATE ordenactual AS String 'indica como esta actualmente ordenador el gridviews


y en la seccion 4 (subrutinas y funciones):
'------------------------------------ ordenar por columnas --------------------------------
'-------------------------------------------
'guarda los titulos actuales
'-------------------------------------------
Public SUB guardartitulosiniciales()
DIM a AS Integer
FOR a = 0 TO ME.columns.count - 1
titulosiniciales = titulosiniciales & ME.columns[a].title & "|"
NEXT
END

'-------------------------------------------
' se restauran los titulos que tenemos almacenados cuando ejecutamos “guardartitutlosiniciales” de las columnas
'-------------------------------------------
PUBLIC SUB restaurartitulosiniciales()
DIM antiguotitulo AS String[]
DIM a AS Integer
' añadido para corregir un error si no estaban ya los titulos iniciales guardados
if titulosiniciales<>”” then
antiguotitulo = Split(titulosiniciales, "|")
FOR a = 0 TO ME.columns.count - 1
ME.columns[a].text = antiguotitulo[a]
NEXT
else
guardartitulosiniciales()
END
END


PUBLIC SUB ordenar(columna AS Integer, OPTIONAL AZ_o_ZA AS String)
IF ordenadoalgunavez = FALSE THEN
guardartitulosiniciales()
ordenadoalgunavez = TRUE
ordenactual = "AZ"
ENDIF
IF AZ_o_Za = "AZ" THEN
ord_AZ(columna)
ordenactual = "AZ"
STOP EVENT
ENDIF
IF AZ_o_Za = "ZA" THEN
ord_ZA(columna)
ordenactual = "ZA"
STOP EVENT
ENDIF
IF AZ_o_Za = "" THEN
IF ordenactual = "AZ" THEN
ord_ZA(columna)
ordenactual = "ZA"
ELSE
ord_AZ(columna)
ordenactual = "AZ"
ENDIF
ENDIF
END



'------------------------ordenar AZ------------------------------------------------
'a: indica la columna a la que ordenamos

PRIVATE SUB ord_AZ(a AS Integer)
DIM limite AS Integer
DIM cambio1 AS String
DIM i AS Integer
DIM j AS Integer
DIM col AS Integer
'version 3.1
DIM antiguotitulo AS NEW String[]
ME.visible = FALSE
limite = ME.Rows.Count
'añadido version 3.1
antiguotitulo = Split(titulosiniciales, "|")

IF (ME.Columns.Count < a + 1) OR a < 0 THEN
Message.Error("Error en la columna introducida para ordenar")
GOTO salidaordenar
END IF

FOR i = 0 TO ME.Columns.count - 1
IF Mid$(ME.Columns[i].text, 1, 3) = "↓" OR Mid$(ME.Columns[i].text, 1, 3) = "↑" THEN
ME.Columns[i].Text = antiguotitulo[i]
ENDIF
NEXT
ME.Columns[a].Text = "↓" & antiguotitulo[a]
'fin añadido 3.1
FOR i = 0 TO limite - 1
FOR j = 0 TO limite - 2
IF UCase$(ME[j, a].Text) > UCase$(ME[j + 1, a].Text) THEN
FOR col = 0 TO ME.Columns.Count - 1
cambio1 = ME[j, col].Text
ME[j, col].text = ME[j + 1, col].Text
ME[j + 1, col].text = cambio1
NEXT
END IF
NEXT
NEXT
ME.Refresh()
salidaordenar:
ME.visible = TRUE
END
'------------------------ordenar ZA------------------------------------------------
'a: indica la columna a la que ordenamos

PRIVATE SUB ord_ZA(a AS Integer)
DIM limite AS Integer
DIM cambio1 AS String
DIM i AS Integer
DIM j AS Integer
DIM col AS Integer
DIM nuevotitulo AS String
'version 3.1
DIM antiguotitulo AS NEW String[]

ME.visible = FALSE
limite = ME.Rows.Count
'añadido 3.1
antiguotitulo = Split(titulosiniciales, "|")
IF (ME.Columns.Count < a + 1) OR a < 0 THEN
Message.Error("Error en la columna introducida para ordenar")
GOTO salidaordenar
END IF

FOR i = 0 TO ME.Columns.count - 1
IF Mid$(ME.Columns[i].text, 1, 3) = "↓" OR Mid$(ME.Columns[i].text, 1, 3) = "↑" THEN
ME.Columns[i].Text = antiguotitulo[i]
ENDIF
NEXT
ME.Columns[a].Text = "↑" & antiguotitulo[a]

'ver método de ordenacion se puede mejorar mucho....
FOR i = 0 TO limite - 2
FOR j = i TO limite - 1
IF UCase$(ME[i, a].Text) <= UCase$(ME[j, a].Text) THEN
FOR col = 0 TO ME.Columns.Count - 1
cambio1 = ME[j, col].Text
ME[j, col].text = ME[i, col].Text
ME[i, col].text = cambio1
NEXT
END IF
NEXT
NEXT
ME.Refresh()
salidaordenar:
ME.visible = TRUE
END

Y guardamos, hacemos el ejecutable y cerramos el proyecto “supergridviews”.

Ahora vamos a probarlo: Abrimos otra vez el programa “pruebacomponente”
Y escribimos el siguiente código en el Fmain:

PUBLIC SUB supergridviews1_Click()
'se restauran los titulo iniciales (quitamos la flechas)
supergridviews1.restaurartitulosiniciales()
END

PUBLIC SUB supergridviews1_ColumnClick(Column AS Integer)
'ordenamos según la columna del titulo donde hemos hecho click
supergridviews1.ordenar(column)
END








Ejemplo el programa “pruebacomponente”:




Haciendo click en el título de la columna Id, vemos como se ordena dicha columna (aparece una flecha, para indicarnos el orden de la ordenación)


Si volvemos hacer click en el mismo título, se cambia el sentido del orden y de la flecha.


Si pulsamos en otra columna,
se ordenara por esa columna


Haciendo click en alguna celda, aparecen los títulos iniciales (desaparece la flecha)

No hay comentarios:

Publicar un comentario