![]() |
Recorrer un Grid
Hola a Todos!
nuevamente por aquí... tengo un objeto dggrid, al cual necesito recorrerlo en un momento determinado, desde la primera fila a la fila en la que actualmente me encuentro posicionado. al realizar este recorrido debo ir comparando el valor de cierta columna( supongamos Nro. de documento) para ver si contiene el mismo valor que la misma columna de la fila en la que actualmente estoy posicionado. mis dudas entre muchas son las siguientes: -como puedo obetener la fila en la que actualmente estoy posicionado? - como puedo hacer el recorrido del grid (se que puedo utilizar for o whiles , pero no se como ir avanzando el indice del grid)? - al ir recorriendo cada fila como le indico al sistema que el valor de la columna que necesito, debe corresponder a la fila que actualmente estoy recorriendo? cualquier salvavidas será bienvenido! salu2! |
Creo que si desarrollas esta idea te podrá servir:
Código:
procedure TForm1.Button1Click(Sender: TObject); |
gracias por la atención marcos!
mira intentamos realizar un rutina más o menos relacionada con los resultados que pretendemos obtener con las propiedades sobre los cuales he solicitado información pero no nos esta funcionando a considerar: la grid esta enlasada a un datasource , el cual a su vez toma los valores de un procedimiento almacenado, el cual esta concentado a obejto conexión que esta en comunicación con un motor de base de datos Sql Server 2000. Todos los objetos exceptuando el DataSource son de la tecnologia ADO expongo la rutina ejemplo a continuación: for i := 1 to tstringgrid(dbgrid1).rowcount -1 do begin tstringgrid(dbgrid1).row := i; dbgrid1.setfocus; Vtotal := VTotal + dbgrid1.Columns[0].asinteger; end; showmessage(inttostr(Vtotal)) - lo que suecede en esta rutina es que el valor de la columna no se actualiza, es decir, simpre contiene el valor de la columna en la primera fila ( tstringgrid(dbgrid1).row = 1) otra forma en que intentamos plantear esto pero optuvimos el mismo resultado fue: tstringgrid(dbgrid1).col := 0; for i := 1 to tstringgrid(dbgrid1).rowcount -1 do begin tstringgrid(dbgrid1).row := i; dbgrid1.setfocus; Vtotal := VTotal + dbgrid1.selectedField.value; end; showmessage(inttostr(Vtotal)) espero me puedan ayudar en algo sobre este problemilla ! |
Un par de comentarios.
Los componentes DBGrid no están hechos para "recorrerse". Lo que se recorre es el DataSet asociado. Al comenzar el recorrido puedes obtner los datos de la fla actual con DataSet.FieldByName y recorrer el DataSet con DataSet.Next. El que los DBGrid no estén hechos para recorrerse no es sólo un capricho mío. Los DBGrid son grids "virtuales", relamente no contienen todos los registros; de lo contrario tendrían que almacenar en memoria todo el contenido de una tabla, lo cual pueden ser miles, cientos de miles o millones de registros. El DBGrid controla el desplazamiento y va leyendo los registros conforme se necesite. Acabo de hacer una pequeña prueba colcando un DBGrid con 15 filas visibles y no importa en que parte del recorrido me encuentre la propiedad RowCount es siempre 16 (una más de las filas visibles). El otro comentario es que no debe hacerse un casting del estilo TStringGrid(DBGrid) ya que TStringGrid no es un ancestro de DBGrid (esto ya se discutió anteriormente). Lo correcto sería declarar un descendiente de TDBGrid, digamos TUPDBGrid y hacer el "casting" con él para acceder a las propiedades protegidas. Pero aún así, está el problema que menciono antes. Hay una buena razón para que Borland haya decidido no publicar en TDBGrid propiedades como RowCount: Las filas son "virtuales", no existen sino que se van actualizando conforme nos vamos desplazando por el DataSet. // Saludos |
Yo creo que lo mas normal es hacer algo como:
Código:
;) |
Completamente de acuerdo jachguate, todo el recorrido es en el dataset.
// Saludos |
Muuuuuuuchas Gracias!!!!
en primer lugar a roman, por la explicación conceptual del grid, que me aclaro bastante los conceptos con respecto al manejo de este objeto y en segundo lugar a juan por el ejemplo entregado, con el cual el problema que habia planteado me funciono del 1.! GRandes!!!!!!!!! me han ayudado a ver la luz! Saludos!!! |
Veo que la pregunta en un principio no estaba bien formulada, porque no era recorrer la rejilla lo que pretendías, sino recorrer el DataSet y sumar ciertos registros.
Cosa que ya ha quedado perfectamente explicada por Román y JachGuate. Un Saludo. |
la verdad es que en otros lenguajes , yo si recorria la grilla para obtener los valores de los campos, no sabia que en este lenguaje se recorria el conjunto de datos enlasado
saludos! |
Hola Nuevamente!
una pequeña dudilla. este procedimiento de recorrido de la grilla sobre el cual les he consulta , lo tengo gatillado en el evento keypress de lagrilla, cuando es realizado sobre una columna especifica, ahora mi duda es de como hacer para volver a la posición de la grilla donde me encontraba al momento en que se ejecuto el procedimiento ( fila y columna) De ante mano muchas gracias!. |
Normalmente cuando recorro un DataSet, que tiene asociado controles visuales hago esto:
Código:
DataSet.DisableControls; Comentario: Ten en cuenta que este código esta recorriendo el DataSet desde el primer registro, creo que esto tu no lo quieres. Saludos! |
no te compliques trabajando con el grid directamente, ya que no es un componente para hacer recorridos sobre la data puesta en el.
puedes probar mejor un recorrido sobre un MEMORYDATA de la coleccion de los RX y sincronizar tu resultado en el grid. el memorydata trabaja igual que como si fueses recorriendo una tabla. |
gracias por las acotaciones!
permite el memory data editar las celdas? salu2! |
donde puedo encontrar los rx no los puedo encontrar en la paleta de controles?
salud2! |
Las RxLibs no vienen con Delphi, las tienes que bajar de sitios como Torry.net. Te cuento que te TRxMemoryData no es mas que un DataSet que se carga en memoria, no se cual es tu necesidad pero si solo quieres recorrer datos que son accesibles fácilmente desde la base de datos, no te recomiendo usarlo, a menos que necesites algo muy particular.
Saludos! |
Cita:
la forma en la que se utilizará esta consulta igual será requerida por varios usuarios a la ves ( 50 mas o menos), este control no presenta problemas de ese tipo, o algun problema con respecto a la cantidad de registros que se le puedan pasar? salu2! |
hola.
yo he trabajado con el memorydata y le he cargado mas de 8000 registros y no ha fallado, tambien los he cargado don data proveniente de varias tablas y similar cantidad de registros. los he probado en cliente servidor y es muy util ya que al traerte una copia de la tabla al memory le quitas trabajo al server y evitas tambien tener un archivo en el cliente. yo trabajo con este componente en client-server por cuestion de seguridad ya que procesamos todo en el cliente mediante un memory y asi evito acceder al server, y hacerlo cuando las transacciones estan completas. se pueden recorrer igual que un dataset. la unica posible limitante seria la memoria virtual que dispongas en ese momento, pero ojo, a mi nunca me ha dado problemas eso. he hecho pruebas de este componente con 8000 registros o mas en una P2 corriendo sql server y win 2000 server y esto nunca me ha sucedido. ademas al usar este componente evitas escribir en la bd y te podria permitir hacer una rutina de deshacer.... |
ok. , muchas gracias, voy a estudiar el caso...
...pero eso si todavia no puedo encontrar este componente en torry.net no lo ubique, algún sitio donde lo pueda hallar? salu2 |
en esta misma pagina, en la seccion componentes>coleeciones>rxlib
|
gracias!:D
|
La franja horaria es GMT +2. Ahora son las 06:00:36. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi