PDA

Ver la Versión Completa : Acces Violation at address...


franciscoca
23-12-2010, 01:33:53
Hola q tal?? estoy quemandome la cabeza hace varios dias!! y no encuentro el problema...... la historia viene asi, recorro un par de paneles y componentes casteandolos para trabajar sobre ellos, pero al llamar al proceso calcular total, dentro de otro proceso q se trabaja igual, y si anda bien, me tira el error acces violation, me fije si tenia problemas de indices con el controlcount pero no veo nada.. por favor si alguien tiene tiempo de verlo y ve cual es mi error voy a estar muy agradecido!!!!
hice un paso paso y eliminando lineas y el problema esta cuando casteo en las lineas resaltadas y en rojo.

procedure TFLiquidarPago.calcular_total;
var i,j:integer; PanelPagos:TAdvPanel; total,subtotal:real; monto:TLabel; pago:TAdvPanel; cb:TCheckBox;
begin
total:= 0; //inicializo en 0 el total de la liquidacion
//recorro todo el panel de pagos
for i:= 0 to PanelPagos.ControlCount-1 do
begin
if(PanelPagos.Controls[i] is TAdvPanel)then
begin
pago:= TAdvPanel(PanelPagos.Controls[i]);
//recorro el pago
for j:= 0 to pago.ControlCount -1do
begin
//si es un checkbox lo guardo en la variable cb
if(pago.Controls[j] is TCheckBox)then cb:= TCheckBox(pago.Controls[j]);
//si es un label (monto del pago) lo almaseno en la variable monto
if(pago.Controls[j] is TLabel)then
begin
if(monto.Tag=2)then subtotal:= StrToFloat(monto.Caption);
end;

end;

//si el pago esta chequeado le agrego al total el imorte del pago
if(cb.Checked)then total:= total+ StrToFloat(monto.Caption);
end;
end;
if(CBInstalacion.Checked)then total:= total + StrToFloat(ECostoInstalacion.Text);
ETotalPesos.Text:= FloatToStr(total);
end;

procedure TFLiquidarPago.DBLUCantPagosChange(Sender: TObject);
var i,j,cant,mes_aux:Integer; cb:TCheckBox; pago:TAdvPanel; monto:TLabel; fecha:TRxSpinEdit;
begin
mes_aux:= 12;
inicializarPagos;
cant:=DBLUCantPagos.ItemIndex;
PanelPagos.Height:= 40 + (40*(DBLUCantPagos.ItemIndex)); //muestro la cantidad de pagos correspondiente

for i:= 0 to PanelPagos.ControlCount-1 do
begin
if(PanelPagos.Controls[i] is TAdvPanel)then
begin
pago:= TAdvPanel(PanelPagos.Controls[i]);
//si el pago es <= a la cantidad para liquidar
if(pago.Tag<=DBLUCantPagos.ItemIndex+1)then
begin
//recorro el pago
for j:= 0 to pago.ControlCount -1do
begin
//si es un checkbox
if(pago.Controls[j] is TCheckBox)then
begin
cb:= TCheckBox(pago.Controls[j]);
cb.Checked:= true;
end;
//si es un label (monto del pago)
if(pago.Controls[j] is TLabel)then
begin
monto:= TLabel(pago.Controls[j]);
if(monto.Tag=2)then monto.Caption:= FloatToStr(abono);
end;

//si es un rxSpinEdit (mes y año del pago)
if(pago.Controls[j] is TRxSpinEdit)then
begin

fecha:= TRxSpinEdit(pago.Controls[j]);
if(fecha.Tag=5)then
begin
if(mes_aux<=0)then mes_aux:= 12;
//si son del anterior año
if(mes<=cant)then fecha.Text:=IntToStr(mes_aux+(mes-cant))
else fecha.Text:=IntToStr(mes-cant);
cant:= cant -1;
end;

if(fecha.Tag=6)then
begin
if(mes-(cant+1) <=0)then fecha.Text:= IntToStr(ano-1)
else fecha.Text:= IntToStr(ano);
end;

end;
end;
end;
end;
end;
calcular_total;
end;



desde ya muchas gracias y espero encontrar el problema, saludos y felices fiestas

defcon1_es
23-12-2010, 13:49:08
for j:= 0 to pago.ControlCount -1do
begin //si es un checkbox lo guardo en la variable cb
if(pago.Controls[j] is TCheckBox)then cb:= TCheckBox(pago.Controls[j]);
//si es un label (monto del pago) lo almaseno en la variable monto
if(pago.Controls[j] is TLabel)then
begin
monto:= TLabel(pago.Controls[j]); //Creo que te falta esta línea...
if(monto.Tag=2)then subtotal:= StrToFloat(monto.Caption);
end;
end;

franciscoca
23-12-2010, 16:24:13
Gracias Defcon1, Asi es faltaba esa linea!!! pero el problema sigue siendo el mismo, porq en si revienta en la linea de cast anterior... cuando hace el if probe comentandolo y revienta en esa, o en la siguiente if(pago.Controls[j] is TLabel)then

for i:= 0 to PanelPagos.ControlCount-1 do
begin
if(PanelPagos.Controls[i] is TAdvPanel)then
begin
pago:= TAdvPanel(PanelPagos.Controls[i]);
//recorro el pago
for j:= 0 to pago.ControlCount -1do
begin
//si es un checkbox lo guardo en la variable cb
if(pago.Controls[j] is TCheckBox)then cb:= TCheckBox(pago.Controls[j]);
//si es un label (monto del pago) lo almaseno en la variable monto
if(pago.Controls[j] is TLabel)then
begin
monto:= TLabel(pago.Controls[j]);
if(monto.Tag=2)then subtotal:= StrToFloat(monto.Caption);
end;

end;

//si el pago esta chequeado le agrego al total el imorte del pago
if(cb.Checked)then total:= total+ StrToFloat(monto.Caption);
end;
end;

franciscoca
26-12-2010, 01:59:28
Ya esta solucionado!!!! el problema era con la variable
PanelPagos:TAdvPanel; definida en el proceso calcular_total...
el problema era q el componente se llamaba asi y la variable para castearlo
se llamaba igual entonces al ejecutar ese proceso se creaba ese componente y
no encontraba los elementos q tenia q recorrer porq recorria la variable y no el panel...

gracias defcon1 por la ayuda!!!!