Ich habe mich einige Zeit mit dem Databinding befasst und will mal ein paar Punkte zusammenfassen bzw. diskutieren:
- Grundsatz
Ich will auf jeden Fall künftig mit Trennung von
GUI und Business-Logik arbeiten.
Das muss keinesfalls durch MVVM realisiert werden, aber eine Trennung soll gegeben sein und ein Framework soll sich um die Verdrahtung und den Datentransport kümmern.
- (Visual) Live Bindings von Emba (und FireMonkey)
Sind ja bekanntermaßen ziemlich fehlerhaft und in Bezug auf Datenmengen völlig untauglich.
Datasets werden komplett in Grids kopiert, was bei 100.000 Datensätzen bis 2 Minuten dauern kann (sowohl zur Designtime als auch zur Runtime).
Daten zur Designtime in einfachen Controls (z.B. Edits) werden im Formular gespeichert.
Beim Bearbeiten von Daten gibt es jede Menge Probleme.
Ebenso beim Arbeiten in der
IDE, z.B. beim Ausschneiden angebundener Controls usw.
- OpenWire Live Bindings von MITOV (und FireMonkey)
Ist ähnlich den VLB von Emba. Graphisch aber deutlich ansprechender.
Man muss Controls bzw. deren Propertys "Pins" zuweisen und kann die Pins dann graphisch gestützt verbinden.
Am Anfang ist das sehr beeindruckend, aber ich hatte dann doch Zweifel, ob das das bessere Konzept ist. Unschön ist die Darstellung, wenn Controls nicht im Formular, sondern z.B. in einem Panel liegen.
Probleme bei Ausschneiden gebundener Controls gab es genau wie bei den VLB.
Die während der Designtime zugewiesenen Daten werden auch im Formular gespeichert.
Im Gegensatz zu dem VLB werden keine Exressions unterstützt, sondern nur die nackten Daten übertragen.
Dafür gibt es Clock-Pins, die z.B. Buttons an Methoden binden können.
Die Dataset-Bindung an Grids funktioniert (genau so ungünstig) wie bei den VLB (ob TMSFMXGrid unterstützt wird weiß ich nicht).
- Gitter von Hand füllen.
Testweise befülle ich ein TMSFMXGrid mit 100.000 Datensäten von Hand.
Das dauert geschätzt 1-2 Sekunden.
Bei beiden vorgenannten Datenbindungen dauert das 1-2 Minuten. Sicherlich macht sich dabei das genutzte
RTTI bremsend bemerkbar.
- DSharp
MVVM finde ich zu kompliziert. Ich erkenne nicht, dass mir das einen wirklichen Vorteil bringt. Ich möchte so arbeiten, dass das flüssig von der Hand geht, also
GUI basteln und mit der BL verdrahten - fertig. Das MVVM-Framework kann ich kaum nachvollziehen, weshalb ich damit auch nicht arbeiten werde.
Die
IDE-Einbindung von DSharp (Verdrahtung zur Designtime) will ich mir heute endlich mal ansehen.
Was mir immer noch unklar ist, ist wie man Objekte binden kann, die von einem Server geholt werden. Zur Designtime liegen die ja dann noch nicht zum binden vor.
Auch würde mich interessieren, wie große Datenmengen (100.000 Datensätze) an ein Gitter gebunden werden. Wird da auch alles in einem Rutsch kopiert?
- TMSFMXGrid
Damit möchte ich am liebsten arbeiten, da ua. eine Gruppierung unterstützt wird, die Zellen sehr variabel formatierbar und Tabellenausdrucke möglich sind.
- Fazit
Für größere Datenmengen ist aber jede vorgenannte Datenbindung (bei DSharp weiß ich es noch nicht wirklich) eine unsinnige Lösung, da die Daten komplett in das Gitter kopiert werden und für jeden Schritt die (langsame)
RTTI-Funktionalität ausgeführt wird.
Insofern wäre es weitaus sinnvoller, lediglich Rowcount und Colcount zu definieren und die Zellen dynamisch bei deren Darstellung und Bearbeitung an die Daten zu binden.
Wird eine Zelle gezeichnet, holt sie sich also ihren Wert vom Objekt oder dem Dataset ab und bei Änderungen schreibt sie diese entsprechend zurück.
Nur die sichtbaren Zellen würden Daten representieren.
Gruppieren ließen sich die Daten dennoch recht einfach. Man würde lediglich ab und zu Gruppenheader zwischen den normalen Zeilen einfügen.
Eine Umsortierung der Spalten im Gitter wäre natürlich schwierig, da ja nicht Daten von allen 100.000 Datensätzen vorliegen.
M.E. benötigt man somit unbedingt ein spezalisiertes Gitter, um Datenmengen (egal ob Objektlisten oder Datasets) sinnvoll daran binden zu können.
In dem Zusammenhang sollte dieses persistente Spalten unterstützen, denen sich bestimmte Formatierungen und Datenoptionen zuweisen lassen (hat das TMS Grid leider noch nicht).