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