2009-04-02 16 views
12

Ho un modulo che uso per mostrare alcune informazioni per alcuni secondi. Va bene che il modulo si liberi da solo? Posso avviare un timer nel costruttore e quindi chiamare self.free nell'evento timer? O questo potrebbe portare a problemi?Delphi: Va bene per un modulo liberarlo da solo?

risposta

29

Inoltre, con un modulo è possibile chiamare il rilascio.

Invia un messaggio CM_RELEASE al modulo. Come reazione chiama gratis. Il vantaggio della versione è che non ci sono messaggi per il modulo che potrebbero causare un arresto anomalo.

+0

+1, Questo è, IMHO, l'unico modo pulito per fare in quel caso – Fred

+0

Penso che andrò per questo, in combinazione con l'impostazione del proprietario come un'assicurazione supplementare. – Vegar

1

Ho un'intera suite di oggetti che si liberano e ho eseguito vari test senza problemi/perdite mostrate. Un TForm potrebbe essere più complesso, ma finché Self.Free() è l'ultima chiamata effettuata, dovresti essere al sicuro.

(Per coloro che si domandano perché sulla terra ho oggetti che si liberano da soli, li passo intorno al sistema molto, quindi li ho implementati tramite il proprio schema di conteggio dei riferimenti. Quando viene rilasciato l'ultimo riferimento, l'oggetto si libera da sé).

+0

Ma Self.Free dovrebbe quasi * mai * essere l'ultima chiamata effettuata da un modulo perché un modulo esegue quasi sempre il codice in risposta a un'azione dell'utente. Usa invece Release. –

+0

Perché non usare solo le interfacce per il conteggio dei riferimenti? –

16

È possibile effettuare il modulo di liberarsi quando viene chiusa dall'utente o dal codice:

procedure TForm27.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 
end; 

procedure TForm27.FormCreate(Sender: TObject); 
begin 
    Timer1.Enabled := True; 
end; 

procedure TForm27.Timer1Timer(Sender: TObject); 
begin 
    Timer1.Enabled := False; 
    Close; 
end; 

Assicurarsi di fornire un proprietario nel costruttore in caso gli arresti di applicazione e il modulo non viene distrutta a il tempo. Il proprietario libererà il modulo prima di liberarsi.

+0

Più ci penso, più mi piace l'idea TCloseAction. Forse dovrei usare quella invece della versione ... – Vegar

+1

se solo le form avessero proprietà DefaultCloseAction, quindi pone potrebbe auto-liberarle senza assegnare gestori di eventi. –

0

Questo è esattamente ciò che viene fatto con le interfacce.

+1

Sì, ma è necessario ricordare che TComponent di Delphi sovrascrive il conteggio dei riferimenti dell'interfaccia, che spesso causa confusione. –

+0

Utilizzando le interfacce, il modulo verrebbe liberato quando esce dallo scoop. Non lo voglio Voglio che vivi tutto il tempo che vuole senza alcun riferimento ad esso, e quindi liberare se stesso quando è fatto mostrando se stesso. – Vegar

+0

Fabio: Sono sicuro che potresti scavalcarlo. Vegar: le interfacce sono conteggiate con riferimento, non con gestione dell'ambito. – Arafangion