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

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 05:25 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