Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   problemas al Eliminar filas de un stringGrid (https://www.clubdelphi.com/foros/showthread.php?t=91184)

Belen12 26-11-2016 00:49:36

problemas al Eliminar filas de un stringGrid
 
hola buenas tardes tengo un pequeño formulario de venta desarrollado en delphi 2010 en el cual listo productos los cuales tienen precio y cantidad y con esto saco el sub total que tambien esta guardado en el stringgrid. y la suma de todos estos sub totales se muestra en un tedit.
Cree un boton para eliminar el producto seleccionado que no quiera vender y al darle click lo saco de la lista
aca tengo los siguientes problemas problemas.
1) si tengo por ejemplo 5 productos cargados en el stringgrid al darle eliminar elimina todos menos el primero
2) partiendo del mismo ejemplo si elimino el producto del medio (supongamos el que esta en la fila 3) se eliminan todos
3) si quiero eliminar el primer producto de la lista se eliminan todos los demas menos este
4) si el item 1) que mencione elimina todo me queda solo 1 fila con un producto que no se elimina y al seguirle dando eliminar el valor del edit se va hasta -x por ejemplo

Este codigo es el que utilize para diseñar el boton

Código Delphi [-]
var
i:integer;
begin
inherited;
  if trim(eTotal.Text)=''   then
    eTotal.Text:= floattostr (strtofloat(eTotal.Text) - strtofloat(sgDetalle.Cells[4,sgDetalle.Row]));
  for i := sgDetalle.Row to sgDetalle.RowCount-2 do
  begin
    sgDetalle.Rows[i]:= sgDetalle.Rows[i+1] ;
    sgDetalle.Rows[sgDetalle.RowCount-1].Clear;
   if sgDetalle.RowCount > 2 then
  begin
   sgDetalle.RowCount:= sgDetalle.RowCount-1;
   end;
  end;
end;


y tambien dejo el codigo de creacion del stringgrid que este se encuentra en el evento onactivate del formulario
Código Delphi [-]
begin
eTotal.Text:='0';
sgDetalle.Cells[0,0]:='codigo';
sgDetalle.ColWidths[0]:=90;
sgDetalle.Cells[1,0]:='nombre';
sgDetalle.ColWidths[1]:=320;
sgDetalle.Cells[2,0]:='precio';
sgDetalle.ColWidths[2]:=90;
sgDetalle.Cells[3,0]:='cantidad';
sgDetalle.ColWidths[3]:=90;
sgDetalle.Cells[4,0]:='sub total';
sgDetalle.ColWidths[4]:=90;
end;

espero a ver sido bastante clara con mi problema cualquier cosa que no se entiendan me avisan.
desde ya muchas gracias :)

ecfisa 26-11-2016 01:09:19

Hola.

La forma mas simple de eliminar una fila del StringGrid es acceder al método DeleteRow para lo cuál previamente debes desproteger la clase TStringGrid:
Código Delphi [-]
...
type
  TStringGrid = class(Grids.TStringGrid); // <- desproteger

  TForm1 = class(TForm)
    sgDetalle: TStringGrid;
...

implementation

procedure TForm1.btnDeleteRowClick(Sender: TObject);
begin
  if MessageBox(0,'¿ Elimina la línea actual ?','', MB_ICONQUESTION+MB_YESNO) = IDYES then
    sgDetalle.DeleteRow( sgDetalle.Row );
end;
...

Saludos :)

Belen12 26-11-2016 02:01:33

Cita:

Empezado por ecfisa (Mensaje 511287)
Hola.

La forma mas simple de eliminar una fila del StringGrid es acceder al método DeleteRow para lo cuál previamente debes desproteger la clase TStringGrid:
Código Delphi [-]
...
type
  TStringGrid = class(Grids.TStringGrid); // <- desproteger

  TForm1 = class(TForm)
    sgDetalle: TStringGrid;
...

implementation

procedure TForm1.btnDeleteRowClick(Sender: TObject);
begin
  if MessageBox(0,'¿ Elimina la línea actual ?','', MB_ICONQUESTION+MB_YESNO) = IDYES then
    sgDetalle.DeleteRow( sgDetalle.Row );
end;
...

Saludos :)

probe tu codigo y sucedio lo siguiente. cuando agrego 3 y borro los 3. al cargar uno nuevo se carga el ultimo borrado mas el nuevo producto y la primera fila donde tengo las celdas de "nombre, precio,cantidad,subtotal' se borra y se superpone el ultimo que agregue :/

ecfisa 26-11-2016 04:30:18

Hola.

Por lo que comentas, pareciera que quedan datos residuales, intentalo de este modo:
Código Delphi [-]
procedure TForm1.btnDeleteRowClick( Sender: TObject );
begin
  sgDetalle.Rows[sgDetalle.Row].Clear;  
  if sgDetalle.RowCount > sgDetalle.FixedRows + 1 then
     sgDetalle.DeleteRow( sgDetalle.Row );
end;

Saludos :)

roman 26-11-2016 16:03:05

Cita:

Empezado por Belen12 (Mensaje 511285)
tengo los siguientes problemas problemas.
1) si tengo por ejemplo 5 productos cargados en el stringgrid al darle eliminar elimina todos menos el primero
2) partiendo del mismo ejemplo si elimino el producto del medio (supongamos el que esta en la fila 3) se eliminan todos
3) si quiero eliminar el primer producto de la lista se eliminan todos los demas menos este
4) si el item 1) que mencione elimina todo me queda solo 1 fila con un producto que no se elimina y al seguirle dando eliminar el valor del edit se va hasta -x por ejemplo

Realmente, la idea original no está mal. El problema es que reduces el número de filas en cada vuelta del ciclo y debes hacerlo sólo hasta el final, es decir, después del ciclo. Algo como:

Código Delphi [-]
for i := sgDetalle.Row to sgDetalle.RowCount-2 do
begin
  sgDetalle.Rows[i]:= sgDetalle.Rows[i + 1];
end;

sgDetalle.RowCount := sgDetalleRowCount - 1;

LineComment Saludos


La franja horaria es GMT +2. Ahora son las 14:02:36.

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