Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Procedimiento no hace nada al llamarlo desde otra unidad y desde la misma unida si (https://www.clubdelphi.com/foros/showthread.php?t=91414)

webmasterplc 31-01-2017 20:45:49

Procedimiento no hace nada al llamarlo desde otra unidad y desde la misma unida si
 
buenas tengo un procedimiento que uso para hacer un calculo y llamar otras funciones, el cual lo tengo declarado en interface y lo leo desde otras unidades, el mismo lo llamo y no hace nada, pero si coloco contenido del procedimiento en un boton funciona fino
el procedimiento esta en el

form1tengo el cprocedimiento

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;
solo le paso un parametro en formato moneda

lo llamo desde form2, form 2 lo llame de form1 ambos showmodal lo llamo y mando a cerrar el form.
ahora desde el mismo form 1 coloco un nboton y funciona bien
Código Delphi [-]
procedure Tformeditarcot.btnetiquetasClick(Sender: TObject);
begin
subtotal:=datos.sqcalcularcoti.FieldByName('totalcoti').AsCurrency;
etsubtotal.Caption:=FormatCurr('#0,.00',subtotal);
iva:=(subtotal*0.12);
etiva.Caption:=FormatCurr('#0,.00',iva);
total:=(subtotal+iva);
ettotal.Caption:=FormatCurr('#0,.00',total);
actualizarmontos(documentonro,total,iva,subtotal);
end;

AgustinOrtu 31-01-2017 22:21:39

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


La franja horaria es GMT +2. Ahora son las 23:58:27.

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