Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Eliminando items de un Grid (https://www.clubdelphi.com/foros/showthread.php?t=93645)

feliz-58 19-12-2018 05:39:10

Eliminando items de un Grid
 
Pregunta. tengo un grid al cual le agrego artículos, pero al momento de eliminar, uso la siguiente función,
Código Delphi [-]
procedure EliminarLinea(Grid: TStringGrid; ARow: Integer);
var
  i: Integer;
begin
  for i := ARow to Grid.RowCount - 2 do
    Grid.Rows[i].Assign(Grid.Rows[i + 1]);
  Grid.RowCount := Grid.RowCount - 1;
end;

Para eliminar la linea actualmente seleccionada, pero llega un punto donde las lineas ya se acaban y solo quedan las de cabecera, entonces cuando elimina la ultima la cabecera pierde el formado, alguna forma de evitar que se elimine la ultima linea cuando ya no hayan mas artículos en la lista?

Gracias.

Neftali [Germán.Estévez] 19-12-2018 08:31:25

Debería bastar con añadir al princippio de la función EliminarLinea las siguientes líneas:
Código Delphi [-]
  if (ARow = 0) or (Grid.RowCount = 1) then
    Exit;
Evitas que lo llamen con la línea 0 como parámetro 0 con otro valor pero cuando sólo queda 1.

ecfisa 19-12-2018 18:40:32

Hola.

Mediante un ejemplo, te agrego otra opción de borrado:
Código Delphi [-]
...

type
  TStringGrid = class(Grids.TStringGrid); // (*)

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    btnDelete: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnDeleteRowClick(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  c,r,x: Integer;
begin
  x := 0;
  StringGrid1.Rows[0].CommaText := 'COL1,COL2,COL3,COL4,COL5';
  for r := StringGrid1.FixedRows to StringGrid1.RowCount-1 do
    for c := StringGrid1.FixedCols to StringGrid1.ColCount-1 do
    begin
      StringGrid1.Cells[c,r] := Format('cell %d', [x]);
      Inc(x);
    end;
  StringGrid1.Row:= StringGrid1.RowCount-1; // ir a la última fila
end;

procedure TForm1.btnDeleteRowClick(Sender: TObject);
begin
  if StringGrid1.Row > StringGrid1.FixedRows then
    StringGrid1.DeleteRow(StringGrid1.Row)
  else
    StringGrid1.Rows[1].Text := '';
end;
...
(*) Clase TStringGrid desprotegida para acceder al método protegido DeleteRow ( también podes acceder al método DeleteColumn )

Saludos :)

feliz-58 20-12-2018 03:51:12

Gracias amigos! ^\||/

feliz-58 23-12-2018 22:59:51

Cita:

Empezado por ecfisa (Mensaje 530057)
Hola.

Mediante un ejemplo, te agrego otra opción de borrado:
Código Delphi [-]
...

type
  TStringGrid = class(Grids.TStringGrid); // (*)

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    btnDelete: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnDeleteRowClick(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  c,r,x: Integer;
begin
  x := 0;
  StringGrid1.Rows[0].CommaText := 'COL1,COL2,COL3,COL4,COL5';
  for r := StringGrid1.FixedRows to StringGrid1.RowCount-1 do
    for c := StringGrid1.FixedCols to StringGrid1.ColCount-1 do
    begin
      StringGrid1.Cells[c,r] := Format('cell %d', [x]);
      Inc(x);
    end;
  StringGrid1.Row:= StringGrid1.RowCount-1; // ir a la última fila
end;

procedure TForm1.btnDeleteRowClick(Sender: TObject);
begin
  if StringGrid1.Row > StringGrid1.FixedRows then
    StringGrid1.DeleteRow(StringGrid1.Row)
  else
    StringGrid1.Rows[1].Text := '';
end;
...
(*) Clase TStringGrid desprotegida para acceder al método protegido DeleteRow ( también podes acceder al método DeleteColumn )

Saludos :)

Con esto...
Código Delphi [-]
if SG.Row > SG.FixedRows then
   SG.DeleteRow(SG.Row)
  else
    SG.Rows[1].Text := '';

Cuando ya tienes varios articulos, y eliminas el primero, solo limpia la primera linea, es decir "No la elimina" alguna idea de como resolver esto?

ecfisa 24-12-2018 17:30:41

Hola.
Cita:

Empezado por feliz-58 (Mensaje 530155)
Cuando ya tienes varios articulos, y eliminas el primero, solo limpia la primera linea, es decir "No la elimina" alguna idea de como resolver esto?

Siempre tendrás al menos una línea.

Saludos :)

feliz-58 24-12-2018 17:43:06

Cita:

Empezado por ecfisa (Mensaje 530163)
Hola.

Siempre tendrás al menos una línea.

Saludos :)


Me explico, tengo 3 articulos:
---Articulo1---
---Articulo2---
---Articulo3---


si selecciono el primero, y lo "Elimino", solo limpia las celdas, no desplaza todo hacia arriba (Como deberia ser), esto solo pasa cuando hay mas de 1 articulo e intentas "Eliminar" el primero.

Casimiro Notevi 24-12-2018 19:30:19

¿Hay algún motivo por el que no usas un dbgrid?
Creo que te facilitarán las cosas.

movorack 24-12-2018 19:59:47

idem... .

Cita:

Empezado por Casimiro Notevi (Mensaje 530165)
¿Hay algún motivo por el que no usas un dbgrid? Creo que te facilitarán las cosas.


feliz-58 24-12-2018 20:15:43

Cita:

Empezado por Casimiro Notevi (Mensaje 530165)
¿Hay algún motivo por el que no usas un dbgrid?
Creo que te facilitarán las cosas.

y guardarlos en una tabla temporal?

Casimiro Notevi 24-12-2018 20:38:43

Cita:

Empezado por feliz-58 (Mensaje 530167)
y guardarlos en una tabla temporal?

¿Y por qué en una tabla temporal?
Salvo que haya algún motivo que lo haga necesario.

ecfisa 24-12-2018 20:41:58

Hola.
Cita:

Empezado por feliz-58 (Mensaje 530164)
si selecciono el primero, y lo "Elimino", solo limpia las celdas, no desplaza todo hacia arriba (Como deberia ser)
...

Ese es el punto que te explicaba anteriormente. Para el componente TStringGrid ese el comportamiento esperado. En cambio si vas a obtener lo que deseas usando el componente TDBGrid, como te están aconsejando los compañeros.


Cita:

Empezado por feliz-58 (Mensaje 530167)
y guardarlos en una tabla temporal?

Por ejemplo usando un TClientDataSet en memoria, revisa este enlace: Búsqueda de archivos ordenada por fecha

Saludos :)

feliz-58 25-12-2018 00:01:23

Cita:

Empezado por ecfisa (Mensaje 530169)
Hola.

Ese es el punto que te explicaba anteriormente. Para el componente TStringGrid ese el comportamiento esperado. En cambio si vas a obtener lo que deseas usando el componente TDBGrid, como te están aconsejando los compañeros.



Por ejemplo usando un TClientDataSet en memoria, revisa este enlace: Búsqueda de archivos ordenada por fecha

Saludos :)

Muchas Gracias, luego de cenar lo reviso xD, Provecho!

feliz-58 26-12-2018 00:41:46

Resuelto
 
Pff Mil Gracias, con esta combinación de componente, me ahorre muchos dolores de cabeza y me facilito la vida.


La franja horaria es GMT +2. Ahora son las 01:16:46.

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