AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Änderungen in einem Object soll mehrere Controls Updaten
Thema durchsuchen
Ansicht
Themen-Optionen

Änderungen in einem Object soll mehrere Controls Updaten

Ein Thema von DennisHB · begonnen am 13. Okt 2006 · letzter Beitrag vom 13. Okt 2006
Antwort Antwort
DennisHB

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

Änderungen in einem Object soll mehrere Controls Updaten

  Alt 13. Okt 2006, 04:33
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
  Mit Zitat antworten Zitat
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Änderungen in einem Object soll mehrere Controls Updaten

  Alt 13. Okt 2006, 06:35
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Änderungen in einem Object soll mehrere Controls Updaten

  Alt 13. Okt 2006, 07:14
Wie wäre es mit dem Observer-Pattern?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
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, 08: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
Antwort Antwort


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 12:30 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