ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 2013
-
30 janv. 2007 à 16:30
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 2013
-
30 janv. 2007 à 20:08
Bonjour à tous.
Dans un composant, j'ai une méthode interne 'ReInit'
procedure TMonCompo.Reinit;
begin
if Assigned(FOnReInit) then FOnReInit(self) //événement OnReInit
else FaireParDefaut;
end;
J'ai plusieurs propriétés publiées avec Setters dans lesquels il y a appel à la procedure ReInit.
Le problème est que, lors de la création du compo à l'exécution, les Setters sont appelés avant l'assignation de l'événement, donc le code dans cet événement n'est pas exécuté.
J'ai alors placé la propriété OnReInit avant toutes les autres et enlevé les valeurs par défaut des propriétés pour que leur Setter soit toujours appelé.
Cela marche, mais manque évidemment d'élégance.
J'ai alors surchargé la procedure Loaded de la façon suivante :
procedure TMonCompo.Loaded;
begin
if Assigned(FOnReInit) then FOnReInit(self);
end;
Tout marche, mais est-ce la meilleure solution ?
Quand la procedure Loaded est-elle exactement appelée (chronologiquement) dans la construction d'un composant ?
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 30 janv. 2007 à 19:23
Salut !
La procédure Loaded() est appelée lorsque le composant a fini de lire ses propriétés dans le flux (dfm). Elle est appelée une fois qe TOUS les composants d'une même fiche sont crées (voir TCustomform.Create() unité Forms, InitInheritedComponent() et NotifyGlobalLoading() unité Classes)
Par contre, je remplacerai "if Assigned(FOnReInit) then FOnReInit(self)" par un appel à Reinit, qui fait la même chose.
Et n'oublie pas "inherited" dans Loaded(): très important puisqu'il enlève l'état de chargement du composant !