PDA

Ver la Versión Completa : Eliminando items de un Grid


feliz-58
19-12-2018, 05:39:10
Pregunta. tengo un grid al cual le agrego artículos, pero al momento de eliminar, uso la siguiente función,

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:

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:

...

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
Hola.

Mediante un ejemplo, te agrego otra opción de borrado:

...

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...

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.

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
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... .

¿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
¿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
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.

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.


y guardarlos en una tabla temporal?
Por ejemplo usando un TClientDataSet en memoria, revisa este enlace: Búsqueda de archivos ordenada por fecha (http://www.clubdelphi.com/foros/showthread.php?t=69061)

Saludos :)

feliz-58
25-12-2018, 00:01:23
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 (http://www.clubdelphi.com/foros/showthread.php?t=69061)

Saludos :)

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

feliz-58
26-12-2018, 00:41:46
Pff Mil Gracias, con esta combinación de componente, me ahorre muchos dolores de cabeza y me facilito la vida.