Delphi - pregunta sobre stringgrid

 
Vista:

pregunta sobre stringgrid

Publicado por Diego (85 intervenciones) el 04/03/2003 14:29:41
Hola
Mi problema es el siguiente: tengo un stringgrid en el que el usuario debe digitar una gran cantidad de datos, por lo que la navegación a través de la grilla debe ser lo más "inteligente" posible. El problema que no he podido resolver se produce cuando el usuario ingresa datos en la última fila de la grilla, porque tengo un procedimiento que le agrega una fila, selecciona la primera columna y simula la pulsación de la tecla Enter, para editar la celda y que el usuario sige escribiendo normalmente, pero al hacer el scroll de la grilla, para mostrar la última fila, ese procedimiento no sirve. Sé que existe un evento OnTopLeftChanged, pero no he podido usarlo de modo que el procedimiento anterior se ejecute normalmente. Si alguien sabe qué puedo hacer, le agradecería que me sugiriera algo, porque si bien mi aplicación funciona, no es completamente cómoda para el usuario.

Gracias

PS: en realidad no usa un stringgrid, uso un xstringgrid, descendiente de la anterior
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:pregunta sobre stringgrid

Publicado por Ernesto D'Spirito (706 intervenciones) el 04/03/2003 15:53:11
El evento OnTopLeftChanged se produce cada vez que se corren las celdas de la grilla horizontal o verticalmente, por lo que cambia la celda físicamente visible como superior izquierda (top left). No parece ser lo que debes usar.

Creo que lo que quieres lograr es algo parecido al DBGrid, que añade una fila al presionar [FLECHA ABAJO] en la última fila, y si subimos sin haber puesto datos la elimina. Puedes hacerlo así, usando los eventos OnKeyDown y OnSelectCell:

function IsRowEmpty(StringGrid: TStringGrid; ARow: integer): boolean;
var
ACol: integer;
begin
Result := True;
for ACol := StringGrid.FixedCols to StringGrid.ColCount - 1 do
if StringGrid.Cells[ACol, ARow] <> '' then begin
Result := False;
break;
end;
end;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_DOWN then
// Si se presiono la tecla flecha abajo
begin
if StringGrid1.Row = StringGrid1.RowCount-1 then
// Si estamos en la última fila
if not IsRowEmpty(StringGrid1, StringGrid1.Row) then
// Si la última fila no está vacía
begin
// Agregamos una nueva fila y vamos a editar la primer celda
StringGrid1.RowCount := StringGrid1.RowCount + 1;
StringGrid1.Row := StringGrid1.RowCount-1;
StringGrid1.Col := StringGrid1.FixedCols;
StringGrid1.EditorMode := True;
end;
end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ARow = StringGrid1.RowCount - 2 then
// Si vamos a la penúltima fila
begin
if IsRowEmpty(StringGrid1, ARow+1) then
// Si la última fila está vacía
begin
// Eliminamos la última fila
StringGrid1.RowCount := StringGrid1.RowCount - 1;
end;
end;
end;

Espero que te sirva.

Ernesto D'Spirito
http://www.latiumsoftware.com/es/index.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar