Newsgroup: it.comp.lang.delphi
Titolo: Problema con le UNIT

Ho un problema con le Unit:
E' da poco che programmo in Delphi, vengo dal mondo sconcertante di VB.
Per una questione di organizzazione avevo suddiviso un mio programma di un
motore grafico 2D in vari Moduli. Ogni modulo aveva una certa quantita di
funzioni o procedure specifiche: per esempio nel modulo sprite avevo tutte
le funzioni/procedure per gestire gli sprite, modulo AI per L'intelligenza
Artificiale ecc. ecc.
Questa organizzazione mi permetteva di trovare subito una determinata
funzione e inoltre a mio avviso era piu bello da vedersi.
Sto facendo lo stesso programma in Delphi.
Ho creato diverse unit per raggiungere lo stesso scopo.
Questo pero mi da errore "Undeclared identifier" in una  procedura/funzione
che chiama un'altra funzione/procedura che pero' non risiede nella stessa
Unit.
Ho provato a dichiarare le Unit nella sezione "USES" ma mi da un'errore
"circular unit reference".
Come posso risolvere?

 ha scritto nel messaggio
news:3ca384a7$0$15598$626a...@news.free.fr...


 almeno credo sia così al 99%


 Ciao e grazie della risposta.
Non č proprio cosě.
Puoi tranquillamente fare riferimento tra le unit se specifichi la clausola
'uses' NON nella interface, ma nella implementation.
Questo perň funziona *solo* se nelle varie unit non definisci delle tue
classi che si referenziano l'una con l'altra.
Esempio.
---------------------------------------------------------------
Unit1
interface
type
TUno = class(...)
    qq :TDue;
end;
implementation
...
end.
---------------------------------------------------------------
Unit2
interface
type
TDue = class(...)
    uno    :TUno;
end;
implementation
...
end.
---------------------------------------------------------------
Questo non funziona.
Se NON definisci classi in questo modo (barbaro) basta, come ti ho detto,
inserire la Uses subito dopo la 'implementation'.
Esempio
Unit1
implementation
type
...
...
implementation
uses Unit2
...
...
end.
------------------------------------
La stessa cosa per Unit2.
Ciao.

Trovo questo un po strano.
Mi rivolgo a entrambi (a Carletto e' gia' stato detto
migliaia di volte ma pare non capire), quando rispondete
fatelo sotto il testo e non sopra e riportate solo lo
stretto necessario, non fa piacere leggere centinaia di
righe quotate senza scopo.
Per quanto riguarda il problema, cio' che dice Carletto non
e' vero: due unit possono benissimo "usarsi" a vicenda.
In realta', una unit che "usa" un'altra unit, ne "usa" solo
l'interfaccia.  Questo e' cio' di cui ha bisogno.
Ora, se nella Unit1 uso l'interfaccia della Unit2 e
nell'interfaccia della Unit2 uso l'interfaccia della Unit1,
va a finire che in Unit1 creo un loop.
Le uses devono essere nascoste alle diverse unit che si
usano a vicenda, per cui devono comparire nella sezione
"implementation".
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]


Questo l'ho fatto per la mia Unit1. il problema é che la Unit3 chiama delle
procedure che stanno nella Unit2 e viceversa.


Non mi funge. ecco come ho fatto, cosi magari mi dite dove sbaglio:
unit Looping;
interface
implementation
 uses
  Blitting, RTSGame;
Procedure.................
end.
----------------------------------------------------------------------
unit Blitting;
interface
implementation
uses
   Looping, RTSGame;
Procedure...........................
end.
--------------------------------------------------------
l'errore é questo:
[Error] Looping.pas(20): Undeclared identifier: 'RefreshMappaSelettivo'
la procedura "RefreshMappaSelettivo" sta nella Unit 'Blitting'
l'Unit RTSGame é la Unit principale.

Dimenticavo una cosa importante: Uso Delphi4.

 ha scritto nel messaggio
news:3ca59546...@news.tin.it...

Mi scuso innanzitutto con tutto il NG per le quotature sbagliate...
Mi dimentico sempre di quotare sotto, forse devo mettere un bibliettino
sopra allo skermo...
Scusate ancora...
Ciao
--
--------------------------------------------------
Carlo Camarda
chiamac...@tiscalinet.it
]@#[ Anna I Love You ]#@[


Per evitare la cicrular reference prova a creare una unit di appoggio
che contiene cio che deve essere usato dalle altre 2 unit.
Poi, metti questa unit nelle uses delle altre 2.
Bye
AS
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 l'Unit RTSGame é la Unit principale.
nella parte interface della unit Blitting ti manca la dichiarazione a
RefreshMappaSelettivo.
Tutto cio' che dichiari solo nella parte implementation e' visibile solo
dalla unit in cui e' scritto.
Se altre unit ne includono una che non ha alcunche' nella parte
implementation non possono sfruttarne le procedure.
Se hai bisogno di esempi pratici, ti rimando alle JCL (libreria di
funzioni in OP)
http://www.delphi-jedi.org/Jedi:CODELIBJCL:32878
in cui ci sono unit che esportano praticamente solo procedure e funzioni
(la VCL invece, con poche eccezioni, _esporta_ classi).
hth e
Saluti
Paolo Arosio

 implementation
E' difficile che il programma ti funzioni, se non scrivi
niente nelle interfacce delle unit.  
Come ti ho gia' detto, le unit vedono delle altre unit 
solo l'interfaccia, se non ci scrivi niente, le unit non 
vedono niente.  In ogni caso, ti rimando alla guida di
Object Pascal, inclusa nell'help di Delphi per la trattazione
di argomenti strettamente inerenti al linguaggio.



 Tutto Ok. Ora funziona. Non avevo capito che dovevo dichiarare
nell'interfaccia il nome delle procedure che dovevo far condividere.