HI,
das was du hier verwenden solltest ist bekannt als das Observer-Pattern.
An sich ist die Idee sehr einfach, du möchtest mehr als eine Komponente konsistent über einen Zustand informieren (das Problem samt Lösung ist im Prinzip schon von dir beschrieben).
Bei dem Pattern gibt es zwei verschiedene Typen, einen Observable und beliebig viele Observer. Das Observable Objekt bietet dabei eine Möglichkeit, dass sich Observer bei ihm für ein Ereignis registrieren/deregistrieren.
Für die Implementierung gibt es verschiedene Möglichkeiten, ich persönlich würde dir zu der
OOP Lösung raten. Diese setzt einfach die Mittel der
OOP ein, so kannst du entweder ein Interface erstellen oder eine abstrakte Basisklasse verwenden, die eine Methode enthält, die aufgerufen werden soll, sobald das Ereignis eintritt.
Jeder Observer muss das Interface implementieren bzw. von der Basisklasse erben. Beim Registrieren oder Deregistrieren wird einfach die Instanz die sich registriert an das Observable übergeben, das dieses speichert (z.B. in einer Liste).
Beim Auftreten des Events wird über die Liste iteriert und bei jeder gespeicherten Instanz die entsprechende Methode aufgerufen. Das Argument der Methode benachrichtigt dabei über den neuen Zustand.
[Add]
Ups, zu früh weggeschickt.
Hier noch ein kurzes Beispiel:
Delphi-Quellcode:
TAbstractObserver = class(TObject)
public
procedure onValidate(const s : String;); virtual; abstract;
end;
TObserverA = class(TAbstractObserver)
private
....
protected
....
public
procedure onValidate(const s : String); override;
....
end;
TObserverB = class(TAbstractObserver)
private
....
protected
....
public
procedure onValidate(const s : String); override;
....
end;
TObservable = class(TObject)
private
FObserver : TObjectList;
protected
procedure notifyValidation(const s : String);
public
procedure addObserver(const Observer : TAbstractObserver); // ist klar, einfach in die Liste eintragen
procedure removeObserver(const Observer : TAbstractObserver); // bzw. entfernen
end;
...
procedure TObservable.notifyValidation(const s : String);
var i : Integer;
begin
if self.FObserver.Count > 0 then
begin
for i := 0 to self.FObserver.Count - 1 do
begin
// benachrichtigt alle registrierten Observer über das Ereignis
TAbstractObserver(self.FObserver[i]).onValidate(s);
end;
end;
end;
Gruß Der Unwissende
[/Add]