Ver Mensaje Individual
  #1  
Antiguo 23-12-2010
franciscoca franciscoca is offline
Miembro
 
Registrado: ago 2008
Ubicación: La Plata
Posts: 12
Reputación: 0
franciscoca Va por buen camino
Acces Violation at address...

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.

Código Delphi [-]
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
Responder Con Cita