Und wenn ich gut aufgepasst habe, dann sieht man diese Sachen im Objektinspektor nur, wenn sie den Sichtbarkeitsmodifikator
published
haben, richtig?
Exakt.
Bitte erzöhl mehr
Ok, wenn man mich zwingt:
erste Variante:
http://www.delphipraxis.net/162362-m...s-preview.html
aktuell:
http://www.delphipraxis.net/173360-s...framework.html
Da ich immer noch viel Delphi-Standardklassen nicht kenne, weiß ich bsp. nicht, inwiefern man hier mit einem normalen Observer-Pattern arbeiten könnte (hier fehlen mir wieder die Interfaces
) oder es doch etwas komplizierter wird.
Bei mir ist es wohl noch etwas einfacher, da ich ja nur stumpf etwas beobachten will, Änderungen an den Objekten soll die Komponente keine vornehmen können. Nur etwas anzeigen.
Ich glaube ein klassisches Beispiel findet man in dem Zusammenspiel von
TDataSource->TDataSet->TCustomConnection
? Das schaue ich mir mal näher an...
Richtig, aber evtl. für Dich nicht notwendig. Die Frage ist, wie komplex Du es brauchst.
Beispiel TDataAmpel und TVisibleAmpel.
Wenn TVisibleAmpel eine Eigenschaft TDataAmpel hat, kann sie jederzeit auf deren Farbwert zugreifen und sich neu zeichnen.
Machst Du das in einem Timer ist nix weiter notwendig als
VAmpel1.DAmpel := DAmpel1
auszuführen. Das würde schon reichen.
Willst Du keinen Timer verwenden muss DAmpel wissen, in welcher/n VAmpel/n sie verwendet wird (Observer bzw. RegisterListe) und muss bei Datenänderungen ihre VAmpeln informieren.
Alternativ kann ein "Vermittler" alle VAmpeln informieren, wenn in einer DAmpel eine Änderung erfolgt.
Wenn Du eine 1:1 Beziehung hast, kannst Du es Dir natürlich leicht machen und VAmpel und DAmpel gegenseitig miteinander bekannt machen.
In jedem Fall muss man beachten, dass die sichtbaren Controls darüber informiert werden, wenn das gebundene Datenobjekt aufgelöst wird.
Ich weise meinen sichtbaren Controls ein Objekt zu und einen Eigenschaftsnamen. Der Objekttyp muss dem sichtbaren Control dabei nicht bekannt sein.
Im Prinzip etwa:
VAmpel1.Ctrl.Object := DAmpel1; VAmpel1.Ctrl.PropName := 'Color';
bzw. real:
VAmpel1.Ctrl.ObjName := '#EineId_Oder_ComponentName.Color';
Die Auflösung erfolgt dann zur Laufzeit. Datenänderungen durch das Control oder durch die BusinessLogic werden in beide Richtungen über ein Framework automatisch übermittelt.