Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como eliminar una o varias filas de un TAdvStringGrid (https://www.clubdelphi.com/foros/showthread.php?t=88005)

p1p3 31-03-2015 16:27:18

Como eliminar una o varias filas de un TAdvStringGrid
 
Saludos a todos los participantes del foro.

Por favor me pueden ayudar informándome como eliminar una o varias filas en un AdvStrigGrid, he encontrado respuestas en este foro y he tratado de implementarlo en mi código sin resultado alguno.

bueno, lo que hago es generar una o varias filas con sus respectivos checks.
Código Delphi [-]
GridProcedimientos.AddRow;
 for  i := 1 to GridProcedimientos.RowCount -1 do
    begin
      GridProcedimientos.AddCheckBox(0,i,False, True);
      GridProcedimientos.ReadOnly[1,i]:=True;
      GridProcedimientos.ReadOnly[5,i]:=True;
    end;
Hasta aquí todo bien...Cuando selecciono varios check y los quiero eliminar me elimina un solo o todos los registros, el código esta así:
Código Delphi [-]
for i:=1 to GridProcedimientos.RowCount do
 begin
    if GridProcedimientos.GetCheckBoxState(0,i,state)then
    begin
       if state then
           GridProcedimientos.RemoveSelectedRows;//esta linea solo elimina uno por uno
   end;
 end;
Tambien lo he hecho con esta linea
Código Delphi [-]
GridProcedimientos.RemoveRows(GridProcedimientos.Row, GridProcedimientos.RowCount);//esta elimina todas las filas

Agradezco el tiempo que le dedican a mi pregunta.

AgustinOrtu 31-03-2015 20:44:21

No conozco el componente pero a simple vista puede decirse que funciona "igual" al TStringGrid standart
1) RemoveSelectedRows no necesariamente elimina una por una. En realidad elimina la fila seleccionada cuando le haces click con el boton izq. La que esta "sombreada en azul" (me imagino por defecto). Tambien seguro tiene una propiedad multi select que si la pones a true te deja seleccionar varias filas apretando shift o alguna otra tecla, y entonces si llamas a RemoveSelectedRows te elimina todas las seleccionadas.

Dicho esto, Lo que hace tu for es recorrer todo el grid, hace una "pregunta" (no importa realmente que) y si da true, elimina la(s) fila seleccionada. Supongamos que esta seleccionada la primer fila cuando llamas a ese codigo, entonces elimina la primera, luego la seleccionada pasa a ser la de abajo, y si el codigo vuevle a dar true, te elimina la segunda (que ahora seria la primera). Osea que te puede pasar que estes preguntando por el checkbox i-esimo y estas eliminando otra fila, Me sigues?

2) RemoveRows. Este tiene pinta de que le das un valor de inicio y uno de fin, supongamos i y j. Entonces lo que hace es eliminar todas las filas que esten entre a y j. Lo que hace una llamda como la de tu codigo:

Código Delphi [-]

GridProcedimientos.RemoveRows(GridProcedimientos.Row, GridProcedimientos.RowCount);

RowCount es la cantidad de filas, si tenes seleccionada la primera (GridProcedimientos.Row), entonces estas diciendole que elimine todo

Lo que tendrias que hacer es un for similar al que pusiste primero, pero en ves de llamar a RemoveSelectedRows, tendrias que ver la forma de eliminar la fila i-esima (la que coincide con el checkbox del cual estas preguntando el estado)

A ver si te sale, suerte!

p1p3 31-03-2015 21:26:20

Muchas gracias por tu repuesta AgustinOrtu tu comentario me ayuda mucha no había caído en cuenta en la parte que comentas... "Supongamos que esta seleccionada la primer fila cuando llamas a ese código, entonces elimina la primera, luego la seleccionada pasa a ser la de abajo, y si el código vuelve a dar true, te elimina la segunda (que ahora seria la primera). Osea que te puede pasar que estés preguntando por el checkbox i-esimo y estas eliminando otra fila".

pienso ahora que si lo recorro de abajo hacia arriba no debería tener ese problema, voy a intentarlo y ya les comentare...:D

Son muy amables al responder tan pronto, Muchas pero muchas gracias...Son una gran ayuda

AgustinOrtu 31-03-2015 21:40:09

Deberia haber algun metodo que deje borrar fila por su indice, pero al no tener ese componente no puedo verificarlo :(

Por lo pronto podrias eliminar una sola fila haciendo uso del RemoveRows en tu bucle for

Código Delphi [-]
if state then
  // depende de como este implementado, deberias probar para ver cual es el correcto
  GridProcedimientos.RemoveRows(i, i+1);
  GridProcedimientos.RemoveRows(i, i);

Saludos!

p1p3 31-03-2015 21:50:27

Me funciono con el siguiente código
Código Delphi [-]
i:=GridProcedimientos.RowCount;
 while i>1 do
 begin
    if GridProcedimientos.GetCheckBoxState(0,i,state)then
    begin
       if state then
          GridProcedimientos.RemoveSelectedRows;
    end;
 i:=i-1;   
end;
De esta forma no tengo problema con el indice....Estuve verificando en las propiedades de AdvStringGrid y no encontré la opción de multi select que mencionas, pero tiene Multilinecells; seria verificar con esta opción.

Tus comentarios me fueron de gran ayuda AgustinOrtu ^\||/

AgustinOrtu 31-03-2015 22:01:07

Solo para ahorrarte dolor de cabeza mas adelante, hace la siguiente prueba:

Selecciona la ultima fila con el mouse del grid, y despues llama a tu codigo a ver si funciona correctamente

Saludos!

PD: Usa el Tag [ DELPHI ] [ / DELPHI ] para que salga la identacion y resalte las palabras claves de delphi

radenf 01-04-2015 22:29:54

Estimado p1p3:

Prueba con las propiedades DisjunctRowSelect y DisjunctRowSelectnoCtrl que se encuentran en MouseActions del TAdvStringGrid.
Con ellas podrás seleccionar varias filas consecutivas al hacer Click+Shift o alternadas al hacer Click+Ctrl y así podrás eliminar o editar las filas que selecciones.
Salu2

p1p3 02-04-2015 01:24:20

Empezare a probar las sugerencias que me indican AgustinOrtu y radenf, Gracias por dedicarme tiempo a resolver esta duda


La franja horaria es GMT +2. Ahora son las 13:37:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi