Newsgroup: it.comp.lang.delphi
Titolo: [nuovo componente]

sto tentando di costruire un nuovo componente fatto da un edit + un button
(non spiego cosa serva, ma non è rilevante)
faccio questo:
- derivo da Tedit
- aggiungo alla classe un campo TButton
- sovrascrivo il metodo createwnd,
  ...inherithed
  if ( Parent <> nil ) and ( Btn = nil ) then
    begin
    Btn := TButton.Create( nil );
    Btn.Visible := True;
    end;
   if ( Parent <> nil ) and ( Btn <> nil ) and ( Btn.Parent = nil ) then
    begin
    Btn.Parent := Self.parent;
    Btn.SetBounds( left, top + height, 20, 20 );
    end;
    ....
(ho provato a crealro passando come owner la form, l'edit o nil e come 
parent ho provato ad assengare sia la form che self)
- sovrascrivo il destroy:
    destructor tprovaedit.destroy;
    begin
    if assigned( btn ) then
      begin
      BTn.Parent := nil;
      owner.RemoveComponent( BTn );
    //  Btn.Free;
      end;
    inherited;
    end;
Ci sono due cosette che non mi tornano:
- design time, se metto come parent la form vedo il bottone, ma lo vedo 
anche come componente nella finestra "Edit  tab order"; mentre se metto 
parent = self non vedo il bottone in nessun posto: come faccio per vederlo 
disegnato sulla form ma non averlo nell'edit tab order?
- run time, con l'istruzione "btn.free" nel destroy, al momento della 
distruzione della form ho un'eccezione, mentre con la stessa istruzione 
commentata va tutto bene. E' giusto commentarla o così mi resta della 
memoria occupata?
Dove sbaglio?
-- 
Ing. Gianni Franceschet
g.fran...@logiconsulting.it
in...@logiconsulting.it
LogiConsulting s.r.l.
via Arrivabene 2,
ATTENZIONE: questo documento è indirizzato esclusivamente al destinatario !
A chi lo riceve è imposto il rispetto di quanto previsto dal D.Lgs. 196/2003
in materia di Privacy.
Chi ricevesse per errore questo documento è pregato di contattere il
mittente ed eliminare il doumento stesso con tutto il suo contenuto. Grazie.
46100 Mantova - Italy
Tel. 
+39 0376329943
Fax 
+39 0376221237

 sto tentando di costruire un nuovo componente fatto da un edit + un button
Sei sicuro che non basti un frame ?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 memoria occupata?
Nel .Create come parametro mettici (Self) cosi' l'Owner e' il TEdit e sara' 
lui a preoccuparsi di distruggere il pulsante.
Cmq dall'eccezione si deduce che il pulsante era gia' stato distrutto.
Ciao Giorgio


Potrebbe, ma correggimi se sbaglio:  io vogli controllare alcuni 
comportamenti della coppia, quindi intercettare messaggi come 
WM_LBUTTONDOWN..., inoltre non voglio pubblicare alcuni eventi come il click 
del bottone (lo gestisfco io in altro modo). Con i frame si arriva ad avere 
un controllo simile? 


In effetti...Quindi, così facendo, sono sicuro che la memoria viene 
correttamente liberata? In pratica, nel destroy dell'edit non devo fare 
nulla, nemmeno il
owner.RemoveComponent( BTn );
dove l'owner è quello dell'edit, quindi la form... giusto? La form distrugge 
l'edit, l'edit distrugge il button e io non faccio nulla...


E' esattamente cosi', per definizione di Owner in Delphi: purtroppo quando 
viene distrutto un componente dal
suo owner il puntatore non viene impostato a nil, cosi un *.free puo' dare 
un'eccezione d'errore.
ciao Giorgio 

 WM_LBUTTONDOWN...
Non c'č problema, puoi subclassare la Window Proc di ciascuno dei
controlli.
