Newsgroup: it.comp.lang.delphi
Titolo: Chiarimenti su 'Vita e visibilità delle variabili'

Uso D5 Prof.
Scusate il post, ma vrei bisogno di fare un po di chiarezza.
Ho un form che mi richiama un altro form
unit Unit1;
....
   Form2:=TForm2.Create(Application);
   try
      Form2.ShowModal;
   finally
      FreeAndNil(form2);
   end;
.....
nella seconda form
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;
type
  TForm2 = class(TForm)
    BitBtn1: TBitBtn;
    Label1: TLabel;
    BitBtn2: TBitBtn;
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  Attiva: string;
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
//  Attiva: string;
implementation
{$R *.DFM}
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
   form2.Close;
end;
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
    if Attiva='Vero' then begin
       attiva:='Falso';
       end
    else begin
       attiva:='Vero';
    end;
    Label1.Caption:=Attiva;
end;
procedure TForm2.FormActivate(Sender: TObject);
begin
    Label1.Caption:=Attiva;
end;
************
il quesito
************
Se la variabile 'Attiva' è dichiarata nelle { Private declarations }, come
sopra,  quando chiudo e riapro la Form2, la viaribile è vuota.
Se la variabile 'Attiva' è dichiarata nelle Var prima dell'implementation,
quando chiudo e riapro la Form2, la viaribile ha mantenuto lo stesso valore
che aveva prima della chiusura della form2.
Mi potreste chiarire il perchè ?
Anche i conceti generali sulla 'Vita e Visibilità delle varibili' sarebbero
graditi.
Grazie in aticipo
--
Gianluigi Genasi
--------------------------
Minisystem Srl
Server di posta Kpnqwest - 
www.kpnqwest.it

 Mi potreste chiarire il perchè ?
Il motivo è semplice.
La variabile viene "allocata" in fase di creazione della Form2 all'interno
della procedura che ho lasciato nel post. Prima di quella creazione, la
variabile non esiste. Quando si arriva al punto delal freccia, la variabile
viene deallocata e la memoria rilasciata per altri usi.
Inoltre, se venissero create contemporaneamente 3 form (f1, f2 e f3)
esisterebbero 3 variabili con nome identico (Attiva) ma che possono avere 3
valori diversi in quando sono variabili di 3 istanze della stessa classe
(F1.Attiva F2.Attiva F3.attiva); quindi 3 variabili che in memoria sono in
posizioni diverse.
Quando la classe viene distrutta, il valore viene perso.
L'esempio della Implementation, invece, la variabile viene creata una sola
volta, in fase di start-up dell'applicazione e viene distrutta in fase di
distruzione. Per questo non perde il valore. Semplicemente perchè non viene
mai distrutta e ricreata. E, ovviamente, può avere solo un valore alla volta
(al contrario dell esempio che ho citato prima);
Ciao
Matteo


Grazie ancora

 che aveva prima della chiusura della form2.
Certamente. La variabile messa in quel punto appartiene alle variabili 
locali private del modulo (non di un oggetto) e quindi finchè il 
programma è in esecuzione quella variabile esiste.
Se è prima dell'implementation è visibile anche agli altri moduli (e 
quindi a tutti gli oggetti che "usano" il modulo attraverso la clausola 
uses.
Se è dopo implementation, è visibile solo al modulo in cui è contenuta 
(ed ai componenti in esso definiti).
Ciao.
Mimmo.

 declarations }, Giusto ??
Sì. Se sono dati che servono per il tempo di vita della form, meglio
metterli all'interno della classe in modo tale che siano sicuramente
utilizzabili  quando la classe viene istanziata e giustamente rilasciati
quando non servono più.
Ciao
Matteo
PS Quota meglio altrimenti ti linciano!

graditi.
La vita di una variabile e' tutto il tempo in cui il
contenuto di quella variabile e' utilizzabile in modo
sicuro.  La visibilita' di una variabile e' la zona del
codice sorgente in cui quella variabile e' utilizzabile.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]


Hai ragione, nel fare delle prove ho lasciato
Form2:=TForm2.Create(Application);
invece di
Form2:=TForm2.Create(Self);
Cosě č corretto ??
Grazie ancora.

Cosě č corretto ??
No. Se usi il FreeAndNil() o il metodo Free(), vuol dire che
ti assumi la responsabilita' di deallocare la memoria e
quindi devi usare nil come owner.
Form2 := TForm2.Create(nil);
