AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Delphi 7 Komponentenentwicklung zentraler Nachrichtengeber
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 7 Komponentenentwicklung zentraler Nachrichtengeber

Ein Thema von inriz · begonnen am 25. Aug 2006 · letzter Beitrag vom 28. Aug 2006
 
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Delphi 7 Komponentenentwicklung zentraler Nachrichtengeb

  Alt 25. Aug 2006, 15:09
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]
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz