AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
Thema durchsuchen
Ansicht
Themen-Optionen

DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher

Ein Thema von Stevie · begonnen am 18. Nov 2011 · letzter Beitrag vom 6. Feb 2015
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Benutzerbild von Stevie
Stevie
Registriert seit: 12. Aug 2003
Da das Thema DSharp nun doch des öfteren in diversen Threads auftaucht und dort dann oft bezüglich des eigentlichen Themas des Threads doch eher OT ist, mach ich hier mal den "offiziellen DP DSharp Diskussions Thread" auf

Was ist eigentlich DSharp?

Das D im Namen kommt natürlich von Delphi und das Sharp daher, da viele Konzepte aus der C# Welt stammen - und da die .Net Sprache von Embarcadero Prism heißt, war das noch nicht anderweitig belegt

Einen Großteil von DSharp macht das DataBinding aus. Ähnlich wie LiveBindings aber nicht so komplex und auf die Kernfunktionalitäten konzentriert. Und schon ab Delphi 2010 lauffähig - mit einigen wenigen Ausnahmen. Darauf aufbauend ist ein MVVM Framework (gerade im Aufbau) enthalten, was Entwickler dabei unterstützen soll, auf einfachem Wege hochmodulare GUI Anwendungen zu schreiben, die durch ihre entkoppelten Teile eine hohe Wartbarkeit und Testbarkeit haben. Dabei wird der DI Container von spring4d genutzt. Andere Teile von DSharp stellen AOP (über Proxies für Interfaces und Patchen der VMT für virtuelle Methoden) und Mocks bereit.
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (21. Mär 2014 um 09:33 Uhr)
 
Jens01
 
#11
  Alt 3. Dez 2011, 15:55
habe clean.bat gemacht und der Fehler kommt hier :
and (LType.IsInheritedFrom('TForm')
Zitat:
[DCC Fehler] DSharp.Bindings.pas(305): E2010 Inkompatible Typen: 'TRttiType' und 'string'
[DCC Fehler] DSharp.Bindings.pas(306): E2010 Inkompatible Typen: 'TRttiType' und 'string'
[DCC Fehler] DSharp.Bindings.pas(306): E2010 Inkompatible Typen: 'TRttiType' und 'string'
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#12
  Alt 3. Dez 2011, 16:09
IsInherited ist eine 2fach überladene Methode des TRttiType class helpers in the DSharp.Core.Reflection. Auf die Gefahr hin, mich zu wiederholen: stelle bitte sicher, dass du auch das DSharp.Core Package neu kompiliert hast und nicht irgendwo noch eine alte Version davon liegen hast. Der Fehler deutet darauf hin, dass die Überladung der Methode, welche ich am 6. November (r204) hinzugefügt habe, nicht gefunden wird.
Stefan
  Mit Zitat antworten Zitat
Jens01
 
#13
  Alt 3. Dez 2011, 16:12
Sorry, sorry....mein Fehler.
Aus irgendeinem Grund wurden nicht alle Dateien runtergeladen bzw aktualisiert.
Ich habe alles noch mal neu runtergeladen und es läuft!

Wenn ich Dich mal treffe, gebe ich nen Bier aus, okay?

Geändert von Jens01 ( 3. Dez 2011 um 16:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#14
  Alt 3. Dez 2011, 16:18
Sorry, sorry....mein Fehler.
Aus irgendeinem Grund wurden nicht alle Dateien runtergeladen bzw aktualisiert.
Ich habe alles noch mal neu runtergeladen und es läuft!

Wenn ich Dich mal treffe, gebe ich nen Bier aus, okay?
Ist doch kein Problem, dafür ist der Thread ja da - und jau, gute Idee
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

 
Delphi 11 Alexandria
 
#15
  Alt 4. Dez 2011, 15:04
Nachdem ich beim ersten Versuch wegen diverser Probleme gescheitert bin habe ich heute in einem Testsystem noch einen weiteren Versuch unternommen (XE Prof).
Mein GData hat wieder angeschlagen. Da ich mit einem Testsystem arbeite, habe ich das mal ignoriert.


Hier meine Schritte und Probleme, falls jemand allein auch nicht zurande kam:

Ich habe folgende Ordner angelegt:

Projekte\DSharp
.\DelphiSorcery
.\DelphiSpring
.\VST

Dann TortoiseSVN installieren und für die o.g. Ordner über Rechtsklick/SVN Checkout die Projektdaten laden:
DelphiSorcery -> http://delphisorcery.googlecode.com/svn/trunk/
DelphiSpring -> http://delphi-spring-framework.googl...com/svn/trunk/
VST -> http://virtual-treeview.googlecode.com/svn/trunk/

Dann die Projekte erzeugen:


VST
===

Package erzeugen
C:\Users\as\Projekte\DSharp\vst\Packages\Delphi XE\VirtualTreesR.dproj

Bibliothekspfad hinzufügen:
C:\Users\as\Projekte\DSharp\vst\Common

Packages installieren
C:\Users\as\Projekte\DSharp\vst\Packages\Delphi XE\VirtualTreesD.dproj


DelphiSpring
============

Package erzeugen
C:\Users\as\Projekte\DSharp\delphispring\Packages\ DelphiXE\Spring.System.dproj
[DCC Warnung] Spring.System.dpk(50): W1006 Unit 'Spring.Reflection.ValueExpression' ist veraltet

Package erzeugen
C:\Users\as\Projekte\DSharp\delphispring\Packages\ DelphiXE\Spring.Core.dproj
[DCC Warnung] Spring.Core.dpk(35): W1007 Unit 'Spring.Configuration.ConfigurationProperty' ist experimentell
[DCC Warnung] Spring.Core.dpk(36): W1007 Unit 'Spring.Configuration.Node' ist experimentell
[DCC Warnung] Spring.Core.dpk(37): W1007 Unit 'Spring.Configuration' ist experimentell
[DCC Warnung] Spring.Core.dpk(39): W1007 Unit 'Spring.Configuration.Sources' ist experimentell
[DCC Warnung] Spring.Logging.LoggerManager.pas(39): W1007 Unit 'Spring.Configuration' ist experimentell

Ausführen
C:\Users\as\Projekte\DSharp\delphispring\Tests\Spr ing.Tests.dproj
[DCC Warnung] Spring.Tests.Reflection.pas(108): W1006 Unit 'Spring.Reflection.ValueExpression' ist veraltet
[DCC Warnung] Spring.Tests.Configuration.pas(32): W1007 Unit 'Spring.Configuration' ist experimentell
[DCC Warnung] Spring.Tests.Configuration.pas(53): W1007 Unit 'Spring.Configuration.Node' ist experimentell
[DCC Warnung] Spring.Tests.Configuration.pas(54): W1007 Unit 'Spring.Configuration.Sources' ist experimentell
[DCC Warnung] Spring.Tests.Configuration.pas(55): W1007 Unit 'Spring.Configuration.ConfigurationProperty' ist experimentell
[DCC Warnung] Spring.Tests.Logging.pas(7): W1007 Unit 'Spring.Configuration' ist experimentell
[DCC Warnung] Spring.Tests.Logging.pas(8): W1007 Unit 'Spring.Configuration.Sources' ist experimentell
[DCC Warnung] Spring.Logging.LoggerManager.pas(39): W1007 Unit 'Spring.Configuration' ist experimentell


DelphiSorcery
=============

Alle Packages erzeugen

Package installieren
C:\Users\as\Projekte\DSharp\delphisorcery\Packages \DelphiXE\dclDataBindings.dproj
C:\Users\as\Projekte\DSharp\delphisorcery\Packages \DelphiXE\dclDataBindingsVCL.dproj
C:\Users\as\Projekte\DSharp\delphisorcery\Packages \DelphiXE\dclTreeViewPresenter.dproj


=> Sampels\MVVM\Calculator

Bibliothekspfad hinzufügen:
C:\Users\as\Projekte\DSharp\delphispring\Library\D elphiXE\Debug

... OK


=> Sampels\MVVM\Explorer

Bibliothekspfad hinzufügen:
C:\Users\as\Projekte\DSharp\delphisorcery\Samples\ MVVM\Calculator\Debug\Win32

... [DCC Fataler Fehler] DSharp.Core.RegularExpressions.pas(93): F2051 Unit DSharp.Aspects.Weaver wurde mit einer unterschiedlichen Version von DSharp.Core.Reflection.TRttiTypeHelper.GetAttribut esOfType compiliert


=> Sampels\MVVM\ContactManager

Bibliothekspfad hinzufügen:
C:\Users\as\Projekte\DSharp\vst\Source


Fazit:
~~~~~~

Grundsätzlich hat die Installation so funktioniert.
Besonders hat mich (natürlich) das MVVM interessiert.
Die Beispiele muss ich mir noch in Ruhe anschauen. Der Explorer ließ sich jedoch nicht erzeugen.
Auf den ersten Blick konnte ich nicht nachvollziehen, wieviel Arbeit das Framework einem wirklich erspart - wie es also für das Erstellen eines neuen Projektes letztlich eingesetzt wird.
Hat man wirklich deutlich weniger Arbeit dadurch?

Soweit mein erster Eindruck. Mir fehlt noch etwas der Zugang. Ich muss mir dafür nochmal die Zeit nehmen.

Ein Video (notfalls auch in englisch) wäre m.E. ganz nett...
Miniaturansicht angehängter Grafiken
dsharpvirus.png  

Geändert von stahli ( 4. Dez 2011 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#16
  Alt 4. Dez 2011, 15:25
Ich hab gestern einen neuen Blog Artikel zum MVVM veröffentlicht, in dem ich zeige, wie man eine simple Anwendung nach diesem Modell erstellt. Wie ich auch dort erwähne ist der Stand dieses Teils von DSharp zugegebenerweise noch in einem frühen Stadium, was den Einsatz in komplexen und verschachtelten Anwendungen angeht, vor allem, wenn man verschiedene GUI Teile auf selber Ebene hat (das Explorer Sample ist work in progress, wo ich diesen Ansatz weiter verfolge). Aber man kann schon gut eine Idee bekommen, wohin es führen soll und was damit erreicht werden kann.

Eine Sache noch - um Verwirrung zu vermeiden: die Library heißt DSharp, mein Blog Delphi Sorcery. Zum Zeitpunkt als ich das repository auf google code angelegt habe, gab es den Namen DSharp für die Lib noch nicht, daher hab ich es unter dem Namen des Blogs veröffentlicht - leider kann man nach wie vor nicht einfach das Projekt umbenennen oder einfach umziehen; daher lass ich es erstmal so.
Stefan
  Mit Zitat antworten Zitat
mquadrat

 
Delphi XE2 Professional
 
#17
  Alt 5. Dez 2011, 13:45
Gerade mal den Blog-Post gelesen:

Vielleicht liegt es einfach dran, dass Montag ist, aber würde es nicht langen ein ViewModel-Interface im Framework mit zu liefern, anstatt jedes Mal ein eigenes leeres Interface zu deklarieren? Für den Fall, dass man ein nicht-leeres Interface verwenden möchte, kann man dann ja immernoch ein eigenes nehmen, oder?

PS: Ich bezieh mich da gerade auf das ICalculatorViewModel aus dem Beispiel.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#18
  Alt 5. Dez 2011, 14:17
Und was soll der DI Container dann zurückliefern, wenn ein Resolve<IViewModel> aufgerufen wird, welches von 2 komplett unterschiedlichen ViewModel Klassen implementiert wurde, weil man kein eigenes Interface (leer oder nicht) deklariert hat?
Stefan
  Mit Zitat antworten Zitat
mquadrat

 
Delphi XE2 Professional
 
#19
  Alt 5. Dez 2011, 16:44


Ich sollte Montags einfach nichts posten


Naja, also streng genommen könnte man über alle Implementierungen des Interfaces iterieren und über die Namens-Konventionen gehen.

Disclaimer: Es ist immernoch Montag.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#20
  Alt 5. Dez 2011, 17:18
Möglich wäre das, aber das würde einen größeren Eingriff in die Funktionsweise des DI Containers erfordern. Und das nur, um sich nen 3-Zeiler zu sparen für den Fall, dass man ebend in dem Interface für das ViewModel keine Methoden und/oder Eigenschaften hat, halte ich für keinen guten Weg.

Ich denke, deine Frage zielte auf etwas anderes:
Es spricht nichts dagegen, komplett auf das Interface zu verzichten in diesem simplen Fall. Im Calculator Beispiel würde das dann bedeuten, du schreibst einfach Application.Start<TCalculatorViewModel>; Die Registrierung der Klasse passiert in diesem Fall durch das [InheritedExport] auf TViewModelBase.

Wenn du dir das ContactManager Sample anschaust, wirst du aber sehen, warum das Interface in weniger trivialen Anwendungen fast unverzichtbar ist. Dort hast du nämlich die Kontaktübersicht, welche als Abhängigkeit die Kontaktdetails hat (weil es sie ja aufrufen muss). Wäre dort kein Interface für die Details vorhanden, hättest du eine Abhängigkeit dieser 2 Models. Mit dem Interface kannst du einfach das DetailViewModel ausmocken und die Übersicht testen.
Stefan

Geändert von Stevie ( 5. Dez 2011 um 17:20 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 01:52 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