Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cómo hacer para retornar valores de una Unit a otra (https://www.clubdelphi.com/foros/showthread.php?t=63855)

karo 05-03-2009 18:58:25

Cómo hacer para retornar valores de una Unit a otra
 
Hola, que pena con ustedes, soy nueva en este foro y no se donde dirigirme para poder aclarar mis dudas sobre delphi, estoy manejando delphi hace apenas unos días, con programacion orientada a objetos, bueno mi pregunta es la siguiente, estoy por ejemplo en una Unit1, desde esa Unit deseo llamar a otra Unit2, bueno en esta parte toda va bien ya lo hice desde la unit1 llamar a la Unit2, pero es lo siguiente, tengo informacion en la Unit2 por ejemplo un codigo, y necesito q sea retornado el valor de ese codigo a la unit 1, como hago para poder hacerlo, yo se que es algo muy elemental pero de igual manera soy nueva en el aprendizaje de delphi y se me hace dificil, porfa agradezco sea atendida mi solicitud, gracias

Delphius 05-03-2009 19:50:03

Hola Karo,
Bienvenido a clubdelphi. Como eres nueva en los foros, te invito a que destines unos minutos para conocer la guia de estilo.

Respecto a tu pregunta, sería oportuno que aclares mejor tu situación. Un ejemplo de como lo estás haciendo, o enfocando el problema.

Inicialmente si unit A debe comunicarse con otra B, A debe tener declarado en uses a B.

Ahora bien, si a su ves B debe comunicar a A algo, debe declarar en uses a A.

El problema es que si ambos se referencian... se forma una dependencia circular. Esto se soluciona trasladando la sección el "uses X" siendo X la unidad de A o B, de la sección interface a la sección implementation:

Código Delphi [-]
...

implementation
uses UnitX;
...

Ahora bien, en lo posible deben evitarse éstas dependencias mutuas, se puede plantear alguna alternativa. Y es por ello que yo indicaba al comienzo si nos puedes comentar con mayores detalles tu caso.
Es una pregunta muy general el hecho de que "una unit deba devolver el dato a otra", cuanto más puntual seas más fácil será tratarlo.

Lo más elemental sería que en Unit2, exista alguna función o método (si es que le pertenece a una clase) que regrese el valor que unit1 necesita. De este modo se puede evitar esta mutua dependencia y sólo unit1 se mantiene acoplada a unit2. Algo así:
Código Delphi [-]
Unit unit2;

...


interface

function UnaFuncion(Parametro: tipo_parametro): tipo_resultado;
...

implementation

function UnaFuncion(Parametro: tipo_parametro): tipo_resultado;
begin
  ...
end;

...
end.

Y de este modo, luego Unit1 puede hacer uso de Unit2:


Código Delphi [-]
Unit Unit1;

interface
uses Unit2; 
// Nota como sólo unit1 conoce a unit2 no se hace falta poner este
// uses en implementation y evitar una referencia circular.

...

implementation

procedure Form1.Button1Click(Sender: TObject);
// en este ejemplo, lo llamamos desde un botón
var algo: tipo_resultado;
begin
  algo := UnaFuncion(...); 
  //llamamos a la función de Unit2 y esta nos regresa el resultado
end;

...

end.

Como te éstas iniciando en Delphi, sugiero que te acerques a la sección FTP y wiki del club. Allí encontrarás material tanto teórico como práctico. Recomiendo la lectura de la Cara Oculta de Delphi 4.

Si tienes mayores dudas puedes consultarnos, pero recomiendo que antes de iniciar un hilo nuevo, realices una búsqueda. Existe la posibilidad de que tu duda haya sido tratada.

Por cualquier duda sobre este tema que iniciaste, continúa aquí por favor.

Saludos,

karo 10-03-2009 14:25:03

Muchas gracias Delphius, en realidad no se como hacer, mira yo te dije q pues ya puedo llamar una unit2 desde una Unit1, pero cuando intento hacer lo de retornar un valor a la unit1 desde la unit2 no se como hacerlo hice lo q tu me dices, pero me vota error en la declaracion e implemtacion de la funcion creo q algo estoy haciendo mal o en su defecto no se como declarar ni implemtnar una funcion porfa colaborame, es muy importante para mi, no se si tienes lineas de codigo con la cual me pueda guiar gracias..

Delphius 10-03-2009 16:57:13

Hola karo,
Sería oportuno que nos indiques tu código para ver donde está la falla, y de paso podemos entender donde y cómo estás refenciando a las units y el uso que le estás dando a tus variables, métodos y/o procedimientos y funciones.

Va a ser mucho mejor que nos comentes bien tu caso, en vez de estar poniendo un código y estar adivinando por donde estará el problema.

El error que comentas sobre la declaración de implementación posiblemente se deba a que tienes declarado en la sección implementation el código del procedimiento al que intentas invocar y en interface no tienes su declaración... El asunto es que, sin ofender, si ver lo que estás haciendo y no haber expuesto el error textualmente ¿de que módo puedo ayudarte? No quiero estar a la adivinanzas, por favor brinda los debidos detalles para entenderte. Te lo he dicho en el anterior mensaje: comentanos.

Saludos,

karo 11-03-2009 17:46:20

Si señor usted tiene toda la razon tengo que ser mas explicita, a continuacion le envio los dos programas la Unit1 y la Unit3. para que usted ayude a mirar cual es el error, muchas gracias.

Código Delphi [-]
unit Unit1;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit3, StdCtrls;
type

TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Label1Click(Sender: TObject);

private
{ Private declarations }
public
ar:string; { Public declarations }
end;

var

Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
gise:Tform3;
begin
gise:=Tform3.Create(self);
gise.show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ar:= sumardosnumeros(num1,num2:interger):string;
end;

procedure TForm1.Label1Click(Sender: TObject);
begin
label1.caption:=ar;

end;
end.

unit Unit3;

interface
function sumardosnumeros(num1,num2:interger):string;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm3 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
function sumardosnumeros(num1, num2:interger): string;
var
suma:interger;
va=string;
begin
num1:=1;
num2:=2;
suma:=num1+num2;
va:=intostr(suma);
Result:= va;

end;
end.

Delphius 12-03-2009 04:57:17

Hola Karo,
El error que veo está en que que tienes mal declarado la función sumardosnumeros. Veamos, la forma correcta es como sigue:

Código Delphi [-]
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

function sumardosnumeros(num1, num2: integer): integer;

var
  Form2: TForm2;

implementation

{$R *.dfm}

function sumardosnumeros(num1, num2: integer): integer;
begin
  result := num1 + num2;
end;

end.

Fíjate que declaro la función despues del la definición del TForm2. Como puede observarse esta declaración pertenece a la sección interface. Compara con el tuyo y notarás que defines la función entre la declaración interface y uses. Eso no es correcto.

Además el otro error está en escribir el cuerpo o código de dicha función dentro del evento OnClick del boton1. No es correcto, si te fijas el código está fuera...
Ahora bien, si sigues los pasos como muestro en mi ejemplo, notarás que en tu form1 ya puedes incluir una referencia en uses hacia unit3 y podrás llamar a la función de forma algo similar a esto:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, StdCtrls;
// en mi caso es unit2! es un ejemplo recuerda!

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var n1, n2: integer;
begin
  n1 := StrToInt(edit1.Text);
  n2 := StrToInt(edit2.Text);
  ShowMessage(intToStr(sumardosnumeros(n1,n2)));
// llamamos a la función definida en el otro form.
end;

end.

¿Ya leíste un poco al libro que te he recomendado? Ve al capítulo 3, página 57. Allí está bien explicado como se estructura una unit, como se declaran los tipos, variables, procedimientos, funciones, clases y métodos.

Se puede declarar una función o procedimiento de otro, e incluso dentro de un evento... algo parecido a como lo tenías declarado en tu button1 de tu unit3. La cuestión es que si lo haces, sólo estas funciones y procedimientos "internos" sólo podrán ser usados dentro del evento, función o procedimiento principal. Además estos procedimientos y/o funciones internas no necesitan declaración en interface. Algo así:

Código Delphi [-]
function SumarNumeros(Numero1, Numero2: integer): integer;
  // una función interna
  // fíjate el tabulado... ayuda a comprender mejor.
  function EsPositivo(Numero: integer): integer;
  begin
    result := Numero >= 0;
  end;

begin
  if EsPositivo(Numero1) AND EsPositivo(Numero2)
     then result := Numero1 + Numero2
     else result := -1; // digamos que este -1 significa un "error"
end;

Ahora sólo basta con agregar la declaración en la sección interface de la función SumarNumeros para que funcione.

Creo que con esto se entenderá mejor el tema. Si tienes mayores dudas por favor dilo y vamos llendo paso a paso. Recomiendo mucho la lectura de la Cara Oculta.

Si antes de Delphi pasaste por Pascal no creo que te resulte complicado adaptarte.

Espero que se me entienda.

Saludos,
PD: Acostumbrate a emplear las etiquetas delphi:
[ DELPHI ]
tu código aquí...
[ /DELPHI ]

(Sin los espacios entre los corchetes). Notarás como el sistema de los foros solito le dará el formato adecuado... esto ayuda a comprender mejor el código. Como consejo, tabula tu código.

Delphius 14-03-2009 21:57:28

¿Se me entendió karo?
¿Hay dudas?:confused::(

Saludos,


La franja horaria es GMT +2. Ahora son las 19:12:35.

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