![]() |
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.
|
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.
|
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:
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:
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: 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. |
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.
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. :) |
¿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... |
¡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:
Cita:
Cita:
¡Un abrazo a todos! Y por favor ya no les llamen "librerías" a las bibliotecas, en buen plan. Al González. :) |
Cita:
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 |
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. |
La franja horaria es GMT +2. Ahora son las 22:07:42. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi