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

jmlifi 19-10-2007 16:47:59

te envio todo el código del formulario?

eduarcol 19-10-2007 16:50:03

Cita:

Empezado por jmlifi (Mensaje 239791)
te envio todo el código del formulario?

Cuelgalo como adjunto, en caso de que yo no sepa el error seguro otra persona te ayudara

jmlifi 19-10-2007 16:54:30

comprimido me ocupa 3,85 KB. no puedo

eduarcol 19-10-2007 16:58:12

enviamelo al correo del club y yo lo cuelgo en mi espacio

jmlifi 19-10-2007 17:06:12

picho en tu nombre, Enviar correo a Eduarcol y no veo forma de como adjuntar el archivo.

eduarcol 19-10-2007 17:10:00

mi correo es el nick que tengo en el club, arroba clubdelphi.com

o sea

eduarcol [arro] clubdelphi . com

jmlifi 19-10-2007 17:13:51

Ok. Enviado.

eduarcol 19-10-2007 17:18:50

me enviastes un archivo de texto con el .pas solamente, eso no lo puedo ejecutar para recrear el error.

Te hago una pregunta, cuadno te salta la excepcion delphi no te indica que linea la dio???

jmlifi 19-10-2007 17:30:44

NO. Da igual ya has perdido tiempo conmigo.
Seguiré con ello.

jmlifi 19-10-2007 17:50:01

Buenas noticias. Se cuando da el error:
cuando intento añadir una nueva fila se ejecuta lo siguiente:
Código Delphi [-]
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;

se recorre desde el último registro hasta el primero. por cada registro se ejecuta el código. Bien, cuando acaba con el primero se ejecuta por última vez y falla en :
Código Delphi [-]
try
     OfertasCANT.Value := PzOfertasTOTAL.Value
  except

PzOfertasTOTAL.value = 19855,56
Todos los demás valor 0

¿ a qué es debido ?


La franja horaria es GMT +2. Ahora son las 20:16:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi