Bonjour a tous,
je suis en train de refondre un projet en essayant de le restructurer un peu, et au passage appliquait le fabuleux pattern observer.... mais voila, je m'oppose à un problème incompréhensible: mes interfaces ne semblent pas être reconnues, et je me confronte à des pointer exceptions.
Voici globalement mon observateur (en code simplifié pour faciliter la lecture)
[si jamais qqun souhaite le vrai code pour tenter de résoudre le problème, pas de soucis, je le mettrais]
Bon, globalement, j'ai des types d'événements et des observers par type d'événement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class Oservateur { function add ( interface IObjetObservable){ observerList.add (IObjetObservable) } function notify (eventType typeEvenement; event CeQuiCestPasse){ for i:=0 to observerList.count-1 do begin if IObjetObservable (observerList.items[I]).observe (typeEvenement) then IObjetObservable (observerList.items[I]).perform (CeQuiCestPasse); enf end } }
Lorsqu'un événement est déclenché, tous les observeurs sont appelés avec en paramètre ce qui c'est passé.
Pour les observateur, je les fais implémenter l'interface IObjetObservateur.
Tout ce passe bien quand mon objet observateur est déclaré de la sorte:
Mais tout ce passe moins bien lorsque je décide qu'un TForm par exemple puisse observer:
Code : Sélectionner tout - Visualiser dans une fenêtre à part class Objet = class (TInterfacedObject, IObjetObservateur)
Dans le dernier cas, il semble que les méthodes d'implémentation de FormX ne soient jamais appelés......
Code : Sélectionner tout - Visualiser dans une fenêtre à part class FormX = class (TForm, IObjetObservateur)
Dans le deboggeur, la ligne est "traversée", mais pas exécutée DANS l'observateur.
Bon, maintenant, le problème sous un autre angle:
Mon besoin est le suivant:
Je veux déclarer une interface qui soit implémentable par tous mes objets (quels qu'ils soient TForm, tout neuf, TCombo, ..., ...).
Une fonction capable de conserver une liste d'objets implémentant cette interface.
[prototype: procedure add (objetI : INomInterface)]
La possibilité de parcourir ces objets et de les manipuler via cette interface.....
[liste.items[X].appelFonctionDeLInterface (avec des paramètres);]
Merci de votre aide, je ne vois plus comment faire.
[je vois très bien en java, en python, en php, ..... mais en delphi...... j'arrive pas]
Partager