PDA

Ver la Versión Completa : Presentación y duda.


J.Slann
01-03-2011, 17:40:32
Buenas, soy J.Slann y me presento en estos foros, por lo que veo sois una gran comunidad de delphi.

Estoy realizando un pequeño proyecto en delphi y tengo algunos problemas.

Antes de nada decir que también soy nuevo programando con delphi aunque ya habia programado antes en pascal. Uso Delphi 7.

Mi problema es el siguiente:

Digamos que tengo varias unit.

Unit1: es donde tengo el programa principal, necesita Unit2 y Unit3.
Unit2: otra unit que utiliza la unit3.
Unit3.

Lo que quiero es definir un tipo de variable en Unit1 de manera que Unit2 la pueda utilizar. Problema: en uses de Unit2 no puedo poner Unit1 porque entonces obtengo el error circular (por poner en uses de cada Unit la otra unit). En definitiva he solucionado el problema temporalmente definiendo el tipo que quiero usar en Unit3, pero necesito que este en Unit1, ¿Como consigo que la Unit2 me reconozca el type creado en Unit1?

Espero que me podais ayudar aunque no me he explicado muy bien. Gracias.

Un SAludo.

Chris
01-03-2011, 17:49:27
Hola J. Slan! Bienvenido al Club!

Con respecto a tu pregunta, en Unit2 no puedes trasladar a la sección de implementación el uso de Unit1?

J.Slann
01-03-2011, 18:05:59
Que rapidez!

Te refieres a en Unit2 poner:

implementation
uses Unit1;
---------------------------------------------

Lo he probado, y sigue sin reconocerme el tipo de variable que quiero usar.

Y con esto me surge una otra duda, entiendo para que vale uses, ¿pero para que vale implementation??

Lepe
01-03-2011, 19:56:12
La unidad se divide en dos partes "interface" que es pública, es decir cualquier unidad puede hacer uso de las constantes, tipos de datos, funciones y variables definidos en la parte de interfaz.

Todo lo que haya bajo la palabra implementation, es "privado a las funciones internas de la unidad", por tanto no pueden verse desde el exterior de esa unidad.

Para el problema que tienes, suele hacerse lo que te han comentado, o incluso mejor, crearte una cuarta unidad donde sólo tengas todo lo que ha de ser público (yo, como original que soy, suelo crearme la unidad publica.pas en todos mis programas ;)). Todas las unidades hacen uso de publica.pas, pero publica.pas no hace uso de ninguna unidad del proyecto.

Edito: Ya puestos a ser quisquillosos, el hecho de que tengas referencias circulares, o que ciertas unidades necesiten de otras, significa que tu diseño de la aplicación se podría/debería mejorar ;).

Saludos

J.Slann
02-03-2011, 16:12:42
Gracias.

En realidad las referencias circulares no me aparecen si no añado esto ultimo que comento. Es un proyecto que estoy retomando y ya estaba diseñado así. No da problemas pero no consigo hacerlo funcionar como quiero.

Mi idea es tener en la Unit principal un array de un tipo concreto (que me he creado yo) y llamar a la unit datos.pas que sirve para guardar y cargar los datos, bien, quiero que datos.pas me guarde los datos en el vector declarado en la unit1 y no lo consigo, porque la unit principal necesita usar datos.pas pero guardando el contenido en el vector creado en la unit principal. PROBLEMA: datos.pas no me reconoce el tipo de dato creado en la unit principal.

Lepe
02-03-2011, 18:38:39
Yo definiría ese tipo de datos en "datos.pas" es más lógico ya que esa misma unidad es la que que tiene rutinas para manipular dicho tipo de datos.

En principal harás un:


unit principal;

interface

uses datos;


Y nuestro datos:

unit datos;

interface

type TDato = array [0..243] of string;

procedure Ordena(var elArray:TDato);

J.Slann
02-03-2011, 18:54:20
Gracias por la ayuda.

Entiendo lo que me quieres decir. Yo antes lo tenia puesto así:

Unitprincipal: vector_datos
datos.pas: los procedimientos de cargar datos
Unit3: tenia declarado el tipo_vector_datos

Asi funcionaba, pero el problema venia a que me exigian que vector_datos y la declaracion Tipo_vector_datos estuvieran en la unitprincipal. Pero ahora entiendo que realmente vector_datos estaría mucho mejor en datos.pas porque aparte de no tener problemas, me evitaria pasar como parametro vector_datos en los procedimientos de datos.pas.

Asique no voy a seguir perdiendo más tiempo intentando realizar referencias circulares. Un saludo y gracias, me ha servido tu ayuda.