AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi OOP, Objekte neu laden, Komponenten aktualisieren

OOP, Objekte neu laden, Komponenten aktualisieren

Ein Thema von TheMiller · begonnen am 12. Apr 2012 · letzter Beitrag vom 13. Apr 2012
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

OOP, Objekte neu laden, Komponenten aktualisieren

  Alt 12. Apr 2012, 15:51
Delphi-Version: 2009
Hallo,

ich weis, dass es ein richtig schlechter Titel ist, aber mir fällt keine prägnante Beschreibung ein.

Ich programmiere objektorientiert. Angenommen, ich habe das globale Objekt "TFahrzeuge", welches alle Fahrzeuge enthält. Diese Objekte werden auf 3 Forms benutzt zB in einer ListView, Combobox und TreeView.
Nun führt ein Benutzerverhalten (ändern/löschen etc.) dazu, dass die Liste komplett neu geladen wird, in meinem Fall aus der DB.
Das wiederrum führt dazu, dass ich als Programmierer sicherstellen muss, dass alle drei Komponenten gleichzeitig aktualisiert werden. Vergesse ich eine, tritt bei dieser eine AV auf, weil die Speicherbereiche sich geändert haben.

Jetzt könnte man sagen, dass man halt daran denken muss - aber wenn das Projekt wächst, dann wird's unübersichtlich.

Wie machen das andere / Wie löst ihr dieses Problem?

Ich dachte an eine Art "Listener". Jede Komponente, die die Aufgabe hat etwas mit Objekten zu tun, kann sich "registrieren". Wird jetzt das Objekt "TFahrzeuge" geändert - also neu geladen, wird allen Objekten bescheid gegeben und alle Objekte aktualisieren sich. Problem ist aber, dass - je nach Programmgröße und Anzahl der registrierten Objekte - dies unnötig lange dauern kann.

Eine andere Idee wäre es, die Komponenten immer im OnActivate einer Form zu aktualisieren. Aber das könnte den Programmablauf verzögern und das Programm würde immer kurz hängen, wenn man die Forms wechselt.

Ich hoffe, ihr versteht was ich meine und könnt mir ein paar Tipps geben.

Danke im Voraus!
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: OOP, Objekte neu laden, Komponenten aktualisieren

  Alt 12. Apr 2012, 15:55
Ich handhabe es so, dass die Modelle nach außen hin ein OnChange-Event anbieten. Natürlich musste ich das selbst programmieren, da Delphi von Haus aus nur einen "Listener" registrieren kann -> normale Events. Daher habe ich mir eine Basisklasse bzw. ein entsprechendes Interface geschrieben.

Ändert sich das Objekt bzw. eine Eigenschaft davon, dann propagiere ich das nach "außen" und informiere so die Listener, dass sich die Eigenschaft XYZ geändert hat. Was diese dann machen, ist dem Model selbst egal.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: OOP, Objekte neu laden, Komponenten aktualisieren

  Alt 12. Apr 2012, 15:56
Wenn Du das ganze in Tabellen abfackelst, mit datensensitiven Controls bist Du schon fertig ....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

AW: OOP, Objekte neu laden, Komponenten aktualisieren

  Alt 12. Apr 2012, 15:58
Wenn Du das ganze in Tabellen abfackelst, mit datensensitiven Controls bist Du schon fertig ....
Stevie's DSharp schlägt ja auch in die selbe Kerbe.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: OOP, Objekte neu laden, Komponenten aktualisieren

  Alt 12. Apr 2012, 16:00
@s.h.a.r.k

welche Kerbe, für oder gegen "Tabellen" ?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

AW: OOP, Objekte neu laden, Komponenten aktualisieren

  Alt 12. Apr 2012, 16:07
Die datensensiblen Controls allgemein -- weder für Tabellen, noch gegen diese. Wobei ich behaupten würde, dass DSharp hier etwas flexibler ist, als wenn ich alles in Tabellen klatschen würde. So verliere ich ja auch gewisse Weise den Nutzen der Objekte, da ich dann ja "nur" Datasets habe. Bin jedenfalls selbst nie so richtig mit diesen Tabellen warm geworden. Bin dann doch ganz gerne der, der es zu Fuss macht, auch wenn es mehr Arbeit ist
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: OOP, Objekte neu laden, Komponenten aktualisieren

  Alt 12. Apr 2012, 16:18
@DJ-SPM

Du gehst genau in die gleiche Richtung, wie ich auch.
In Deinem letzten Thread hatte ich schon auf 2 Themen gelinkt, die auch mit in den Bereich fallen.

Bisher habe ich es so gelöst, dass ich Datenobjekte und eine Eigenschaft an ein sichtbares Control binde (odControls). Wenn das Control sich zeichnet liest es seinen darzustellenden Wert aus der Objekteigenschaft (z.B. Person.FirstName). Das funktioniert mit der erweiterten RTTI ab D2010 einfacher.
Das Framework kümmert sich auch darum, die sichtbaren Controls zu informieren, wenn ein gebundes Datenobjekt aufgelöst wird.
Die Formulare erhalten einen "odFormControler" (der wird einfach auf das Formular gesetzt), der die Verbindung der Datenschuicht und GUI übernimmt.
Insofern ist das alles soweit automatisiert. Man stellt einfach zur Designzeit die gewünschten Eigenschaften ein und das Framework erledigt den Rest.

Das funktioniert so aber nur, wenn alle (Daten-)Objekte die ganze Zeit im Hauptspeicher gehalten werden. Auch müssen sich die Datenklassen untereinander zum großen Teil kennen, und davon will ich künftig gern weg kommen.

Daher plane ich für später eine Lösung in der Art:
- Controls wird eine Id zugewiesen
- die Controls fordern von einem Broker Schnittstellen ab (anhand der Id)
- der Broker erzeugt/verwaltet/zertstört die Objekte und gibt auf Anfrage Schnittstellen heraus
- dabei kann der Broker auf einen ORM zurück greifen - oder auch nicht
- bei Bedarf kann der Zugriff über C/S realisiert werden

Auf jeden Fall würde ich künftig Controls nicht mehr fest an Datenobjekte binden wollen. Besser (übersichtlicher) ist es wohl, nur Id´s zuzuweisen und die Objekte bei jedem Zugriff neu abzufragen. Der Broker wäre dann dafür zuständig, die Objekte in sinnvoller Form zu cachen.


Ich hatte schon länger mal geplant, bzw. mir gewünscht, dass die DP-Profis mal gemeinsam ein entsprechendes Demoprojekt aufbauen, damit man als Einsteiger mal einen Zugang dazu findet. Wer wäre dabei? Man könnte mal ein paar Kriterien zusammenstellen...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (12. Apr 2012 um 16:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#8

AW: OOP, Objekte neu laden, Komponenten aktualisieren

  Alt 12. Apr 2012, 20:51
Ich hatte schon länger mal geplant, bzw. mir gewünscht, dass die DP-Profis mal gemeinsam ein entsprechendes Demoprojekt aufbauen, damit man als Einsteiger mal einen Zugang dazu findet. Wer wäre dabei? Man könnte mal ein paar Kriterien zusammenstellen...
Ehm ja. Ich wäre eigentlich dabei - hab ja die Frage quasi mal wieder aufgegriffen / ins Rollen gebracht. Auch brauche ich selbst eine Lösung. Zwei Ansätze habe ich ja schon gebracht. Beim Drüberlesen über deinen Beitrag hören sich unsere Vorschläge ein wenig identisch an. Kann aber auch vielleicht nur Einbildung sein, weil ich gerade nur die Hälfte verstanden habe

Meine Idee wäre folgende (unrein, ungetestet)

Objekte: TFahrzeuge, TAuto, TFahrrad, TPersonen, THalter, TFahrer
Komponenten: chkboxFahrzeugtyp, cbAutos, cbFahrraeder, cbHalter, cbFahrer
User-Möglichkeiten: Fahrzeug hinzufügen (LKW), Auto/Fahrrad hinzufügen, Personen (Vor/Nachname) hinzufügen
Objektverwaltung: TFahrzeug und TPersonen sind global und von TObjectList abgeleitet.

Problem: Wird ein neues Auto hinzugefügt, wird auch das globale Auto-Objekt neu geladen => neue Speicheradressen

Nun muss jede Komponente bescheid gesagt bekommen, dass deren Inhalt veraltet ist und sich eben verändert hat. Meine erste(!) Idee wäre nun diese, dass jede Komponente einem "Verwalter" (Broker) sagt: Ich möchte wissen, wenn sich was ändert. Dies könnte in einem Array gespeichert werden oder so. Bei einer Änderung beliefert der Verwalter die Komponenten, die für "TAuto" zuständig ist, mit allen neuen Daten.

Das hätte sogar den Vorteil, dass man das in eine Unit auslagern kann und demnach alle Ladevorgänge an einem Ort hat. Quasi eine weitere Ebene zwischen Objekten und GUI. Ich nehme dabei an, dass sowieso eine Unit nur für Objekte exisitert.

Ich hoffe, das war jetzt nicht zu umständlich?

Wobei ich auch sagen muss, dass diese Variante ziemliche Tipparbeit sein könnte. Aber das könnte man ja alles selbst in eine tolle Klasse verpacken, die Methoden wie "addListener(obj: TObject)" bereitstellt. So kann eine Komponente mit einem Objekt für den Listener "verlinkt" werden. Einmalig. Den Rest übernimmt die Klasse. Also nur einmal Tipparbeit und alle Projekte dürften davon profitieren (mit minimaler Anpassung). VSS: Das ausgedachte System würde funktionieren

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.536 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: OOP, Objekte neu laden, Komponenten aktualisieren

  Alt 13. Apr 2012, 07:04
Für mich klingt das alles nach Observer-Pattern.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: OOP, Objekte neu laden, Komponenten aktualisieren

  Alt 13. Apr 2012, 08:30
Wenn Du das ganze in Tabellen abfackelst, mit datensensitiven Controls bist Du schon fertig ....
Stevie's DSharp schlägt ja auch in die selbe Kerbe.
Problem ist leider, dass ihm das mit Delphi 2009 nicht helfen wird
Ansonsten dürfte das beschriebene ohne Probleme möglich sein. Fahrzeugliste (welche in diesem Fall von IObservableCollection sein sollte) an die verschiedenen Controls binden, Properties des in der Liste angewählten Objekts an andere Controls binden, fertig
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:27 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