Einzelnen Beitrag anzeigen

DennisHB

Registriert seit: 25. Aug 2003
Ort: Bremen
58 Beiträge
 
Delphi 6 Personal
 
#4

Re: Änderungen in einem Object soll mehrere Controls Updaten

  Alt 13. Okt 2006, 09:00
Ich hab mich nun mit einer "Control"-Liste angefreundet und umgesetzt.
Das, das ganze so auch einen Namen hat, war mir entfallen. Kann mich aber erinnern, das ich "Observer-Pattern" früher schonmal hier gelesen habe
Daher dann wohl auch mein Lösungsweg über ein NotifyObject.

Für andere die ein ähnliches Prob haben kurze Erklärung:

Delphi-Quellcode:
// NotifyObjectUnit
TmyNotifyEvent = procedure(Sender: TObject; Event:Integer) of object;
TmyNotifyObject=class(TObject)
private
   fOnNotify : TmyNotifyEvent;
public
   Property OnNotify: TmyNotifyEvent read fOnNotify write fOnNotify;
   procedure DoNotify(Sender: TObject; Event:Integer);
end;

...

procedure TmyNotifyObject.DoNotify(Sender: TObject; Event:Integer);
begin
   if Assigned(fOnNotify) then
      fOnNotify(Sender, Event);
end;
Delphi-Quellcode:
// Meine List Unit
uses
   myNotifyObjectUnit;

...

TMyList = Class(TObjectList)
private
   fNotifyList : TObjectList;
   ...
protected
   // zB.
   procedure DoChange;
public
   procedure AddNotifyObject(aNO:TmyNotifyObject);
   procedure RemoveNotifyObject(aNO:TmyNotifyObject);
   ...
end;

...

procedure TMyList.DoChange;
var
   i : integer;
begin
   for i:=0 to fNotifyList.Count-1 do
      if Assigned(fNotifyList[i]) then
         fNotifyList[i].DoNotify(self, myNEChange);

// myNEChange als Bsp. da hier ein Integer erwartet wird kann ich mir eine Reihe von
// "Event"-Meldungen ausdenken die ich dann am Ziel bequem per Case auswerten kann
end;

procedure TMyList.AddNotifyObject(aNO:TmyNotifyObject);
begin
   if (fNotifyList.IndexOf(aNO) < 0) then // Testen ob schon in der Liste
      fNotifyList.Add(aNO);
end;

procedure TMyList.RemoveNotifyObject(aNO:TmyNotifyObject);
begin
   fNotifyList.Remove(aNO);
end;
Delphi-Quellcode:
//Meine Control Unit
uses
   myNotifyObjectUnit, myListUnit;

...

TmyComboBox = Class(TCustomComboBox)
private
   fMyNotifyObect : TmyNotifyObject;
   procedure SetItems(Value: TmyList);
   procedure DoNotify(Sender: TObject; Event:Integer);
public
   property Items : TMyList read fItems write SetItems;
   Constructor Create(AOwner:TComponent); Override;
   Destructor Destroy; Override;
end;

...

procedure TmyComboBox.SetItems(Value: TmyList);
begin
   if fItems <> Value then begin
      if Assigned(fItems) then fItems.RemoveNotifyObject(fMyNotifyObect);
      fItems := Value;
      if Assigned(fItems) then fItems.AddNotifyObject(fMyNotifyObect);
   end;
   Repaint;
end;

procedure TmyComboBox.DoNotify(Sender: TObject; Event:Integer);
begin
   // Hier dann endlich die Auswertung :)
end;

Constructor TmyComboBox.Create(AOwner:TComponent);
begin
   Inherited;
   fMyNotifyObect := TmyNotifyObject.Create;
   fMyNotifyObect.OnNotify := DoNotify;
end;

Destructor TmyComboBox.Destroy;
begin
   if Assigned(fItems) then fItems.RemoveNotifyObject(fMyNotifyObect);
   fMyNotifyObect.Free;
   inherited;
end;
Ich finde das zwar reichlich Aufwand für ein eigentlich kleines Problem...
Aber mit der Lösung werd ich hoffentlich ersteinmal ein weile Auskommen.

Danke und Gruss
Dennis
  Mit Zitat antworten Zitat