Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Propiedad o variable de un form se hace=0 (https://www.clubdelphi.com/foros/showthread.php?t=48052)

fedelphi 14-09-2007 01:02:30

Propiedad o variable de un form se hace=0
 
Hola al foro, tengo unproblema que realmente me mato, no se si sera una pavada, en este caso disculpen, o algo mas serio. tengo el sig codigo
Código Delphi [-]
var
  incctacte:TFIngresoctacte;
  cierravta:TFCierreVenta;
  costo,precio:double;
  porcentage_pago_efectivo:double;//porcentage de pago efectivo y el costo que le corresponde
begin
  if modulodatos.IBTTictmp.RecordCount<>0 then
  begin
    cierravta:=TFCierreVenta.create(self);
    cierravta.ETotalvta.Text:=floattostrf(VPTotal_venta,ffNumber,10,2);
    cierravta.EEfectivo.Text:=floattostrf(VPTotal_venta,ffNumber,10,2);
    try
      if cierravta.showmodal=mrOK then
      begin
        if roundto(VPTotal_venta,-2)=roundto(cierravta.efectivo,-2) then
        begin
        //paga todo en efectivo
          Fprincipal.inserta_en_vtadiaria('ef');
        //  Close;
        end
        else
        begin
          if roundto(VPTotal_venta,-2)>roundto(cierravta.efectivo,-2) then
          begin
            acumula_total_venta(costo,precio);
            porcentage_pago_efectivo:=roundto(cierravta.efectivo/VPTotal_venta,-2);
            incctacte:=TFIngresoctacte.create(self);
            incctacte.ctacte:=cierravta.efectivo;
            try
              if incctacte.showmodal=mrOK then///en esta linea se hace=0
              begin
                inserta_en_vtadiaria_vtadividida(costo*porcentage_pago_efectivo,cierravta.efectivo,'ef');
                inserta_en_vtadiaria_vtadividida(costo-(costo*porcentage_pago_efectivo),VPTotal_venta-cierravta.efectivo,'cc');
              end;
            finally
              incctacte.Free;
              inicializa_ingreso;
              inicializa_venta;
            end;
todo esto esta dentro de la funcion para cerrar una venta. VPTotal_venta es un propiedad del form definida asi
Código Delphi [-]
 private
    Ftotal_venta:double;
.
.
public
 property VPTotal_venta:double read FTotal_venta write FTotal_venta;
Cuando hago el segundo showmodal vptotal_venta se hace=0:eek::eek::eek:, alguien podri decirme que es lo que estoy haciendo mal? muchas gracias
Fede

Al González 14-09-2007 07:54:21

Disculpa Fede, pero está algo difuso el planteamiento. No sé si la función acumula_total_venta modifique la propiedad en cuestión, o si haya alguna otra rutina que lo haga. Tales códigos serían de utilidad también.

Pero de cualquier manera, sería bueno intentar plantearlo con un poco más de orden, contexto y claridad.

Gracias.

Al González. :)

fedelphi 14-09-2007 15:39:24

ok, disculpas por el desorden y la falta de info, es que estuve todo el dia de ayer programando y estaba medio saturado. El tema es asi, esta parte es para cerrar una venta que puede ser toda en efectivo:), o parte en efectivo y el resto que falta va a una cuenta corriente. Entonces cuando llamo a
Código Delphi [-]
 cierravta:=TFCierreVenta.create(self);
    cierravta.ETotalvta.Text:=floattostrf(VPTotal_venta,ffNumber,10,2);
    cierravta.EEfectivo.Text:=floattostrf(VPTotal_venta,ffNumber,10,2);
    try
      if cierravta.showmodal=mrOK then
muestro dos TEdits uno con el monto total y otro para ingresar el efectivo asi
Código Delphi [-]
procedure TFCierreventa.EEfectivoKeyPress(Sender: TObject; var Key: Char);
begin
  if (key in ['a'..'z'])or(key in ['A'..'Z'])then
    key:=#0;

  if (key=#13)and(EEfectivo.text<>'') then
  begin
    Key:=#0;
    FEfectivo:=strtofloat(EEfectivo.Text);
    ModalResult:=mrOK;
  end;
end;
luego analizo si se pago todo el monto o solo una parte y hay que acumular en cta cte asi
Código Delphi [-]
if roundto(VPTotal_venta,-2)>roundto(cierravta.efectivo,-2) then
          begin
            acumula_total_venta(costo,precio);
            porcentage_pago_efectivo:=roundto(cierravta.efectivo/VPTotal_venta,-2);
            incctacte:=TFIngresoctacte.create(self);
            incctacte.ctacte:=cierravta.efectivo;
            try
              if incctacte.showmodal=mrOK then///en esta linea se hace=0
entonces en incctacte pregunto por el cliente al cual se le computara el monto
Código Delphi [-]
procedure TFIngresoCtaCte.BIncorporarClick(Sender: TObject);
begin
  try
    if verifica_limite_cuenta then
    begin
      with modulodatos do
      begin
        if not ibtransaction1.InTransaction then
          IBtransaction1.StartTransaction;
        if not IBTClientes.Active then
          IBTClientes.open;

        IBTClientes.Locate('COD_CLIENTE',VPRid_cliente,[]);
        IBTClientes.Edit;
        IBTclientes.fieldbyname('SALDO').AsFloat:=IBTclientes.fieldbyname('SALDO').AsFloat+FPrincipal.VPtota  l_venta-Fctacte;
        IbTClientes.Post;
        IBtransaction1.CommitRetaining;
        //ModalResult:=mrOK;
      end;
      FPrincipal.inserta_en_vtadiaria('cc');
    end;
    //Close;
  except
    on e:exception do
    begin
      Modulodatos.IBTransaction1.RollbackRetaining;
      showmessage('Error al actualizar la cuenta en TFIngresoCtaCte.BIncorporarClick --'+e.message);
      ModalResult:=mrabort;
    end;
  end;
end;
la funcion verifica_limite_cuenta es esta
Código Delphi [-]
function TFIngresoCtaCte.verifica_limite_cuenta: boolean;
begin
  if VPRCli_saldo+Fprincipal.VPtotal_ventathen
  begin
    result:=true;
  end
  else
  begin
    if messagedlg('El cliente supera el límite de cuenta otorgado. Permite la compra?',mtWarning,mbOKCancel,0)=mrOK then
    begin
      result:=true
    end
    else
    begin
      result:=false;
      FPrincipal.inicializa_ingreso;
      FPrincipal.inicializa_venta;
      showmessage('Venta cancelada.');
    end;
  end;
end;
por lo que no modifico el valor que se hace =0. Gracias y de nuevo disculpas.
Fede

dec 14-09-2007 15:43:56

Hola,

La propiedad que dices forma parte de una clase. Parece que haces uso de un objeto de dicha clase y luego liberar la instancia de dicho objeto. Si a continuación creas una nueva instancia del objeto... el valor de la propiedad será el valor que se de en el constructor del objeto en cuestión. Si no se le da ningún valor el compilador le dará uno por defecto: parece que en este caso es cero.

Lo que yo miraría es en el constructor del objecto de marras. Me aseguraría de que dicha propiedad se inicializa en el valor que interesa. Esto suele hacerse en el propio método constructor, e insisto, de no hacerlo, la variable (a la que al cabo hacer referencia la propiedad) será inicializada por el compilador con un valor por defecto.

fedelphi 14-09-2007 16:10:47

Ya encontre el problema, efectivamente estaba inicializando la variable, disculpas de nuevo. Cuando se esta mucho tiempo programando creo que hay que dejar las preguntas/dudas para el otro dia, jaja. Disculpas de nuevo por una pregunta tan tonta.
Federico

dec 14-09-2007 16:12:46

Hola,

No; no creo que fuera una pregunta tonta. Yo apunté por ahí porque vi que hacías de la propiedad de un objeto que a continuación (luego de usarlo) liberabas. Entonces el asunto estaba más o menos claro: en el constructor de dicho objeto no se inicializa la variable tal como esperas. Pero lo que dices es cierto: a veces se lleva mucho tiempo liado con algo y tanto esfuerzo no se ve recompensado. Ya lo decía Miguel de Unamuno: "Trabajar mucho puede ser señal de estar haciendo las cosas mal". :D


La franja horaria es GMT +2. Ahora son las 23:22:57.

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