PDA

Ver la Versión Completa : Crear un unit tipo libreria


D@byt
04-05-2005, 16:17:26
¿Cómo puedo hacer para tener todas las funciones del programa en un unit solo y llamar desde los formularios a estas funciones? Gracias.

delphi.com.ar
04-05-2005, 16:22:06
Simplemente escribiendo todo ahí y usando esta unit desde el resto de las units... lo que o creo que sea nada lógico ni práctico.

dec
04-05-2005, 16:29:02
Hola,

Añades una unidad a tu proyecto, en la cual declaras e implementas los procedimientos y funciones que te sean menester, por ejemplo.

Luego, en las unidades de los formularios en que quieras utilizar la unidad antes dicha, o sea, sus procedimientos, funciones, etc., añades dicha unidad en la cláusula Uses.

A partir de ahí usas lo implementado en la unidad, sencillamente.

¿Un poco de código a modo de ejemplo?

Esta unidad corresponde a un formulario:



unit Unit1;

interface

uses
Forms, Classes, Controls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Declaraciones privadas }
public
{ Declaraciones públicas }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses
Unit2; // Unidad Unit2, contiene Saludame();

procedure TForm1.Button1Click(Sender: TObject);
begin
Saludame; // Se implementa en Unit2
end;

end.



Si te fijas en la cláusula Uses de la unidad se incluye la unidad "Unit2", en la que se implementa el procedimiento Saludame, como puedes ver a continuación:



unit Unit2;

interface

uses Dialogs;

procedure Saludame;

implementation

procedure Saludame;
begin
ShowMessage('¡Hola, cómo va eso!');
end;

end.



Nota que la unidad Unit2 (según el código anterior) se encuentra en el mismo directorio en que se encuentra la unidad Unit1, de no ser así, ya sabes que podrías incluir la unidad Unit2 en la unidad Unit1 de este otro modo:



uses
Unit2 in 'directorio\Unit2.pas';


Actualización: Sobre esto último (utilizar "Unit2 in directorio\...") podría decirse aún más, pero prefiero que sea el lector quien lo lea por sí mismo en el apartado "The syntax of a uses clause" que puede encontrarse en la ayuda de Delphi: está bien, tal vez es que no me supiera explicar y prefiero que el lector se lo explique a partir de una fuente fidedigna.

Al González
04-05-2005, 20:26:56
¡Buen día a todos!

Si me lo permiten, me gustaría hacer algunas observaciones.

La primera y más importante: el término correcto no es "librería" sino biblioteca, porque proviene del término técnico inglés library, no book store (consúltese cualquier diccionario inglés-español). Los autores y páginas serios utilizan correctamente el término biblioteca, mientras desafortunadamente el vicio informático de llamarle "librerías" a las bibliotecas se ha arraigado hasta en los textos fijos de algunos sitios Web de prestigio.

Pasando del terreno tecno-lingüístico al puramente técnico, me gustaría señalar que en el ejemplo expuesto por Dec, el nombre de la unidad Unit2 no debe colocarse en la cláusula Uses de la interfaz, sino en una cláusula Uses en la implementación. Ya que es en esta última sección donde el compilador encuentra referencias a los contenidos de Unit2.

...
implementation

{$R *.dfm}

Uses
Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
Saludame; // Está en Unit2
end;
...


Cabe señalar que si se quiere crear una biblioteca con funciones de propósito general (que puedan ser usadas en varias aplicaciones), es conveniente mantener por separado el grupo de unidades que conformen dicha biblioteca, y utilizar la entrada «Library path» (ruta de bibliotecas) de la configuración de Delphi, para que el compilador pueda localizar una unidad de la biblioteca cuando su nombre aparezca en una cláusula Uses.

Espero esto sea de utilidad, seguimos en contacto.

¡Un abrazo a todos!

Al González. :)

dec
05-05-2005, 06:00:47
Hola,

Antes de nada deja que diga que tus observaciones me han parecido muy interesantes y que lo que a continuación he hecho lo he hecho a posteriori, esto es, luego de contestar (un poco a la ligera, probablemente) a la pregunta que inició este hilo y luego de leer tus observaciones.

Tras hojear la ayuda de Delphi, concretamente los apartados "Unit references and the uses clause", "Multiple and indirect unit references", "The syntax of a uses clause" y "Circular unit references", aunque muy interesantes todos, acerca del escrúpulo que me queda únicamente he encontrado lo siguiente en "Circular unit references":

"To reduce the chance of circular references, it's a good idea to list units in the implementation uses clause whenever possible. Only when identifiers from another unit are used in the interface section is it necessary to list that unit in the interface uses clause."

Lo cual, sin querer quitarte la razón en absoluto, me deja con la duda, como digo, de qué quieres decir exactamente con:

"El nombre de la unidad Unit2 no debe colocarse en la cláusula Uses de la interfaz, sino en una cláusula Uses en la implementación. Ya que es en esta última sección donde el compilador encuentra referencias a los contenidos de Unit2."


¿No encuentra el compilador referencias a los identificadores de Unit2 si se utiliza la cláusula Interface en lugar de Implementation, siempre que no se haga uso de dichos identificadores en la cláusula Interface de la unidad o programa que referencie y utilize identificadores de Unit2?

Huelga decir que el código fuente de más arriba compila y hace lo que se espera, salvo que algo se me escape, claro está (lo cual no sería raro).

Seguro que sabrás quitarme el escrúpulo, por lo cual ya te doy las gracias por ello y te pido disculpas por las molestias que te tome. Y también te agradezco las ideas que subyacen en tus observaciones, puesto que son ciertamente útiles y para nada las había tenido en cuenta al responder, lo que no dice mucho de mi credibilidad en estos lares...

Al González
05-05-2005, 08:04:38
¡Buen día a todos!

Hombre Dec, gracias a ti por tus comentarios y no hay nada que disculpar. Por el contrario, creo que fui yo quien abusó de ligereza semántica.

..."To reduce the chance of circular references, it's a good idea to list units in the implementation uses clause whenever possible. Only when identifiers from another unit are used in the interface section is it necessary to list that unit in the interface uses clause."...
En eso baso mi convicción de que el nombre de una unidad «no debe colocarse en la cláusula Uses de la interfaz», si lo que requiere esa unidad es y sólo es el código de la implementación. También lo hago por razones de organización, ya que me es más fácil asociar un identificador referenciado en la interfaz o en la implementación con alguna de las unidades listadas en la cláusula Uses respectiva. Aclaro que al expresar «no debe» no intento decir que no se pueda, sino que no es correcto desde mi punto de vista y el de muchos programadores Pascal.

...me deja con la duda, como digo, de qué quieres decir exactamente con:

"...El nombre de la unidad Unit2 no debe colocarse en la cláusula Uses de la interfaz, sino en una cláusula Uses en la implementación. Ya que es en esta última sección donde el compilador encuentra referencias a los contenidos de Unit2."

¿No encuentra el compilador referencias a los identificadores de Unit2 si se utiliza la cláusula Interface en lugar de Implementation, siempre que no se haga uso de dichos identificadores en la cláusula Interface de la unidad o programa que referencie y utilize identificadores de Unit2?

Huelga decir que el código fuente de más arriba compila y hace lo que se espera...
Por supuesto que ha de compilar, eso es indudable. Cuando digo «es en esta última sección donde el compilador encuentra referencias a los contenidos de Unit2» me refiero a que en tu ejemplo la interfaz de la unidad Unit1 no hace ninguna referencia a elementos contenidos en la unidad Unit2, en cambio la implementación sí. Por ello el compilador encontrará la primera referencia hacia un elemento de Unit2 hasta llegar a la implementación, con lo cual se vuelve innecesario que se declare «Unit2» en la cláusula Uses de la interfaz.

...Seguro que sabrás quitarme el escrúpulo...
Pues eso si quién sabe, pero la lucha le hacemos ;).

¡Un abrazo a todos!

Y por favor ya no les llamen "[I]librerías" a las bibliotecas, en buen plan.

Al González. :)

roman
05-05-2005, 16:28:10
Y por favor ya no les llamen "librerías" a las bibliotecas, en buen plan.


Bueno Al, yo entiendo perfectamente que la traducción de library es biblioteca y no librería. Pero a fin de cuentas ambas, librerías y bibliotecas, son lugares que entregan libros. Unas a préstamo y las otras a cambio de un pago, y hay muchas "library.dll" por las que tienes que pagar.

A fin de cuentas, ninguna de las traducciones es correcta, quizá "códigoteca" o "funciónteca" sería mas adecuado.

Más aberrante me parece el uso de términos como "accesar", "entrar datos", "salvar un archivo", "escanear", "resetear", "ícono" (con acento en la i), "loggearse", "chatear", etc.

// Saludos

dec
06-05-2005, 08:25:36
Hola,

Bueno. Gracias por molestarte en responder y tratar de quitarme el escrúpulo que dije me quedaba: va siendo menor. En el código que mostré más arriba, efectivamente, no se hace en la unidad Unit1 ningún uso de referencias (variables, constantes, tipos, prodecimientos, funciones) contenidas en la unidad Unit2 dentro de la interface de la primera.

Así pues para evitar futuras posibles referencias circulares; por indicar, propiamente, lo dicho en el primer párrafo; por ceñirme a lo que "los programadores de Pascal suelen", para hacer más inteligible dicho código y acaso por alguna razón más, editaré el código, de tal forma que se incluye ahora la unidad Unit2 dentro de la cláusula Uses de la sección Implementation de la unidad Unit1.

En algún sitio, no recuerdo cuál, leí algo así como que el programador no puede cometer errores "de bulto" (esto lo añado yo), puesto que al compilador no se le puede hacer trampas. Bien. Discrepo con esto, puesto que no pocas veces código que he escrito compilar, lo que se dice compilar, lo hacía, pero de ahí a que no contiviera errores y hasta de bulto... en fin, que siempre hay quien sabe más que tú y aun más que el compilador, y hasta hacerle trampas, en un momento dado: que uno no sepa hacerlas, es otro cantar, o que no quiera, vaya.

Pero no digo esto por tanto, sino porque tal vez estuviera demás por mi parte decir aquello de "el código de más arriba compila y hace lo que se espera", puesto que, como trato de explicar, probablemente esta no sea la única condición para tener claro que las cosas están bien hechas al cien por cien, o sea, que el código es ya inmejorable: en este caso sin ir más lejos se demuestra que lo es.

En todo caso, a riesgo de ser prolijo, insisto en que únicamente dije lo que dije refiriéndome a que el código compilaba para dar a entender que no comprendía muy bien lo que explicabas en tu comentario, Al, lo que ahora comprendo mejor, gracias a ti: prueba de ello es que sin perder tiempo editaré el código en cuestión, como tengo dicho ya y se podrá ver.

Muchas gracias de nuevo.