![]() |
Ä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 |
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 |
Re: Änderungen in einem Object soll mehrere Controls Updaten
Wie wäre es mit dem
![]() |
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:
Ich finde das zwar reichlich Aufwand für ein eigentlich kleines Problem...
//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; Aber mit der Lösung werd ich hoffentlich ersteinmal ein weile Auskommen. Danke und Gruss Dennis |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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