Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: pedroesca 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:
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.
-
Doctor, la carga la estas haciendo a mano??
El grid se puebla en una patada...:
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.
-
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)
-
Insisto, cásense con el MSHFlexgrid :-) hace mas cosas, aguanta bien, no se queja ni jode.
(Venezuela libre a partir del 7/10/2012 ?) :) :) :)
-
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 !!!
-
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.
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:
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:
flexSectores.FixedRows = 1
luego viene lo divertido con las columnas.
4 - este codigo:
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:
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:
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.
-
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.
-
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 !!!
-
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.
-
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.!