WM_USER
ansonsten noch eine Möglichkeit, die an COM angelehnt ist:
Du deklarierst ein Notification-Interface, z.B.
Delphi-Quelltext
1: 2: 3: 4:
| interface IDBNotificationItem ['{irgendeine GUID'] procedure ReceiveNotification(); end; |
So, daneben hat deine Klasse, welche irgendwelche Veränderungen auslöst, eine InterfaceList:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| TDBKlasse = class(...) private FDBKlasse: TDBKlasse; FIntfList: TInterfaceList; public procedure RegisterNotificationItem(const AItem: IDBNotificationItem); procedure UnregisterNotificationItem(const AItem: IDBNotificationItem); end; |
deine klassen, die benachrichtigt werden sollen, implementieren dann das Interface und registriert sich z.B. dann direkt an dem DB objekt..., z.B. so:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| TWillEineBenachrichtigung = class(TInterfacedObject, IDBNotificationItem) public constructor Create(ADBKlasse: TDBKlasse); destructor Destroy; override;
procedure ReceiveNotification(); end;
TWillEineBenachrichtigung.ReceiveNotification(); begin ShowMessage('HeyYa, da kam wohl was rein!'); end;
TWillEineBenachrichtigung.Create(ADBKlasse: TDBKlasse); begin inherited Create; if Assigend(ADBKlasse) then begin ADBKlasse.RegisterNotificationItem(Self as IDBNotificationItem); end; FDBKlasse := ADBKlasse; end;
TWillEineBenachrichtigung.Destroy; begin if Assigned(FDBKlasse) then begin FDBKlasse.UnregisterNotificationItem(Self as IDBNotificationItem); end; inherited; end; |
Damit erreichst du, dass im Gegensatz zu einem normalen Event beliebig viele Klassen, eben solche, die IDBNotificationItem implementieren, bei einem solchen Event benachrichtit werden können... du darfst halt nur nicht vergessen, in der DBKlasse durch deine Liste zu gehen und prüfen, ob IDBNotificationItem unterstützt wird und wenn ja, die Prozedur aufrufen.
Gruß
PS: was mir da einfällt. Damit du keine Probleme mit zirkulären bezügen hast, könntest du auch noch hergehen und der DBKlasse ein Interface verpassen, wie z.B. "IDBNotificationProvider", welche die prozeduren "Register.." und "Unregister..." zur verfügung stellt. dann deklarierst du einfach alle Interfaces in einer eigenen Unit und brauchst nur noch die in den einzelnen klassen einbinden. Dann würde sich dein Create der Klassen aber ändern... Wenn du den Weg einschlagen möchtest und mehr infos willst, bin ich gern bereit, ne kleine Demoanwendung zu schreiben.
PPS: wenn du nicht beliebig viele andere instanzen von irgendwelchen klassen informieren möchtest sondern nur eine, dann kannst du das am allereinfachsten über Events machen -> schau einfach mal TNotifiyEvent an oder wie das heißt. z.B. ist das OnClick ja auch nichts anderes.