Newsgroup: it.comp.lang.delphi
Titolo: Come fare il FREE di un componente dall'evento generato dallo stesso?







Come fare il FREE di un componente dall'evento 
generato dallo stesso
?


Ad esempio una cosa del genere ovviamente genera un 
errore.


procedure TForm1.Button1Click(Sender: 
TObject);
begin
  Button1.Free;
end;


Qualcuno sa come evitarlo??


Grazie anticipate


Ciao Emanuele



Domanda: xche? :-//

 end;
E' meglio ripensare la logica della tua form perche' situazioni come queste
sono assolutamente da evitare.
Comincia a dirci che cosa deve fare precisamente.
ciao
-- 
Morde. 
ICLDweb: 
http://www2.samatel.com/icld/
Microsoft vuole uccidere Messenger Plus!
http://www.msgplus.net/petition.php

 scopo di cancellare se stesso e la relativa riga.
invece di lanciare la free dello stesso, imposta l'attributo visible a
false e la proprieta' tag a 555, poi dall'esterno cancelli quegli oggetti
che sono taggati a 555.
Ciao


 Come fare il FREE di un componente dall'evento generato dallo stesso?
L'unico modo che hai per ottenere un simile effetto è posticipare la 
distruzione dell'oggetto che genera l'evento al momento in cui 
sicuramente l'evento ha concluso la sua esecuzione.
Potresti, ad esempio, utilizzare un messaggio personalizzato per la tua 
applicazione da inviare al contenitore del controllo: quando premi il 
pulsante di eliminazione, invii alla coda dell'applicazione il tuo 
messaggio personalizzato passando come parametro (in LParam o WParam) 
l'indirizzo dell'oggetto da distruggere o, comunque, i dati che ritieni 
siano necessari per identificare quell'elemento.
Nel controllo contenitore o nel form inserisci un metodo seguito dalla 
direttiva *message* (vedi la Guida in linea) che intercetti tale 
messaggio, estragga il parametro relativo all'oggetto da distruggere e, 
dopo aver eseguito gli opportuni "cast", chiami il metodo /Free/.
Ciao,
   Marco.
-- 
Marco «Alka» Breveglieri	
http://www.marco.breveglieri.name
  «bvmcnxsjlkhròhyeq, potrei scrivere a questo punto,
   se mi addormentassi sui tasti» (Daniele Luttazzi)

 ha scritto nel 
  messaggio 
news:6dvVe.45901$O6.25...@news3.tin.it
...


 mediante il metodo Form1.Release.
...oppure ancora, prendere spunto proprio dall'implementazione del 
metodo /Release/ di *TForm* per realizzare la propria versione del 
meccanismo, adatto al caso in esame.
P.S.:
attenti che state postando in HTML... ;-)






Questo è il codice che ho sviluppato seguento il 
consiglio di Marco e degli altri.


 


Qualsiasi consiglio è ben accetto.


 


Ciao Emanuele.


 


L'applicazione seguente è costituita da una Form 
con un Button che crea nell'evento OnClick un altro Button in Run-Time (fino a 
max 10).


Nell' Evento OnClick del Button creato associo la 
procedura EliminaButton che provvede ad eliminarlo.


 


unit Unit1;


 


interface


 


uses
  Windows, Messages, SysUtils, 
Variants, Classes, Graphics, Controls, Forms,
  Dialogs, 
StdCtrls;


 


type
  TForm1 = 
class(TForm)
    Button1: TButton;
    
procedure Button1Click(Sender: TObject);
  private
    
{ Private declarations }
    procedure EliminaButton(Sender: 
TObject);
    procedure CMReleaseButton(var Message: 
TMessage); message CM_RELEASE;
  public
    { Public 
declarations }
  end;


 


const
  nB:integer=0;
var
  
Form1: TForm1;
  b: array [1..10] of TButton;


 


implementation


 


{$R *.dfm}


 


procedure TForm1.CMReleaseButton(var Message: 
TMessage);
begin
  
Components[Message.WParam].Free;
end;


 


procedure TForm1.EliminaButton(Sender: 
TObject);
begin
  PostMessage(Handle, CM_RELEASE, (Sender as 
TComponent).ComponentIndex, 0);
end;


 


procedure TForm1.Button1Click(Sender: 
TObject);
begin
  if nB<10
    
then
      
begin
        
inc(nB);
        
b[nB]:=TButton.Create(Form1);
        
b[nB].Parent:=Form1;
        
b[nB].Name:='ProvaButton'+IntToStr(nB);
        
b[nB].Height:=18;
        
b[nB].Top:=(nB-1)*20;
        
b[nB].OnClick:=EliminaButton;
      
end;
end;


 


end.