Ver Mensaje Individual
  #2  
Antiguo 31-01-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
El problema es que tu procedimiento LlenarEtiqueta utiliza variables globales


Código Delphi [-]
procedure llenaretiqueta(subtotal: Currency);
begin
  subtotal := datos.sqcalcularcoti.FieldByName('totalcoti').AsCurrency;
  formeditarcot.etsubtotal.Caption := FormatCurr('#0,.00', subtotal);
  iva := (subtotal * 0.12);
  formeditarcot.etiva.Caption := FormatCurr('#0,.00', iva);
  total := (subtotal + iva);
  formeditarcot.ettotal.Caption := FormatCurr('#0,.00', total);
  actualizarmontos(documentonro, total, iva, subtotal);
end;

Primero que nada señalar que hay algo extraño en tu procedimiento, y es que recibe un parametro subtotal el cual no utilizas para nada dentro de tu procedimiento. Osea, la primer linea lo que hace es asignar un valor a subtotal.

Yo diria que elimines dicho parametro y utilices una variable local, asi

Código Delphi [-]
procedure llenaretiqueta;
var
  subtotal: Currency;
begin
  subtotal := datos.sqcalcularcoti.FieldByName('totalcoti').AsCurrency;
end;

Las que subraye son variables globales. A veces suele ser confuso el tema de las globales porque es dificil determinar exactamente sobre que form "esta trabajando el procedimiento"

Una alternativa mejor es incluir el procedimiento como metodo dentro del form sobre el cual queres que trabaje:

Código Delphi [-]
unit Unit1;

interface

uses
  ...

type
  TForm1 = class(TForm)
  public
    procedure llenaretiqueta(subtotal: Currency);
  end;

implementation

...

procedure TForm1.llenaretiqueta(subtotal: Currency);
begin
  // implementacion del metodo
  // es importante que elimines las referencias globales
  // en lugar de esto:
  formeditarcot.ettotal.Caption := FormatCurr('#0,.00', total);
  // deberia ser esto:
  ettotal.Caption := FormatCurr('#0,.00', total); 
end;

Entonces ahora la forma de invocar al codigo cambia un poco porque mas que un "procedimiento suelto" lo que necesitas es una variable TForm1 (en mi ejemplo, en tu caso es el nombre que tiene tu clase Form) y luego invocar a ese procedimiento llenarEtiqueta. Es similar a como invocas a ShowModal, por ejemplo:

Código Delphi [-]
var
  Form1: TForm1;
begin
  Form1 := TForm1.Create(nil); // creamos el form
  try
   // se ejecuta el metodo LlenarEtiqueta, actualizando los componentes del 
   // form referenciado por la variable Form1
   Form1.LlenarEtiqueta(0); 
   Form1.ShowModal; // mostrar el form
   Form1.LlenarEtiqueta(123); // podes invocar al metodo LlenarEtiqueta en cualquier momento..
  finally
    Form1.Free; // liberar memoria
  end;
end;

Lo importante es que entiendas sobre que elemento estas trabajando:

Código Delphi [-]
formeditarcot.ettotal.Caption := lo que sea

Esa sentencia de codigo esta actualizando el valor del caption de un (edit o label asumo) llamado ettotal, pero sobre el form que es referenciado por la variable formeditarcot

----


En realidad tu problema es mas de conceptos porque estas programando mas de forma procedimental (o pascal clasico) y no orientado a objetos.. y este tipo de cosas es chocante

Creo que lo mas adecuado es que leas algo de material relacionado a programacion orientada a objetos. Un muy buen punto de partida es el libro La Cara Oculta de Delphi 6

Este hilo recopila algunos links a recursos para iniciados en Delphi
Responder Con Cita