Newsgroup: it.comp.lang.delphi
Titolo: Questione sulle unit nelle uses

Salve...
A discapito del subject criptico (...) la mia domanda e' semplice: e'
possibile sapere se tutte le unit dichiarate nella sezione uses sono
effettivamente necessarie?
Se ce ne sono di non necessarie, questo influisce sulla dimensione
dell'eseguibile?
Grazie in anticipo per ogni delucidazione...
Bye!
-- 
        <<* VeGeTa_CuBe *>>
 
http://members.xoom.it/vegeta3/

 dell'eseguibile?
direi di no, il linker di delphi provvede a togliere il codice delle
funzioni non utilizzate (da delphi 1).

 funzioni non utilizzate (da delphi 1).
Non è sempre detto:
Se includi delle Unit che hanno nelal clusola Initialization/Finalization
delle procudure, magari complesse, che servirebbero per l'inizializzazione e
l'uso di quella Unit, quel codice non può essere eliminato dal linker perchè
non lo può sapere...
Ciao
Matteo

 non lo può sapere...
mmmh... ho paura di non aver capito (sai... l'arteriosclerosi...)
mi potresti fare un esempio concreto ?

 ha scritto nel messaggio
news:VQIG9.19185$fa.6...@news1.tin.it...

vediamo: esempio semplificato
se nella mia parte initialization lancio una procedura che, ad esempio, crea
in memoria degli oggetti specifici di quella Unit, e poi nella finalization
questi oggetti vengono distrutti, basta che l'unit sia negli uses di uan
qualunque unit del progetto, automaticamente Delphi è costretto ad
incorporare anche la procedura lanciata nell'initialization.
Se poi la procedura usava dei componenti che nel resto del progetto non
vengono usati, Delphi è costretto ad incorporare anche il codice per quegli
oggetti.
Inoltre, se delel variabili globali della unit vengono creati nella
inizializatione e distrutti nella finalization, questi oggetti occupano
risorse che non servono al resto del programma.
Ho visto infatti molte volte che se piazzo dei componenti sulal form,
compilo e poi li tolgo completamente perchè ho cambiato idea, nella clusola
uses il riferimento alla Unit ci rimane.
E l'eseguibile ha una dimensione X
se elimino il riferimento, la dimensione cala.
vuoi un esempio?
crea un progetto vuoto
a me, con delphi 5, viene 286 KB (293.376 byte)
ci butti dentro una Tdatabase, una Ttable, un datasource e un TDBGrid
a me, con delphi 5, viene 666 KB (681.984 byte)
togli tutti i componenti dalla form, ci lasci le unit nell'uses (cioè non le
tocchi) e il programma cala a
523 KB (536.064 byte)
cvd
Ciao
Matteo

 incorporare anche la procedura lanciata nell'initialization.
Non ci avevo mai pensato. Sara' perche' tolgo sempre le unit non
utilizzate. Grazie per la spiegazione.
ciao
carlo

Grazie a entrambi, ora la situazione mi e' molto piu' chiara!


funzioni non utilizzate (da delphi 1).
Forte! ;-)
Gia' che siamo in tema di uses... che differenza c'e' tra dichiarare
una unit nella sezione uses dopo interfece o in quella dopo
implementation?


 Bye!
Andrea

come una unit usata dal modulo, almeno cosě mi sembra che era la storia.
Mhm... e dove lo vedi? Nella colonnina a sx del listato compaiono in
entrambe i casi...


 Bye!
Andrea

In pratica le uses nell'implementation sono "private".
Yep, ok, hai ragione, mi e' capitato di sperimentarlo proprio poco
prima di leggere il tuo messaggio ;-)



  ABLS Team (
www.abls.it
)

sempre scrivere il nome di quest'ultima.
Sei sicuro?
Io ho definito un TIniFile in una unit secondaria (che ha nelle uses
la relativa unit IniFiles), poi nella unit principale sotto
interface-uses ho messo la unit secondaria, e mi fa usare (senpre
nella unit principale) il TIniFile senza aver devinito la IniFiles ne'
in interface ne' in implementation...


Pero' la unit IniFiles l'ho dovuta richiamare anche nelle uses dopo
program... magari e' quello...


 ha scritto nel
messaggio news:s86nuuc6p2an99l9l...@4ax.com...


 implementation?
La uses interna e' stata introdotta per permettere riferimenti
circolari altrimenti impossibili con la uses nell'interface.
(modulo A usa modulo B, modulo B usa modulo A)
ciao
carlo

 in interface ne' in implementation...
Appunto... Hai definito una tua classe discendente da TIniFile (se ho capito
bene) e inserisci la unit che la contiene nella clausola 'uses' della tua
unit principale...quindi potrai usare quella classe.
Non hai definito IniFiles nella unit principale perchè non ti serve...ma se
tu dovessi utilizzare classi che si trovano nella unit IniFiles (ad esempio,
TMemIniFile) all'interno della unit principale, avere la tua unit secondaria
tra le 'uses' non ti servirà a nulla, anche se quest'ultima contiene nella
propria clausola 'uses' la IniFiles. Spero di non aver reso troppo contorta
la frase...
Ciao!


 Ciao!
Ciao
Andrea


Già...ma hai provato a rimuovere la uses di SysUtils presente nella
Unit1.pas?


Unit1.pas?
Nooo, non dovevi dirglielo ! hai rovinato la sorpresa, volevo che
rispondesse "eh ! e` vero, i tempi sono cambiati, un tempo funzionava
!"... ;-)

Ti assicuro che va.
[Error] Project1.dpr(8): Undeclared identifier: 'ExtractFileName'
[Error] Project1.dpr(8): Undeclared identifier: 'Application'
[Error] Project1.dpr(8): ')' expected but identifier 'ExeName' found

"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:rkbpuus96iip7pep2...@4ax.com...

ROTFL! :-D


 Unit1.pas?
Che c'entra?
Qui si discuteva sul RUOLO delle units dichiarate nella sezione interface ed
implementation.
E' ovvio che se togli SysUtils da unit1 non funziona + il giochetto,
semplicemente perché non hai
più un riferimento.
Ma fintanto che la unit resta, il gioco funziona - anche se è pericoloso
come modo di fare.
Andrea

Ti credi spiritoso?
E' ovvio che se non referenzi da qualche parte le cose che servono, non
andrà mai.
Ma questo non è quello che ho detto io.
Andrea

come modo di fare.
Non capisco che cosa vuoi dire, di quale *giochetto* stai parlando ?

andrà mai.  Ma questo non è quello che ho detto io.
Evita, per cortesia, di prendere gli altri per i fondelli.  
Hai detto:
"Quando tu metti una unit nella uses implementation, i suoi dati,
tipi, funzioni, ecc sono disponibili solo all'interno della sezione
implementation. Mentre se la metti nella sezione interface(
teoricamente ) è disponibile a tutti i moduli che usano la
unit in cui è inclusa."
Semplicemente, questo non e` vero, hai dato le istruzioni dicendo che
assicuravi che tutto funzionasse e invece non e` vero.
Se io scrivo un programma:
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;
begin
  // Insert user code here
end.
e inserisco una unit:
unit Unit1;
interface
implementation
end.
e nella parte "interface" di questa unit ci metto, in una uses,
un'altra unit:
unit Unit1;
interface
uses SysUtils;
implementation
end.
se includo la unit nel programma:
program Project1;
{$APPTYPE CONSOLE}
uses
  Unit1 in 'Unit1.pas';
begin
  // Insert user code here
end.
e provo a utilizzare una funzione della unit che DOVREI (secondo il
tuo ragionamento) vedere nel modulo che include la unit (Unit1) in cui
e` inclusa:
program Project1;
{$APPTYPE CONSOLE}
uses
  Unit1 in 'Unit1.pas';
begin
  WriteLn(StrToInt(3));
end.
Ottengo un bel:
[Error] Project1.dpr(7): Undeclared identifier: 'StrToInt'
Ribadisco: fai piu` attenzione alle cose che scrivi.
QUANTO AFFERMI NON E` VERO !