Bonjour à tous.
Voici mon problème :
Je construis un composant qui utilise entre autre un TCollection. Appelons-la "TMyCollection".
La Collection doit avoir au moins 1 TCollectionItem.
Si le composant est créé dynamiquement, pas de problèmes, il suffit dans TMyCollection.Delete d'empêcher le Delete si TMyCollection.Count = 1.
Mais en utilisant l'inspecteur d'objets, cela ne marche pas : l'éditeur de collection ne fait pas appel à la procedure Delete.
La seule solution que j'ai trouvée est d'employer la procedure NOTIFY de TCollection.
procedure TMyCollection.Notify(Item: TCollectionItem; Action: TCollectionNotification);
begin
// FOwner est le composant possédant la collection
if not(csDestroying in FOwner.ComponentState) then
if Action = cnExtracting then // action = cnDeleting ne marche pas
if Count <= 1 then raise exception.create('Il faut au moins un item');
end;
Tout marche correctement dans l'inspecteur d'objets et au run du projet.
Mais c'est en quittant Delphi que j'ai les messages d'erreur :
- violation d'accès à l'adresse 00000000. Lecture de l'adresse 00000000.
- puis : Delphi32 erreur d'apllication : ... la mémoire ne peut être read.
Je me casse la tête depuis des heures, sans trouver l'origine du problème.
J'ai essayé d'ajouter un "inherited" dans la procedure, sans succès.
Enlever le " if not(csDestroying)..." : ne résoud rien. De plus, c'est nécessaire pour ne pas déclencher d'exception au destroy de la collection.
Voyez-vous où se situe le problème ?
Ou avez-vous une autre solution pour contrôler la Collection dans l'inspecteur d'objets ?
Merci d'avance.
Thierry