Autor Beitrag
JRegier
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Mi 28.09.05 11:46 
Hi, wie macht Ihr das wenn irgendwelche Aktualisierungen z.B. in einer DB Anwendung gemacht werden soll,
ich meine nutzt Ihr Messages oder kann man die für selbsterdachte Zwecke verwenden?

Welche Messages gibts und welche kann man hier am besten nutzen? Gibts evtl. ein Tutorial über Messages
was kann ich alles anfangen mit Messages? Ist das eine Api Function?

Ich habe mir das so gedacht dass ich Message schicke und es durchforstet die ganze Anwendung wo ich
dementsprechend reagiere!
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Mi 28.09.05 12:25 
Suche im MSDN WM_USER

ansonsten noch eine Möglichkeit, die an COM angelehnt ist:
Du deklarierst ein Notification-Interface, z.B.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
interface IDBNotificationItem
  ['{irgendeine GUID']
  procedure ReceiveNotification({Parameter, die du gerne hättest});
end;


So, daneben hat deine Klasse, welche irgendwelche Veränderungen auslöst, eine InterfaceList:

ausblenden 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:

ausblenden volle Höhe Delphi-Quelltext
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
  { Konstruktor um sich gleich zu benachrichtigen... }
  constructor Create(ADBKlasse: TDBKlasse);
  { destruktor zum aufräumen }
  destructor Destroy; override;

  { IDBNotificationItem implementieren }
  procedure ReceiveNotification({Parameter, die du gerne hättest});
end;

{ ... }
TWillEineBenachrichtigung.ReceiveNotification({Parameter, die du gerne hättest});
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.

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Mi 28.09.05 13:36 
user profile iconrochus hat folgendes geschrieben:
Suche im MSDN WM_USER
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.


Erstmal Danke für deine Mühe mir über Messages was beizubringen! :wink: Events kenne ich natürlich, weil ich jetzt schon
insgesamt na ja vieleicht 1 Jahr Erfahrung mit Delphi gemacht habe davon 1/2 Beruflich!

1994 habe ich eine Ausbildung als Stattl. gepr. Techn. Assis. f. Informatik abgeschloßen
aber leider hatte ich noch kein Arbeitsplatz wo ich mich entfalten konnte! 2002 habe ich
ein Fernstudium Java Programmierer abgeschloßen!

Sorry, dass ich dich mit Geschichten überrumpeln muß! :wink:
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Mi 28.09.05 14:51 
Sorry, wollt dir nicht auf den Schlipps treten :)

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean