Autor Tema: MsFlexGRID  (Leído 14582 veces)

0 Usuarios y 1 Visitante están viendo este tema.

pedroesca

  • Megabyte
  • ***
  • Mensajes: 206
  • Reputación: +19/-0
  • "El conocimiento es libre"
    • Ver Perfil
MsFlexGRID
« en: Febrero 18, 2012, 11:36:37 am »
Buenas a todos! Antes de mi pregunta, y para suavizar un poco las mangueadas o peticiones respecto a mi alto grado de ignorancia en la mayoría de los aspectos de la programación en VB6, voy a contar una breve reseña y/o anécdota como introducción al tema que atañe en este momento:
Siempre tuve un dilema respecto a la utilización de las grillas,  cuando aprendí a programar cuestiones de grids, lo hice utilizando el FlexGrid básico, común y corriente, incorporado al vb, pero sentía un vacío, como que "le faltaba algo", y era que no me gustaba "como se veía", entonces busqué otros recursos como el Listview, un par de grillas de código abierto que andaban dando vueltas por la web, hasta que me topé con el SGrid (de vbaccelerator.com) y quedé maravillado, era preciosa, mucho mas veloz en cuanto a carga, visualmente adoptaba varios estilos.
Y como es obvio, la comencé a utilizar y adaptar incluso en varios proyectos que estaban funcionando (si, lo se, no se debe hacer), solo atraído por su belleza, sin importarme "lo de adentro", hasta que comenzó a tener ciertos bugs, no muy frecuentes, luego aparecieron con mas frecuencia, hasta que dichos bugs comenzaban a COLGAR LA APLICACIÓN y cerrarla, por lo cual tomé una decisión drástica, DEJAR DE USARLA, como quien no quiere dejar de fumar (yo fumo actualmente).
Y entonces, hice como hacen muchos, volví con "mi primer y antigua novia", la mal ponderada y mal criticada FLEXGRID, y le encontré los puntos fuertes, encontré que es la mas personalizable y "flexible" (como lo dice su nombre), y con un poco de imaginación, creatividad y una pizca de código, se pueden hacer mil maravillas, aunque no lo crean.

Bueno, toda esa introducción fue para darle un toque mas "poético" a la cuestión, para que no sea tan frío el post  ;). En fin, un asunto que me está trabando es justamente algo muy importante, y es la CARGA DE REGISTROS / FILAS en la grilla, básicamente, lo está haciendo muy lento, ni hablar de cargarle 1000 registros. Lo estoy haciendo de esta manera:
Código: [Seleccionar]
Public Sub CargaFlexGRID(rx As ADODB.Recordset, f As Form, Grilla As MSFlexGrid)
    With Grilla
        .Clear
        .Rows = rx.RecordCount + 1
        .Cols = rx.Fields.Count + 1
            For I = 1 To rx.Fields.Count
                .Row = 0
                .Col = I
                .Text = rx.Fields(I - 1).Name
            Next I
            For I = 1 To rx.RecordCount
                For J = 1 To rx.Fields.Count
                    .Row = I
                    .Col = J
                    .Text = rx.Fields(J - 1).Value
                Next J
                rx.MoveNext
            Next I
    End With
End Sub

Y también noto dicho comportamiento lento, al aplicarle un mísero formato de fuentes (FONTS) en sus celdas.
No se si es mi PC la que anda mal (xq necesita urgente un format) o realmente esta grilla se comporta así, desearía saber que criterios manejais vosotros con respecto a las grillas.

Desde ya muchas gracias.

Saludos desde Argentina.
"Si yo tengo una idea, tú otra, y la compartimos, ambos tendremos DOS ideas"

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:MsFlexGRID
« Respuesta #1 en: Febrero 18, 2012, 01:40:26 pm »
Doctor, la carga la estas haciendo a mano??
El grid se puebla en una patada...:
Código: (VB) [Seleccionar]
Dim rs As New ADODB.Recordset
rs.Open sql, dB, 1, 1
Set Grid1.DataSource = rs

Y si cargaste en ese grid 1000 registros y quieres darle un toque visual, pintando las celdas, poniendo otro font a ciertas celdas, formateando los números, etc etc o quizá por alguna otra razón lo pueblas a mano , hazlo pero antes:

Grid1.Visible = False
Todo tu codigo de pintado
Grid1.Visible = True

Va veloz.

Te recomiendo mejor el MSHFlexGrid que es el que uso, este ademas de todo lo que tiene el MSFlexGrid te permite consultas jerárquicas.
« última modificación: Febrero 18, 2012, 02:17:27 pm por YAcosta »
Me encuentras en YAcosta.com

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:MsFlexGRID
« Respuesta #2 en: Febrero 18, 2012, 03:06:15 pm »
Saludos Pedro e Yvan !!! ;D

Yo usaba el antiguo Grid (¿se acuerda alguno?), despues el FlexGrid (un poco, claro) pero atarído por los "tentáculos seductores" del ListView, fue el que empecé a utilizar oficialmente :o.

Pero, al pasar el tiempo, en este "matrimonio" me dí cuenta que hacía falta algo de "sabor en esta relación", y he estado "flirteando" muy ligeramente (per apenas !!!) con MSFlexGrid, pero no hemos llegadoa a nada !!! y estoy pensando "pedirle el divorcio" al ListView o llevar una relación "más liberal" y forma un "triángulo amoros informático" entre ListView, MSFlexGrid y yo !!!

Bueno despues de este "drama informático-pasional" que les conté (tratando de seguir tu "onda literaria, Pedro !!! ;D), es por si me pueden dar una orientación o un ejemplo, de como sacarle "el jugo" a estos controles !!!

Saludos y un abrazo a uds hermanos desde Venezuela !!!
(Venezuela libre a partir del 7/10/2012)
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:MsFlexGRID
« Respuesta #3 en: Febrero 18, 2012, 03:15:12 pm »
Insisto, cásense con el MSHFlexgrid :-) hace mas cosas, aguanta bien, no se queja ni jode.

(Venezuela libre a partir del 7/10/2012 ?)   :) :) :)
Me encuentras en YAcosta.com

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:MsFlexGRID
« Respuesta #4 en: Febrero 18, 2012, 03:27:29 pm »
Mi hermano, el 07/10/2012, son las elecciones presidenciales, gobernadores y alcaldes en nuestro país, y ese día nos liberamos de "una plaga" que tenemos por más de 12 años !!! por que ya le salió un fortísimo candidato de "la oposición" que le está "roncando bien duro" al presidente Huguito (papá de Humala) y el tipo está dando todas las demostraciones (él y sus seguidores) de que está como "palo de gallinero" osea bien "cagado" !!! y en fin...

Bueno si leiste completo, si voy a aceptar "en matrimonio" al MSFlexGrid, pero lo que te dije, como usarlo, como modificar los encabezados de columnas para que muestre por ejemplo nombres de campos que yo le coloque (y no los verdaderos, como están en la tabla), como personalizarlos, etc !!!

Saludos !!!
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:MsFlexGRID
« Respuesta #5 en: Febrero 18, 2012, 03:28:06 pm »
el tema es asi:

Datagrid = control lindo carga rapido, feo control, horrible interfaz.
MSHFlexgrid = carga rapido, mucha personalizacion, es el mejor.
ListView = no carga tan rapido como el anterior, mucha personalizacion, es tambien para usar.

como dijo Ivan usa el MSHFlexgrid , y cargalo con el datasource, yo lo uso asi y me carga 7 mil registros en menos de un segundo.

esta es una funcion que uso para cargar el MSHFlexgrid , ya que como dijeron , por mas que lo carges con el datasurce, debes hacer un trabajito extra para que tengas las cabeceras de las columnas con los nombres que vos quieras, esta funcion te permite crear las columnas que quieras, asignarles un nombre y color de cabecera y el ancho mismo, si le pones 0 de ancho la ocultas, esta muy bueno ya que tenes todo lo que podes querer.

Código: (vb) [Seleccionar]
Private Sub CargarGrilla()
    Dim ww As Long, cc As Long
   
    flexSectores.Redraw = False
    flexSectores.Rows = 1
    flexSectores.FixedRows = 0
    flexSectores.Rows = 0
   
    flexSectores.DataMember = rsDatos.DataMember
    Set flexSectores.DataSource = rsDatos.DataSource

    flexSectores.AddItem "", 0
   
    If flexSectores.Rows > 1 Then flexSectores.FixedRows = 1
   
    flexSectores.ColWidth(0) = 1000
    flexSectores.ColWidth(1) = 7300
    flexSectores.ColWidth(2) = 0
       
    ww = 70
    For cc = 0 To flexSectores.Cols - 1
        ww = ww + flexSectores.ColWidth(cc)
    Next
    If flexSectores.RowHeight(0) * flexSectores.Rows > flexSectores.Height Then
        ww = ww + 240
    End If
   
    flexSectores.TextMatrix(0, 0) = "Código"
    flexSectores.TextMatrix(0, 1) = "Nombre"
   
    flexSectores.Row = 0
    For cc = 0 To flexSectores.Cols - 1
        flexSectores.col = cc
        flexSectores.CellBackColor = vbBlack
        flexSectores.CellForeColor = vbWhite
    Next
   
    flexSectores.Redraw = True
End Sub

esta rutina simple tiene todo lo que podes necesitar.

te explico basicamente lo que hace.

1 - deshabilita el repintado con Redraw = False, ya que al cargar por ejemplo unos miles de registros, el control parpadea o lo que se llama "flickering", con esto evitas eso, luego lo habilitas una vez que termino de cargar todo.

2 - luego se enlaza con el recordset:

Código: (vb) [Seleccionar]
    flexSectores.DataMember = rsDatos.DataMember
    Set flexSectores.DataSource = rsDatos.DataSource

3 - agrega un item vacio (este truco sirve para armar el encabezado con este item) y luego lo hace "fixed" o sea lo hace "un item fijo" como las cabeceras de las grillas. con la linea:

Código: (vb) [Seleccionar]
flexSectores.FixedRows = 1
luego viene lo divertido con las columnas.

4 - este codigo:

Código: (vb) [Seleccionar]
    flexSectores.ColWidth(0) = 1000
    flexSectores.ColWidth(1) = 7300
    flexSectores.ColWidth(2) = 0

ahi le pones la longitud que queres que tengan las columnas que vas a tener el la grilla. yo por ejemplo aca tengo 3 columnas, pero la ultima columna (la que tiene indice 2) la hago invisible con ponerle el ancho a 0.

con esto podes agregar las columnas que desees y oculatar las que desees.

5 - luego con este codigo:

Código: (vb) [Seleccionar]
   flexSectores.TextMatrix(0, 0) = "Código"
    flexSectores.TextMatrix(0, 1) = "Nombre"

aca les pones el "titulo" de cada columna (antes le pusimos el ancho) ahora toca poner el titulo.

acordarse siempre de poner bien los indices de las columnas y que estos comienzen desde 0.

6 - por ultimo este codigo:

Código: (vb) [Seleccionar]
flexSectores.Row = 0
For cc = 0 To flexSectores.Cols - 1
        flexSectores.col = cc
        flexSectores.CellBackColor = vbBlack
        flexSectores.CellForeColor = vbWhite
    Next

pinta la cabecera, negro el fondo y blanca la letra, aca podes jugar con los colores que quieras.

llama a esta funcion una vez que el recordset este lleno y listo.

saludos.
« última modificación: Febrero 18, 2012, 03:38:06 pm por seba123neo »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:MsFlexGRID
« Respuesta #6 en: Febrero 18, 2012, 06:40:40 pm »
Bueno si leiste completo, si voy a aceptar "en matrimonio" al MSFlexGrid, pero lo que te dije, como usarlo, como modificar los encabezados de columnas para que muestre por ejemplo nombres de campos que yo le coloque (y no los verdaderos, como están en la tabla), como personalizarlos, etc !!!

Saludos !!!

Hola Manuelin, mejor explicación que la que te dio Sebas no te la puedo dar, su explicación es completa, clara e insuperable, solo el detalle que me parece que se te pasó y que Sebas si notó es que efectivamente yo me referí en todos mis post al MSHFlexgrid (con H) y no al MSFlexGrid (sin H) y con la que te debes casar es con la que tiene H ¿porque? Porque es muda (broma), no las razones ya te las dio Sebas.

En cuanto a Humala, creo que ya dejo de ser el hijo de Chavez porque desde que entro al gobierno ha hecho exactamente lo contrario de lo que prometía hacer en campaña... y eso era lo que justamente todos queriamos.

Saludos y ojala el cambio se de.
Me encuentras en YAcosta.com

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:MsFlexGRID
« Respuesta #7 en: Febrero 18, 2012, 07:18:38 pm »
Tienes razón Yvan !!! Se me había olvidado la "H" pero el cariño es el mismo Je, Je, Je ;D
Que bueno lo de Humala !!! Y aquí de que va a haber cambio, lo va a haber y para bien !!!

Cooo... sebas !!! tremendo mini tuto intensivo del MSHFlexGrid, no jod...!!! :o :o :o
Si no me queda claro con esa explicación renuncio a la programación !!! Agaredecido sebas !!!

Saludos !!!
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:MsFlexGRID
« Respuesta #8 en: Febrero 18, 2012, 07:43:58 pm »
jeje, gracias, tambien se podria usar el ucListview, control que publicaron varias veces aqui raul, ese tambien es bueno y en personalizacion es completo, pero en rapides con recordset lamentablemente no es igual al MSHFlexgrid en grandes cantidades de registros, pero para pocos registros puede ser bueno tamben, es mas yo lo uso tambien.

saludos.

pedroesca

  • Megabyte
  • ***
  • Mensajes: 206
  • Reputación: +19/-0
  • "El conocimiento es libre"
    • Ver Perfil
Re:MsFlexGRID
« Respuesta #9 en: Febrero 20, 2012, 12:07:27 pm »
De vuelta, he seguido vuestros consejos: Gracias SEBA, IVAN y MANUEL, tienen toda la razón, probé el Hierarchical Flex y prácticamente "vuela", ya está solucionado, encontré a quien tanto esperaba luego de varios "deslices" e infidelidades. Creo que con la explicación de Seba está mas que claro el asunto, y si Ivan, tienes toda la razón, lo que mas atrae es que tiene la H que es MUDA ;). Y respecto al triángulo amoroso informático , propuesto por Manuel, creo que un "gangbang" de grillas también es una opción  8)

Gracias nuevamente a todos.!
"Si yo tengo una idea, tú otra, y la compartimos, ambos tendremos DOS ideas"