Newsgroup: it.comp.lang.delphi
Titolo: Chi mi dice il perchè??????

Ho il seguente codice che non fa altro che al click su di un Tbutton del
form1 crea un immagine di tipo timage e gli assegna una bitmap letta da
disco,
crea 2 form (form1 e form2) che cosě facendo sono entrambi attivi e si
autodistruggono alla chiusura, quando entrambi i form sono chiusi anche la
bitmap
dovrebbe essere distrutta ma ciň non accade perchč la memoria rimane
allocata.
Vedi il commento sotto per l'istruzione incriminata
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    tmpbmp: timage;
  end;
var
  Form1: TForm1;
implementation
uses Unit2, Unit3;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//tmpbmp:=tbitmap.Create;
//tmpbmp.LoadFromFile('c:\temp\chiappe.BMP');
tmpbmp:=timage.create(nil);
tmpbmp.picture.bitmap.LoadFromFile('c:\temp\chiappe.BMP');
form2:=tform2.create(nil);
form3:=tform3.Create(nil);
form2.Image1.Picture.Bitmap.Assign(tmpbmp.picture.bitmap);
form3.Image1.Picture.Bitmap.Assign(tmpbmp.picture.bitmap);
form1.Enabled:=false;
form2.show;
form3.Show;
//tmpbmp:=nil;
//tmpbmp.Free;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
if (form2=nil) and (form3=nil) and (tmpbmp<>nil)
  then
    begin
      tmpbmp.Free;   ////NON VIENE DEALLOCATA LA MEMORIA
    end;
end;
end.
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, unit1, StdCtrls;
type
  TForm2 = class(TForm)
    Image1: TImage;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
uses Unit3;
{$R *.dfm}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form2:=nil;
form2.Free;
if form3=nil
  then
    form1.Enabled:=true;
end;
end.
unit Unit3;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TForm3 = class(TForm)
    Image1: TImage;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form3: TForm3;
implementation
uses Unit2, Unit1;
{$R *.dfm}
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form3:=nil;
form3.Free;
if form2=nil
  then
    form1.Enabled:=true;
end;
end.

Giò ha scritto:
<CUT>
Non ho letto e valutato con molta attenzione il tuo codice, ma 
secondo me stai facendo molta confusione, soprattutto
per quanto riguarda la creazione e la distruzione delle form.
P.E., lascia che sia Delphi a preocupparsi della distruzione
delle form ponendo:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;
Semplifica anche tutta la gestione delle finestre (non e' buona norma 
"incrociare" l'apertura e la chiusura di piu' form l'una con l'altra).
Inoltre, dai un occhio all'oggetto TPicture di tmpbmp.
Ciao. 
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

form2.Free;
Una piccola nota a margine: questo è sbagliato.
Come fai a mettere a nil una classe e poi chiamare il free?
Casomai si fa il contraio oppure si chiama un FreeAndNil
Ciao.
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"