PDA

Ver la Versión Completa : como eliminar una fila del stringGrid.


Arturo
12-10-2006, 15:54:35
saludos, disculpen pero esto ingresando datos en un stringGrid para despues ser tomados e ingresarlos por medio de sentencias sql insert... ahora no se como arregrar el asunto de una vez que tengo los datos en el stringGrid quisiera borrar alguno y este es el codigo que tengo:

los encabezados son estos:

mis encabezados del StringGrid1son de esta forma que son los 4 campos StringGrid1.Cells[0,0]:='Id';
StringGrid1.Cells[1,0]:='Descripcion';
StringGrid1.Cells[2,0]:='Especificacion';
StringGrid1.Cells[3,0]:='Iva';
procedure eliminiar; var
i : integer;
begin
if(iNumero <> - 1) then begin //nada mas verifica que haiga regsitrso en el stringgrid if(Application.MessageBox('¿Desea eliminar el artículo seleccionado?','Eliminar',
mb_OK + mb_Cancel ) = smbOK) then begin
for i := stringGrid1.Row to stringGrid1.RowCount - 2 do begin
stringGrid1.Cells[0,i+1] := IntToStr(StrToInt(stringGrid1.Cells[0,i+1]) - 1);
stringGrid1.Rows[i] := stringGrid1.Rows[i+1];
end;
if(stringGrid1.RowCount > 2) then begin
stringGrid1.RowCount := stringGrid1.RowCount - 1;
end
else begin
stringGrid1.Cells[0,1] := '';
stringGrid1.Cells[1,1] := '';
stringGrid1.Cells[2,1] := '';
stringGrid1.Cells[3,1] := '';
end;
iNumero := iNumero - 1;
end;
end;
txtCodigo.SetFocus;
end;

pero me borrar pero el campo del stringGrid, StringGrid1.Cells[0,0]:='Id'; si tengo un valos por decirlo 6 me decrementa en uno me debe de respetar.


gracias.

Lonidas
12-10-2006, 16:50:42
hola.
Ósea tu tienes un stringrid así
|--|----------|-------------|---|
|id|descripcion|especificacion|iva|
|--|----------|-------------|---|
|--|----------|-------------|---|


Y lo que deseas es es eliminar todo un registro(fila)
Ahora carga un registro(fila) y guardas en la tabla o cargas varios registros(filas) y luego lo guardas en la tabla??

Arturo
12-10-2006, 20:09:54
exactamente asi es mi stringgrid, lo que pretendo es ingresarlos primero y despues guardarlo en mi tabla por medio de sql insert, o tambien hago una consulta y vuelvo a cargar los registros y selecciono y pudiera borrarlo por sql con delete.

|--|----------|-------------|---|
|id|descripcion|especificacion|iva|
|--|----------|-------------|---|
8 Printer N
|--|----------|-------------|---|
9 Puetos USB N
|--|----------|-------------|---|
10 Uno mas N

yo ingrese tres filas y por decir el numero 9 o quizas el 10 lo borre me quedara solo uno, una vez que ya esten seguro por decirlo (el usuario...) lo guardar, el procedimiento ya lo ataque y efectivamente me recorre el stringGrid con las filas.

en conclusion: para eliminar un registro ya guardado en la tabla me hace falta el procedimiento, por ahora solo he arreglado lo de eliminar una fila cuando este en el stringGrid antes de ser enviado a "guardar".

no se en donde estoy mal con el codigo antes citado.
gracias.

roman
12-10-2006, 20:54:04
El StringGrid tiene un método protegido DeleteRow, que supongo es para eso. Digo supongo porque no lo he probado. El punto es que al estar protegido no puedes usarlo directamente pero puedes usar el truco de la desprotección:


type
// declaras un descendiente 'de palo' de TStringGrid
THackGrid = class(TStringGrid);

...

// Haces un moldeo de tipos para poder acceder al método
THackGrid(StringGrid1).DeleteRow(...);


Por otro lado te pregunto, ¿por qué no usas un DBGrid? El StringGrid es un componente muy pobre y se alentará mucho cuando tengas varios registros. Si por alguna razón no deseas usar componentes db aware como el DBGrid, podrías optar por un LIstView en modo virtual. Uno de las razones por las cuales el DBGrid es tan exitoso es precisamente porque funciona en modo virtual: el control no alamacena todos los registros del dataset sino sólo los que se alcanzan a ver en la pantalla en un momento dado y va solicitando al dataset el resto conforme se necesitan. Puedes lograr algo similar con un ListView.

// Saludos