Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ejecutar una función de otra unidad (https://www.clubdelphi.com/foros/showthread.php?t=84272)

aitorqrv 29-09-2013 18:23:39

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.

dec 29-09-2013 20:05:10

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.

nlsgarcia 29-09-2013 20:10:30

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.

aitorqrv 29-09-2013 21:09:59

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.

aitorqrv 30-09-2013 15:27:08

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.

nlsgarcia 30-09-2013 15:50:26

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.

aitorqrv 30-09-2013 16:34:05

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.

Pericles 30-09-2013 17:55:19

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


La franja horaria es GMT +2. Ahora son las 05:55:12.

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