PDA

Ver la Versión Completa : Grid index out of range


calco_hugo
07-12-2010, 17:12:12
ante todo, buenos dias, les comento algo que me esta costando resolver, tengo una aplicacion con 2 tabsheet, en el primer tabsheet hago una seleccion de datos para una consulta SQL (esto funciona perfectamente), en el segundo tabsheet tengo un dbgrid que me muestra los datos de la consulta SQL, como primer paso genero la consulta sql y me muestra los datos en el dbgrid, hasta ahi perfecto, cuando regreso al tabsheet 1 y cambio algo de la consulta e ingreso al tabsheet2, donde esta el dbgrid me da este error

Grid index out of range

alguien me podra ayudar.
desde ya gracias
hugo

ecfisa
15-12-2010, 04:10:20
Hola calco_hugo.

Con esa información que das, es muy difícil dar una respuesta acertada...

. ¿ Con que base de datos estás trabajando ?
. ¿ Como haces la selección de los datos para la consulta ?
. ¿ Usas algún filtro ?
. ¿ Hay involucrada alguna relación maestro/detalle ?

Por si acaso, podrías probar haciendo un Refresh al DBGrid luego de consolidada la nueva consulta...

Saludos.

wds27
16-12-2010, 22:17:16
Hola.
Si es dificil detectar el problema, si estas usando adoquery o algun tipo de objeto query ¿porque no intentas cerrar la consulta antes de volver a ejecutarla?
algo así:

query1.close;
query1.sql.text:='select x from y where z';
query1.open;

Fijate que en el onshow de los tabsheet esté haciendo las aperturas en el orden correcto si es que pusiste las consultas en el evento onshow del tabsheet
Podrias explicarte mas para que te podamos ayudar a descubrir el error que causa eso.

makina
21-02-2012, 23:07:35
la solucion la encontre en
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21354684.html

by: DissasterPosted on 2005-03-17 at 09:05:54ID: 13566959
I've encontered this error before, when I executed the dataset.enable/disablecontrols with a linked grid, and between this lines I deleted some records. As far as I understand this happens because the grid does not check how many records it has after it's been re-activated.

As far as I know this is a bug that delphi has from some time, I searched all over the internet for a long time before I found the solution, and this is it:

1.- copy the file dbgrids.pas to your proyect directory (the original location is in %Program files%\Borland\Delphi7\Source\Vcl)
this is to avoid re-compiling the vcl, which by the way i don´t know how to do, if someone know, i'll be glad if they tell me how.

2.- edit the dbgrids.pas file you just copied and make the TCustomDBGrid.UpdateActive procedure look like the following lines:

procedure TCustomDBGrid.UpdateActive;
var
NewRow: Integer;
Field: TField;
begin
if FDatalink.Active and HandleAllocated and not (csLoading in ComponentState) then
begin
NewRow := FDatalink.ActiveRecord + FTitleOffset;
if (Row <> NewRow) and (NewRow < RowCount) then // <-- Modified line original line was: if Row <> NewRow then
begin
if not (dgAlwaysShowEditor in Options) then HideEditor;
MoveColRow(Col, NewRow, False, False);
InvalidateEditor;
end;
Field := SelectedField;
if Assigned(Field) and (Field.Text <> FEditText) then
InvalidateEditor;
end;
end;

that's it.. now when you recompile your proyect, it will use this unit instead of the original dbgrids.pas, and the problem will be solved.

Hope this helps