Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Änderungen in einem Object soll mehrere Controls Updaten (https://www.delphipraxis.net/78918-aenderungen-einem-object-soll-mehrere-controls-updaten.html)

DennisHB 13. Okt 2006 04:33


Änderungen in einem Object soll mehrere Controls Updaten
 
Hallo,

suche eine schöne Lösung für folgendes Problem.

ich habe eine Liste mit Objekten "Class(TObjectList)" diese Liste möchte ich mit mehreren Controls (Anzahl beliebig) verknüpfen können.

Wenn nun aber eines dieser Controls zB die Property "Selected" ändert sollen die anderen darauf reagieren.

OnChange fällt soweit aus, da ich damit ja nur 1 Control informieren kann.
Eine OnChange-List in der sich die Controls eintragen, wäre eine Möglichkeit nur müsten sie sich auch wieder austragen.

gibt es eine schönere Lösung?

Jedes Control hat eine Property "Items" der diese Liste zu gewiesen wird.

Ich dachte an "Messages" aber, nach dem ich mich hier durch gelesen habe, scheinen die auch nur an ein Control gesendet zu werden.

Danke und Gruss
Dennis

hsg 13. Okt 2006 06:35

Re: Änderungen in einem Object soll mehrere Controls Updaten
 
Hallo,

du kommst um eine Liste, in der sich die Controls eintragen und wieder austragen nicht herum. Leite dazu alle entsprechenden Controls ab, dann kannst du die An- und Abmeldung im Constructor und Destructor des Controls automatisieren. Nun brauchst du nur noche eine Methode in der Liste, die dann die Benachrichtigungen der einzelnen Controls übernimmt.

Ich mache so etwas mit Fenstern: Ein Hauptfenster enthält eine Liste aller Unterfenster, die Fenster rufen beim Erzeugen eine Methode des Owners auf um sich dort anzumelden, beim Zerstören entsprechendes. Die zu behandelnden Events werden an das Hauptfenster weitergereicht, das dann die einzelnen Kinder benachrichtigt.

Gruß Jörg

Bernhard Geyer 13. Okt 2006 07:14

Re: Änderungen in einem Object soll mehrere Controls Updaten
 
Wie wäre es mit dem Observer-Pattern?

DennisHB 13. Okt 2006 08:00

Re: Änderungen in einem Object soll mehrere Controls Updaten
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz