Newsgroup: it.comp.lang.delphi
Titolo: Creare form dinamicamente....problema in chiusura!

Stò diventando scemo ...e non capisco dove sbaglio....vi spiego come
funziona il mio programma...
- parte la form1 (principale)
- dalla form1 creo un'altra finestra (ciseiocifai) e fin qui tutto ok...
- dalla form2 creo una form (profilo) e in "profilo" ho messo un bottone.
Nell'evento click del bottone, vorrei chiudere la form "profilo" (che è
quella che lo ospita), ma la form non si chiude! (e non dà nessun errore!)
Dove sbaglio? Ho provato sia far creare automaticamente la form dalle
impostazioni che a non farla creare...stesso problema. Magari è una
scemata...
Vi ringrazio in anticipo!!!!!
Vi posto lo stralcio delle form:
*********************************************************
Questa è la form "ciseiocifai" quella che genera la form che non si
chiude...
*********************************************************
unit ciseiocifai;
interface
uses
.....,profilosemplice;
type
  TC6ocfai = class(TForm)
    btlogout: TBitBtn;
    cbstato: TComboBoxEx;
  private
    { Private declarations }
  public
    { Public declarations }
    Prof: Tprofilo;
  end;
var
  C6ocfai: TC6ocfai;
implementation
{$R *.dfm}
procedure TC6ocfai.FormShow(Sender: TObject); //in realtà queste 2
istruzioni le faccio nel click di un bottone....
prof:=TProfilo.Create(prof);
prof.Show();
end;
end.
*********************************************************
Questa è la form "profilo" quella che non si chiude...
*********************************************************
unit profilosemplice;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons, ImgList;
type
  TProfilo = class(TForm)
    btchiudiprofilo: TBitBtn;
    procedure btchiudiprofiloClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Profilo: TProfilo;
implementation
uses ciseiocifai;
{$R *.dfm}
procedure TProfilo.btchiudiprofiloClick(Sender: TObject);
begin
profilo.close;    //non chiude la form!!!!!!!!!!!!
end;
end.

 ha scritto nel messaggio
news:O8DZ9.97617$0v.28...@news1.tin.it...

Togli "profilo." dall'evento click!!!!!!!!!!!!!!
 procedure TProfilo.btchiudiprofiloClick(Sender: TObject);
 begin
     Close;    //così deve chiudere!!!!!!!!!!!
 end;
Ciao
Giorgio

Funziona!!!!!!!! Grazieeeeeeeeeeeeeeeeeeee
Un'altra domanda in tema.... quando si chiude la finestra, si libera pure
l'handle associato?
Mi spiego meglio...nella form io faccio
prof:=TProfilo.Create(prof);
e creo quindi la form associando l'handle a prof, quando chiudo la finestra
Profilo, prof è "liberato"??

 ha scritto nel messaggio
news:O8DZ9.97617$0v.28...@news1.tin.it...


"Michele"

Dimentica gli handle.
Quando crei una form (o un componente) tramite il costruttore della
classe il parametro che passi ha nome Owner non per nulla: e' il
responsabile della liberazione delle risorse dell'oggetto creato. Non
dovrest passare come owner un riferimento all'oggetto che viene creato,
ma un riferimento al creatore o alla form principale o alla applicazione
o nil. In tale ultimo caso devi assicurarti che le risorse siano
disallocate (ad esempio mettendo caFree come Action in OnClose).
Inoltre sembra che Prof sia non modale, quindi devi considerare cosa
accade quando, con Prof visibile, l'utente clicca ancora sul pulsante
che crea Prof. Normalmente si ha qualcosa tipo:
procedure TfrmSecondaria.btnMostraProf(Sender: TObject);
begin
  if Assigned(Prof) then begin
    if Prof.WindowState = wsMinimized then
      Prof.WindowState := wsNormal
  end
  else begin
    Prof := TfrmProf.Create(Self);
  end;
  Prof.Show;
end;
In tal caso devi trovare modo di azzerare il riferimento Prof quando la
form viene distrutta (ad esempio, postando un messaggio custom all'Owner
da TfrmProf.Destroy o dall'handler di OnDestroy).
Saluti
Paolo Arosio

 Profilo, prof è "liberato"??
Quando chiudi la finestra nell'evento OnClose imposta Action := caFree per
ottenere la distruzione dell'oggetto.
Ciao.
Gianluca.