Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-03-2009
karo karo is offline
Registrado
 
Registrado: mar 2009
Posts: 3
Poder: 0
karo Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 05-03-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 19
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 10-03-2009
karo karo is offline
Registrado
 
Registrado: mar 2009
Posts: 3
Poder: 0
karo Va por buen camino
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..

Última edición por karo fecha: 10-03-2009 a las 14:47:03.
Responder Con Cita
  #4  
Antiguo 10-03-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 19
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 11-03-2009
karo karo is offline
Registrado
 
Registrado: mar 2009
Posts: 3
Poder: 0
karo Va por buen camino
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.

Última edición por dec fecha: 12-03-2009 a las 04:59:06. Razón: Añadir las etiquetas DELPHI
Responder Con Cita
  #6  
Antiguo 12-03-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 19
Delphius Va camino a la fama
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
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 12-03-2009 a las 05:00:46.
Responder Con Cita
  #7  
Antiguo 14-03-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 19
Delphius Va camino a la fama
¿Se me entendió karo?
¿Hay dudas?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Retornar o no retornar desde un script principal dec PHP 6 25-03-2008 00:41:12
Como hacer para que una funcion regrese varios valores jangel_ramirezm Varios 11 07-03-2008 23:14:49
Cómo puedo hacer para que una variable valga 2 valores al mismo tiempo wlad Internet 15 19-12-2007 19:06:03
Como pasar los valores de una tabla a otra! Carlosguiland MySQL 4 15-06-2004 23:58:20
¿Como puedo llamar un Procedure desde otra unit? athal Lazarus, FreePascal, Kylix, etc. 11 17-05-2004 02:05:20


La franja horaria es GMT +2. Ahora son las 23:17:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi