Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-01-2017
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 274
Poder: 17
webmasterplc Va por buen camino
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;
Responder Con Cita
  #2  
Antiguo 31-01-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 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
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Procedimiento almacenado que no hace nada dentro de un trigger AzidRain MySQL 5 12-04-2012 08:28:49
Alamcenar Result de storedProc desde otra unidad R0M3R0 Conexión con bases de datos 3 22-08-2008 01:32:52
Acceder a un DataSet desde otra unidad SMTZ .NET 5 24-12-2005 09:01:47
Acceder a un DataSet (.NET) desde otra Unidad SMTZ .NET 9 22-10-2005 17:10:40
Crear Trigger y llamarlo desde Delphi BlueSteel Conexión con bases de datos 2 26-07-2005 20:53:47


La franja horaria es GMT +2. Ahora son las 01:44:29.


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
Copyright 1996-2007 Club Delphi