Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-05-2005
D@byt D@byt is offline
Miembro
 
Registrado: abr 2005
Posts: 37
Poder: 0
D@byt Va por buen camino
Crear un unit tipo libreria

¿Cómo puedo hacer para tener todas las funciones del programa en un unit solo y llamar desde los formularios a estas funciones? Gracias.
Responder Con Cita
  #2  
Antiguo 04-05-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 04-05-2005
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
Añade una unidad al proyecto...

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:

Código Delphi [-]
  
 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:

Código Delphi [-]
  
 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:

Código Delphi [-]
  
 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.

Última edición por dec fecha: 06-05-2005 a las 08:36:11. Razón: (corregir el código fuente)
Responder Con Cita
  #4  
Antiguo 04-05-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Algunas observaciones

¡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.
Código Delphi [-]
...
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.
Responder Con Cita
  #5  
Antiguo 05-05-2005
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
¿Tierra trágame?

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...
Responder Con Cita
  #6  
Antiguo 05-05-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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.

Cita:
Empezado por dec
..."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.

Cita:
Empezado por dec
...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 [implementació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.

Cita:
Empezado por dec
...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 "librerías" a las bibliotecas, en buen plan.

Al González.
Responder Con Cita
  #7  
Antiguo 05-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Al González
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
Responder Con Cita
  #8  
Antiguo 06-05-2005
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
Bueno, en este caso está claro

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.
__________________
David Esperalta
www.decsoftutils.com
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


La franja horaria es GMT +2. Ahora son las 13:55:19.


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