2009-04-02 6 views
12

J'ai un formulaire que j'utilise pour afficher des informations pendant quelques secondes. Est-il acceptable que le formulaire se libère? Puis-je démarrer une minuterie dans le constructeur, puis appeler self.free dans l'événement timer? Ou cela va-t-il entraîner des problèmes?Delphi: Est-il acceptable pour un formulaire de se libérer?

Répondre

29

En outre, avec un formulaire, vous pouvez appeler la libération.

Il envoie un message CM_RELEASE au formulaire. En réaction, il appelle Free. L'avantage de la version est qu'il n'y a plus de messages pour le formulaire, ce qui pourrait provoquer un plantage.

+0

+1, Ceci est, à mon humble avis, la seule façon propre à faire dans ce cas – Fred

+0

Je pense que je vais aller pour celui-ci, en combinaison avec la définition du propriétaire comme une assurance supplémentaire. – Vegar

1

J'ai toute une suite d'objets qui se libèrent, et j'ai effectué divers tests sur eux sans problèmes/fuites. Un TForm peut être plus complexe, mais tant que Self.Free() est le dernier appel effectué, vous devriez être en sécurité.

(Pour ceux qui se demandent pourquoi diable j'ai un objet qui se libère, je le passe beaucoup autour du système, donc je le mets en œuvre par son propre système de comptage de référence, quand l'objet se libère).

+0

Mais Self.Free ne sera presque jamais * le dernier appel d'un formulaire car un formulaire exécute presque toujours du code en réaction à une action de l'utilisateur. Utilisez Release à la place. –

+0

Pourquoi ne pas simplement utiliser Interfaces pour le comptage de références? –

16

Vous pouvez faire le formulaire pour se libérer quand il est fermé par l'utilisateur ou à partir du code:

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; 

Assurez-vous que vous fournissez un propriétaire dans le constructeur Incase les arrêts d'application et la forme n'est pas détruite à le temps. Le propriétaire va libérer le formulaire avant de se libérer.

+0

Plus j'y pense, plus j'aime l'idée TCloseAction. Peut-être que je devrais utiliser cela au lieu de la publication ... – Vegar

+1

si seulement les formulaires avaient des propriétés DefaultCloseAction, alors pone pourrait les libérer automatiquement sans assigner de gestionnaires d'événements. –

0

C'est exactement ce qui est fait avec Interfaces.

+1

Oui, mais vous devez vous rappeler que TComponent de Delphi écrase le comptage de références de l'interface, ce qui provoque souvent de la confusion. –

+0

En utilisant les interfaces, le formulaire serait libéré lorsqu'il sortirait du scoop. Je ne veux pas ça. Je veux qu'il vive aussi longtemps qu'il le veut, sans aucune référence, et qu'il se libère quand c'est fini. – Vegar

+0

Fabio: Je suis sûr que vous pourriez passer outre. Vegar: Les interfaces sont comptées par référence, pas par la portée. – Arafangion

Questions connexes