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 29-09-2013
aitorqrv aitorqrv is offline
Miembro
 
Registrado: abr 2007
Posts: 18
Poder: 0
aitorqrv Va por buen camino
Ejecutar una función de otra unidad

Hola a todos, a mi cuando programo en PHP me gusta ordenar las funciones todas juntas o ordenarlas por tipos diferentes en archivos separarados. Esto lo hago para poder depurar el programa mas cacilmente en el futuro, pero en delphi no se como se hace.

Por ejemplo me gustaria meter esta función en Unit2 y poder llamarla y utilizarla desde Unit1:

Código Delphi [-]
function ReverseString( s : string ) : string;
var
  i  : integer;
  s2 : string;
begin
  s2 := '';
  for i := 1 to Length( s ) do
    s2 := s[ i ] + s2;
  Result := s2;
end;

Yo he intentado hacerlo asi, pero no funciona:

Unit1.pas
Código Delphi [-]
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

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

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

uses
  unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
   form1.edit1.Text := ReverseString(form1.edit1.Text);
end;

end.

Unit2.pas
Código Delphi [-]
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

implementation

function ReverseString( s : string ) : string;
var
  i  : integer;
  s2 : string;
begin
  s2 := '';
  for i := 1 to Length( s ) do
    s2 := s[ i ] + s2;
  Result := s2;
end;

end.

Gracias gracias.
Responder Con Cita
  #2  
Antiguo 29-09-2013
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Para que sea visible desde otras unidades, has de declarar la función en la "interface" de su unidad, es decir:

Código Delphi [-]
unit Unit2;

{$mode objfpc}{$H+}

interface

function ReverseString( s : string ) : string;

uses
  Classes, SysUtils;

implementation

function ReverseString( s : string ) : string;
var
  i  : integer;
  s2 : string;
begin
  s2 := '';
  for i := 1 to Length( s ) do
    s2 := s[ i ] + s2;
  Result := s2;
end;

end.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 29-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
aitorqrv

Cita:
Empezado por aitorqrv
...me gustaria meter esta función (ReverseString) en Unit2 y poder llamarla...desde Unit1...he intentado...pero no funciona...
Revisa este código:
Código Delphi [-]
unit Unit2;

interface

function ReverseString( s : String ) : String;

implementation

function ReverseString( s : String ) : String;
var
   i  : integer;
   s2 : string;

begin

   s2 := '';

   for i := 1 to Length( s ) do
      s2 := s[ i ] + s2;

   Result := s2;

end;

end.
El código anterior define una función (ReverseString) en Unit2 que es visible externamente a otras unidades (Interface Section).


Revisa este código:
Código Delphi [-]
 unit Unit1;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls;
 
 type
   TForm1 = class(TForm)
     Button1: TButton;
     Edit1: TEdit;
     procedure Button1Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;
 
 var
   Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 uses Unit2;
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
    Edit1.Text := ReverseString(Edit1.Text);
 end;
 
 end.
El código anterior utiliza la función ReverseString definida en Unit2.


En el caso particular que planteas en el Msg #1, es mejor utilizar las funciones nativas de Delphi:
Código Delphi [-]
  ...
  uses StrUtils;
  
  procedure TForm1.Button1Click(Sender: TObject);
  begin
     Edit1.Text := ReverseString(Edit1.Text);
  end;
  ...
El código anterior utiliza la función ReverseString de la unidad StrUtils.


Delphi posee un extenso grupo de funciones para el manejo de Strings, revisa esta información:
Cita:
Operaciones con cadenas de texto (I) : http://delphiallimite.blogspot.com/2...e-texto-i.html

Operaciones con cadenas de texto (II) : http://delphiallimite.blogspot.com/2...-texto-ii.html

Operaciones con cadenas de texto (III) : http://delphiallimite.blogspot.com/2...texto-iii.html

Revisa esta información relacionada al uso de unidades en Delphi:
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 29-09-2013 a las 20:20:44.
Responder Con Cita
  #4  
Antiguo 29-09-2013
aitorqrv aitorqrv is offline
Miembro
 
Registrado: abr 2007
Posts: 18
Poder: 0
aitorqrv Va por buen camino
Muchas gracias a todos por la respuesta y por toda la la informació adicional he analizado los codigos y me han funcionado a la primera.

Gracias.
Responder Con Cita
  #5  
Antiguo 30-09-2013
aitorqrv aitorqrv is offline
Miembro
 
Registrado: abr 2007
Posts: 18
Poder: 0
aitorqrv Va por buen camino
Hola, otra pregunta relacionada con el mismo tema:

Ahora en unit2 puedo meter funciones que me devuelven parametros, pero en unit2 no me deja hacer cosas como form1.edit1.Text := 'hola';

Al declarar el uses unit2 y las funciones en interface ¿el código fuente no se tendría que comportar como si se trasase de un solo archivo para poder modificar un parametro tanto desde unit1 o unit2?

Muchas gracias.
Responder Con Cita
  #6  
Antiguo 30-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
aitorqrv,

Cita:
Empezado por aitorqrv
...¿El código fuente no se tendría que comportar como si se trasase de un solo archivo para poder modificar un parámetro tanto desde Unit1 o Unit2?...
Revisa este código:
Código Delphi [-]
unit Unit2;

interface

// Cabecera de Funciones y Procedimientos de Unit2 visibles en otras unidades

implementation

uses Unit1; // Referencia a Unit1

// Implementación de Funciones y Procedimientos de Unit2 (Internas y Externas)

end.
El código anterior referencia Unit1 en Unit2.

Te sugiero revisar los links del Msg #3, relacionados al Uso de Unidades en Delphi.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 30-09-2013 a las 15:58:17.
Responder Con Cita
  #7  
Antiguo 30-09-2013
aitorqrv aitorqrv is offline
Miembro
 
Registrado: abr 2007
Posts: 18
Poder: 0
aitorqrv Va por buen camino
Muchas gracias nuevamente, intentare de buscar algo de información en español. Tenia miedo de usar uses unit1 por el tema de la referencia circular (me parece que se llama asi el error que da cuando dos unit se referencian entre si en el uses) y por eso no lo intente con el uses.

Gracias.
Responder Con Cita
  #8  
Antiguo 30-09-2013
Avatar de Pericles
Pericles Pericles is offline
Miembro
NULL
 
Registrado: sep 2013
Ubicación: Buenos Aires, Argentina
Posts: 24
Poder: 0
Pericles Va por buen camino
Efectivamente el error es el siguiente..


[DCC Fatal Error] Unit1.pas(7): F2047 Circular unit reference to 'Unit1'

Se soluciona declarandolas entre si pero en el Uses de Implementation/ Interface

ejemplo:

Código Delphi [-]
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Registry, unit2;


Código Delphi [-]
unit Unit2;
interface

implementation
uses
unit1;

Ssaludos
Nicolas Perichon
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
Función javascript que llama a otra función javascript en otra página jandroruiz HTML, Javascript y otros 4 28-02-2013 11:38:00
Problema con un procedure en otra unidad HombreGordo Varios 1 23-12-2011 19:20:35
Almacenando datos en una variable de otra unidad R0M3R0 OOP 11 21-08-2008 21:09:04
Acceder a un DataSet desde otra unidad SMTZ .NET 5 24-12-2005 09:01:47
ejecutar una funcion d otra Unit negama Varios 2 08-09-2003 19:32:18


La franja horaria es GMT +2. Ahora son las 15:10:07.


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