PDA

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


jmlifi
19-10-2007, 13:02:12
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
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
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 :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:
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
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:
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 :try
OfertasCANT.Value := PzOfertasTOTAL.Value
except

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

¿ a qué es debido ?