Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Grid index out of range (https://www.clubdelphi.com/foros/showthread.php?t=49353)

jmlifi 19-10-2007 13:02:12

Grid index out of range
 
Buenas,

Cuando estoy ( en un DBDrid ) posicionado en el último registro y quiero añadir un nuevo registro (dándole a la flecha para abajo) me aparece el mensage: "Grid index out of range".

Lo curioso es que no siempre da el error.

¿ a qué es debido?

eduarcol 19-10-2007 14:31:05

tienes algun codigo relacionado??

es lo mas seguro, colocalo y te podremos ayudar con el error.

jmlifi 19-10-2007 14:50:00

Código Delphi [-]
procedure TEdOfertaFrm.PzDsDataChange(Sender: TObject; Field: TField);
begin
 if (trim(PzOfertas.FieldByName('TIPOM').AsString)<>'') then
     if (PzOfertas.FieldByName('VCORTE').AsFloat<>0) or
        (PzOfertas.FieldByName('VPz').AsFloat<>0) then
        DbGrid1.Columns[5].Readonly := true
     else
        DbGrid1.Columns[5].Readonly := false
  else
     DbGrid1.Columns[5].Readonly := false ;
end;
procedure TEdOfertaFrm.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (DbGrid1.SelectedField.FieldName='VEXTRAS') and (key=VK_RIGHT) then begin
     DbGrid1.SelectedField:= OfertasFrm.PzofertasVPU;
     key := 0
 end;
 if (DbGrid1.SelectedField.FieldName='VPU') and (key=VK_Left) then begin
     DbGrid1.SelectedField:= OfertasFrm.PzofertasVEXTRAS;
     key := 0
 end;
 if (DbGrid1.SelectedField.FieldName='VPU') and (key=VK_RIGHT) or
    (DbGrid1.SelectedField.FieldName='REF') and (key=VK_LEFT) then
     key := 0;
 if (key=VK_HOME) then begin
    DbGrid1.SelectedField:= OfertasFrm.PzofertasREF;
    key := 0
 end;
 if (key=VK_END) then begin
    DbGrid1.SelectedField := OfertasFrm.PzofertasVPU;
    key := 0
 end;
 if (key=VK_DELETE) and (Shift=[ssCtrl]) then
    Key := 0;
if (key=VK_INSERT) then
    if (Shift<>[ssShift]) and (Shift<>[ssCtrl]) then
    Key := 0;
 if ((key=VK_F3) and (
     (DbGrid1.Selectedfield.FieldName = 'VPZ')      or
     (DbGrid1.Selectedfield.FieldName = 'VCORTE' )  or
     (DbGrid1.Selectedfield.FieldName = 'VTRATMTO') or
     (DbGrid1.Selectedfield.FieldName = 'VEXTRAS'))) then
    DBGrid1EditButtonClick(nil);
end;
 
 
procedure TOfertasFrm.PzOfertasAfterScroll(DataSet: TDataSet);
begin
   Aceptar1.Enabled := not PzOfertas.IsEmpty and (PzOfertasACEPTADA.AsString <>'S')
end;
procedure TOfertasFrm.PzOfertasCalcFields(DataSet: TDataSet);
begin
  PzOfertasACEPTADACALC.AsString   := CompletaSiNo(PzOfertasACEPTADA.AsString);
  //PzOfertasPIEZAVERSION.AsString   := PzOfertasREF.AsString+'   '+PzOfertasC_VR.AsString;
  try
    PzOfertasImporte.AsFloat         := PzOfertasVPU.AsFloat * PzOfertasQPZ.AsInteger;
    PzOfertasImporteMaterial.AsFloat := PzOfertasVPz.AsFloat * PzOfertasQPZ.AsInteger;
  except
  end;
  try
     OfertasCANT.Value := PzOfertasTOTAL.Value
  except
  end;
end;
procedure TOfertasFrm.PzOfertasBeforePost(DataSet: TDataSet);
begin
   if not modGestor.MaterialValido(PzOfertasTIPOM.AsString) then
      if PzOfertas.State in [dsEdit,dsInsert] then
         PzOfertas.Cancel;
end;
procedure TOfertasFrm.PzOfertasAfterPost(DataSet: TDataSet);
begin
   try
     OfertasCANT.Value := PzOfertasTOTAL.Value
   except
   end;
end;

eduarcol 19-10-2007 14:56:07

las columnas del grid son estaticas o dinamicas???

jmlifi 19-10-2007 15:02:13

las columnas son dinamicas

eduarcol 19-10-2007 15:04:05

ese es el problema donde haces la referencia:

DbGrid1.Columns[5].Readonly := false;

en ese momento el grid no tiene las 6 columnas que necesitas por eso el error index out of range...

antes de hacer eso deberias verificar si el count de las columnas es mayor o igual de 6

jmlifi 19-10-2007 15:20:01

he añadido el código y no va

eduarcol 19-10-2007 15:21:57

cual codigo añadistes y cual codigo no va??? :confused::confused:

jmlifi 19-10-2007 15:25:05

Código Delphi [-]
procedure TEdOfertaFrm.PzDsDataChange(Sender: TObject; Field: TField);
begin
if DgBGrid1.Columns.Count>=6 then
 if (trim(PzOfertas.FieldByName('TIPOM').AsString)<>'') then
     if (PzOfertas.FieldByName('VCORTE').AsFloat<>0) or
        (PzOfertas.FieldByName('VPz').AsFloat<>0) then
        DbGrid1.Columns[5].Readonly := true
     else
        DbGrid1.Columns[5].Readonly := false
  else
     DbGrid1.Columns[5].Readonly := false ;
end;

está bien?

eduarcol 19-10-2007 15:36:14

eso esta bien dependiendo lo que quieras lograr, pero si deberia funcionar para controlar el error que dices te da

jmlifi 19-10-2007 15:37:30

Si comento el codigo anterior, me sigue dando el error.
Estoy desesperado.

eduarcol 19-10-2007 15:41:36

sigo sin entender, podrias tomarte 5 minutos para explicar bien lo que sucede, porq comentas el codigo??

jmlifi 19-10-2007 15:53:40

Lo Explico:

SOLO SUCEDE EN ALGUNOS CASOS.

Cuando intento añadir una nueva linea en el DbGrid a veces se llega a ejecutar :
Código Delphi [-]
procedure TEdOfertaFrm.PzOfertasNewRecord(DataSet: TDataSet);
var
  n : integer;
begin
  PzOfertas.FieldByName('OFERTA').AsString  := OfertasFrm.OfertasOFERTA.AsString;
  PzOfertas.FieldByName('ACEPTADA').AsString  := 'N';
  PzOfertas.FieldByName('PzasArea').AsInteger := 1;
  try
     n := PzOfertas.FieldByName('MaxPos').Value + 1
  except
     n := 1;
  end;
  PzOfertas.FieldByName('O_Oferta').AsString  := AddCeros(n,3);
  BorrarPieza.Enabled := true
end;
y todo va correcto.
Y otras veces me da el error: "Grid index out of range"

PzOfertas lo tengo declarado de la siguiente manera:
Código Delphi [-]
PzOfertas := OfertasFrm.PzOfertas;
ClientDataSet de otro formulario

eduarcol 19-10-2007 16:04:23

La verdad no veo la relacion, son dos codigos distintos lo que colocas, y el newrecord, se debe ejecutar siempre que agregas un registro

jmlifi 19-10-2007 16:18:36

Antes de ejecutarse el Newrecord aparece el error.

eduarcol 19-10-2007 16:20:50

y cuando salta la excepcion podrias indicar la linea y el resto del codigo que marca delphi??

jmlifi 19-10-2007 16:23:54

el problema es que al intentar añadir un nuevo registro no se que evento se está ejecutando ( antes del newrecord)

jmlifi 19-10-2007 16:27:36

¿ qué evento se ejecuta cuando intento añadir un nuevo registro en el dbGrid ? alguna veces funciona el OnNewRecord

eduarcol 19-10-2007 16:30:00

pero te pregunto algo, cuando te genera esa excepcion delphi se detiene y te muestra la linea donde se detuvo, que linea te esta mostrando???

jmlifi 19-10-2007 16:46:37

Aunque te cueste creerlo, no sé. El código me está mareando. Por qué no hace el OnNewRecord?

Lo siento por liarte


La franja horaria es GMT +2. Ahora son las 02:37:26.

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