PDA

Ver la Versión Completa : Como usar procedure en otro Unit


bulc
07-12-2012, 14:25:39
Tengo un procedimiento de usuario para ejecutar sonidos cuyas constantes se colocan en la sección Interface del Unit principal. Luego el procedimiento está en la seccion Implementation ( Procedure Toca(xFile: PChar);) y también en todos y cada una de las unidades secundarias.
Integro en el Uses, sección Implementation de cada unidad secundaria el mismo procedimiento y le coloco la constante que está en el principal.
Funciona perfectamente, pero me gustaría saber como se puede hacer pública la función externa de usuario (Toca(xFile: PChar) de manera que no se tenga que repetir en todas las unidades secundarias. He probado de varias maneras pero sin fortuna.
¿Puede alguien sacarme de dudas?

ecfisa
07-12-2012, 15:45:29
Hola bulc.

Declara la cabecera de función en la sección de interface de la unidad:


unit x;

interface

uses ...;

...
procedure Toca(xFile: PChar);
...

implementation

procedure Toca(xFile: PChar);
begin
...
end;

Esta unidad deberá incluirse en las unidades donde utilices el procedimiento, de ese modo será visible para cada una de ellas.

Saludos.

nlsgarcia
07-12-2012, 16:16:15
bulc,

Revisa esta información:

Unit:
http://www.delphibasics.co.uk/RTL.asp?Name=Unit

Interface:
http://www.delphibasics.co.uk/RTL.asp?Name=Interface

Implementation:
http://www.delphibasics.co.uk/RTL.asp?Name=Implementation

Understanding and Using Functions and Procedures:
http://delphi.about.com/od/beginners/a/subroutines.htm

ANATOMY OF A DELPHI UNIT:
http://delphi.about.com/od/beginners/l/aa051199.htm

Working with units:
http://delphi.about.com/od/beginners/l/aa100103a.htm

How to run procedure from another unit?:
http://stackoverflow.com/questions/1410993/how-to-run-procedure-from-another-unit
Espero sea útil :)

Nelson.

bulc
07-12-2012, 17:26:55
Hola bulc.

Declara la cabecera de función en la sección de interface de la unidad:


unit x;

interface

uses ...;

...
procedure Toca(xFile: PChar);
...

implementation

procedure Toca(xFile: PChar);
begin
...
end;

Esta unidad deberá incluirse en las unidades donde utilices el procedimiento, de ese modo será visible para cada una de ellas.

Saludos.
Una duda. La incluyo en la unidad secundaria, pero ¿en el uses de interface o en el de implementation?
Y nada más que agradecerte tu buena guía. Gracias.

nlsgarcia
07-12-2012, 17:48:31
bulc,


Una duda. La incluyo en la unidad secundaria, pero ¿en el uses de interface o en el de implementation?

En términos prácticos en cualquiera de las dos.

En términos teóricos depende de la ámbito de visibilidad que quieras dar a tu unidad, interface es pública, implementation es privada.

Espero sea útil :)

Nelson.

ecfisa
07-12-2012, 18:02:17
Hola bulc.

En este caso basta con incluirla en la sección de implementación.

Si necesitaras de una declaración de la unidad B para conformar otra de la unidad A que se encuentra en la sección de interface de esta última, tendrías que incluirla en la sección de interface. Ejemplo:

Unidad B:

unit UnitB;

interface

uses ...;

type
TMiClase = class(TObject)
Miembro: string;
end;
...


Unidad A:

unit UnitA;

interface

uses ..., UnitB;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FClase: TMiClase; // <- Necesario inclusión previa de B
public
end;
...

En este caso, como es lógico, es necesario que la unidad B este incluida con anterioridad al uso de TMiClase ya que de otro modo no sería conocida en ese punto por la unidad A

Saludos.

bulc
08-12-2012, 15:10:25
Gracias por tus indicaciones, muy provechosas. He adaptado el código y va perfectamente, con lo cual uno se ahorra mucho código.
También he descubierto por casualidad (serendipia pura) que se puede usar el código de un botón citando el nombre del botón como prefijo seguido de punto y el nombre del evento. Por ejemplo BitBtn2.Click. Nunca lo había visto especificado en los libros de Delphi que uso. Claro que son un poco obsoletos. De Delphi 4 y 5. Pero bueno, lo menciono por si alguien lo lee.
Saludos,
Bulc.

Casimiro Notevi
08-12-2012, 16:41:19
Eso es que no has leido bien los libros ;)

Uno cualquiera en La cara oculta de Delphi 4 (http://www.intitec.com/varios/La_Cara_Oculta_De_Delphi_4.pdf):
procedure TwndLibretas.DBGrid1DblClick(Sender: TObject);
begin
bnOk.Click;
end;

bulc
09-12-2012, 12:39:15
Eso es que no has leido bien los libros ;)

Uno cualquiera en La cara oculta de Delphi 4 (http://www.intitec.com/varios/La_Cara_Oculta_De_Delphi_4.pdf):
procedure TwndLibretas.DBGrid1DblClick(Sender: TObject);
begin
bnOk.Click;
end;


"Nunca es tarde si la dicha es buena"...