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 5 von 5   « Erste     345   
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)
 
Marco Erdmann

 
Delphi XE3 Professional
 
#41
  Alt 28. Feb 2013, 16:16
Hallo Stevie,

ja, das war der Trick. Super, vielen Dank. Jetzt bin ich damit schon einen großen Schritt weiter. Dein ganzes Binding-Framework ist zwar deutlich besser zu verstehen als Embarcaderos LiveBindings, aber ein paar Dinge sind eben doch gar nicht so leicht.

Ich bin mal gespannt, wo die Reise noch hingeht mit DSharp. Als nächstes schaue ich mir definitiv mal die MVVM-Demos an.

Viele Grüße und vielen Dank,

Marco
  Mit Zitat antworten Zitat
TiGü

 
Delphi 10.4 Sydney
 
#42
  Alt 4. Mär 2013, 13:34
Hallo Stevie,

ich habe mir am Freitag (1. März) die Sourcen für DSharp und Spring gezogen, um mir deine Lösungen für MVVM näher anzuschauen.
Auf den ersten Blick bin ich schwer begeistert.
Es ist geradezu Magie am Werk!

Aber das MVVM\Explorer Sample ist defekt.
Zuerst eine Kleinigkeit: Es fehlen die Verweise in der Projektdatei auf ..\..\..\Source\Aspects und ..\..\..\Source\Logging.
Auch andere Beispielprojekte haben nicht alle Suchpfade inkludiert.

Aber nun das Problem:
Beim Ausführen (mit XE3 Prof) kommt es zu einer Exception:
Code:
---------------------------
Debugger Exception Notification
---------------------------
Project Explorer.exe raised exception class $C0000096 with message 'privileged instruction at 0x024d37f0'.
---------------------------
Break  Continue  Help  
---------------------------
Ein Klick auf Break zeigt dann diesen Callstack:
Code:
:024637f0 
System.Rtti.RawInvoke(???,???)
System.Rtti.Invoke($95BCD4,((($95BBB0, Pointer($970F60) as IValueData, 80, 20048, 39341648, $2584E50, TClass($2584E50), 80, 20048, 39341648, 1,58916483213911e-37, 1,9437356727579e-316, 0,00000000014341e-4933, 39341648, 3934,1648, 39341648, 39341648, ($2584E50, nil), $2584E50)), (($959B14, TValueDataImpl($2463AA4) as IValueData, 0, 0, 0, nil, nil, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (nil, nil), nil))),???,???,False)
System.Rtti.TRttiInstanceProperty.DoSetValue(???,$18FBC8)
System.Rtti.TRttiProperty.SetValue($2584E50,$18FBC8)
:00636fee TRttiPropertyHelper.SetValue + $26
DSharp.ComponentModel.Composition.SpringContainer.TPropertyInjectionWithDelegate.DoInject((($95BBB0, Pointer($970F60) as IValueData, 80, 20048, 39341648, $2584E50, TClass($2584E50), 80, 20048, 39341648, 1,58916483213911e-37, 1,9437356727579e-316, 3,72036854775808e+580, 39341648, 3934,1648, 39341648, 39341648, ($2584E50, nil), $2584E50)),(...))
:007985b1 TInjectionBase.Inject + $71
:007995e6 TReflectionComponentActivator.ExecuteInjections + $7E
:00799501 TReflectionComponentActivator.CreateInstance + $E1
:007bb8a2 TTransientLifetimeManager.GetInstance + $42
:007c86d4 TServiceResolver.DoResolve + $90
:007c8c11 TServiceResolver.Resolve + $151
:007c88a9 TServiceResolver.Resolve + $15
DSharp.ComponentModel.Composition.SpringContainer.TSpringContainer.Resolve($959970,'')
Explorer.{DSharp.PresentationModel.Bootstrapper}TBootstrapper<Interfaces.IMainViewModel>.GetInstance($959970,'')
Explorer.{DSharp.PresentationModel.Bootstrapper}@TBootstrapper`1.Create$553$ActRec<Interfaces.IMainViewModel>.$0$Body($959970,'')
Explorer.Composition.Get<Interfaces.IMainViewModel>('')
Explorer.Composition.Get<Interfaces.IMainViewModel>
Explorer.{DSharp.PresentationModel.Bootstrapper}@TBootstrapper`1.StartRuntime$556$ActRec<Interfaces.IMainViewModel>.$0$Body
Explorer.{DSharp.Core.Lazy}TLazy<Interfaces.IMainViewModel>.Initialize
Explorer.{DSharp.Core.Lazy}TLazy<Interfaces.IMainViewModel>.Invoke
Explorer.{DSharp.Core.Lazy}Lazy<Interfaces.IMainViewModel>.GetValue
Explorer.{DSharp.PresentationModel.Bootstrapper}TBootstrapper<Interfaces.IMainViewModel>.StartRuntime
Explorer.TApplicationVCLHelper.Start<Interfaces.IMainViewModel>
Explorer.Explorer
:766933aa kernel32.BaseThreadInitThunk + 0x12
:77839ef2 ntdll.RtlInitializeExceptionChain + 0x63
:77839ec5 ntdll.RtlInitializeExceptionChain + 0x36
Was in diese Zeile zeigt:
Delphi-Quellcode:
//System.Rtti Zeile 6914
@@skip_push:

      // Do call
      MOV EAX, [EBX].TParamBlock.RegEAX
      MOV EDX, [EBX].TParamBlock.RegEDX
      MOV ECX, [EBX].TParamBlock.RegECX
      CALL [EBP - 4]
      [B]MOV [EBX].TParamBlock.RegEAX, EAX[/B]
      MOV [EBX].TParamBlock.RegEDX, EDX

      MOVSX EAX, BYTE PTR [EBX].TParamBlock.PopFP
      INC EAX
      JNZ @@do_fp_pop
      NOP
      JMP @@done_fp_pop
Am Ende gibts noch Memory Leaks:
Code:
---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:



1 - 12 bytes: TMoveArrayManager<DSharp.Core.MethodIntercept.TMethodIntercept> x 4, Unknown x 3

13 - 20 bytes: TMethodIntercept x 18

21 - 28 bytes: TMethodImplementation x 18, TVirtualInterface.Create$90$ActRec x 3, TInterfaceMethodInterceptor.Proxify$432$ActRec x 4, TWindowManager x 1

29 - 36 bytes: Unknown x 3

37 - 44 bytes: TObjectList<DSharp.Core.MethodIntercept.TMethodIntercept> x 4

53 - 60 bytes: TList<Interfaces.IWorkingAreaViewModel> x 1, TVirtualInterface x 4, TList<DSharp.Core.Validations.IValidationResult> x 3, Unknown x 3

109 - 116 bytes: TWorkingAreaViewModel x 1

117 - 124 bytes: TNavigationViewModel x 1, TMainViewModel x 1


---------------------------
OK  
---------------------------
  Mit Zitat antworten Zitat
TiGü

 
Delphi 10.4 Sydney
 
#43
  Alt 4. Mär 2013, 13:36
Nachtrag:
Das Erzeugen von FNavigation.Elements verursacht die Exception.

Delphi-Quellcode:
procedure TMainViewModel.SetWorkingAreas(const Value: TArray<IWorkingAreaViewModel>);
begin
  FWorkingAreas := Value;

  if Assigned(FNavigation) then
  begin
    FNavigation.Elements := TList<IWorkingAreaViewModel>.Create; //<--- hier
    FNavigation.Elements.AddRange(FWorkingAreas);
  end;
end;
  Mit Zitat antworten Zitat
TiGü

 
Delphi 10.4 Sydney
 
#44
  Alt 4. Mär 2013, 13:45
Wenn man versucht vor dem Erzeugen ein FNavigation.Elements := nil; zu machen, kommt es zur AV.
Er springt auch nicht in die Setter und Getter der Liste.
Delphi-Quellcode:
function TNavigationViewModel.GetElements: IList<IWorkingAreaViewModel>;
begin
  Result := FElements;
end;

procedure TNavigationViewModel.SetElements(const Value: IList<IWorkingAreaViewModel>);
begin
  FElements := Value;
end;
  Mit Zitat antworten Zitat
TiGü

 
Delphi 10.4 Sydney
 
#45
  Alt 4. Mär 2013, 14:35
Boah, ist das alles wegabstrahiert.
Man muss ja komplett umdenken!

Ich habe ein Frage an die Leute, die schon etwas mehr Erfahrung haben:

Ausgangspunkt ist das PageControlSample.
Was muss ich tun, damit das Edit-Feld (TEdit.Enabled) auf den Zustand der Checkbox "hört"?

Ich bräuchte mal einen kleinen Denkanstoss, weil ich nicht so wirklich weiß, wo ich da ansetzen soll:

Delphi-Quellcode:
unit DetailViewFrame;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DSharp.Bindings.VclControls;

type
  TDetailView = class(TFrame)
    Close: TButton;
    InsertText: TEdit;
    EditEnabled: TCheckBox;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

initialization
  TDetailView.ClassName;

end.
Delphi-Quellcode:
unit DetailViewModel;

interface

uses
  DSharp.ComponentModel.Composition,
  DSharp.PresentationModel.ViewModelBase,
  Interfaces;

type
  TDetailViewModel = class(TViewModelBase, IDetailViewModel)
  private
    FInsertText : string;
    FEditEnabled : Boolean;
    procedure SetInsertText(const Value: string);
    function GetInsertText: string;
    function GetEditEnabled: Boolean;
    procedure SetEditEnabled(const Value: Boolean);
  public
    property InsertText : string
      read GetInsertText
      write SetInsertText;
    property EditEnabled: Boolean
      read GetEditEnabled
      write SetEditEnabled;
  end;

implementation

{ TDetailViewModel }

function TDetailViewModel.GetEditEnabled: Boolean;
begin
  Result := FEditEnabled;
end;

function TDetailViewModel.GetInsertText: string;
begin
  Result := FInsertText;
end;

procedure TDetailViewModel.SetEditEnabled(const Value: Boolean);
begin
  FEditEnabled := Value;
end;

procedure TDetailViewModel.SetInsertText(const Value: string);
begin
  FInsertText := Value;
end;

initialization
  TDetailViewModel.ClassName;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#46
  Alt 4. Mär 2013, 16:32
Hi,

zuerst einmal, das Explorer Demo ist im Moment Baustelle - da im Moment noch an dem MVVM Part gearbeitet wird, habe ich da nicht weiter geschaut.

Zu der Checkbox und dem Edit.

Es funktioniert ähnlich wie in Caliburn.Micro:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Classes,
  DSharp.Bindings.VclControls,
  DSharp.PresentationModel.ConventionManager,
  DSharp.PresentationModel.VclConventionManager,
  DSharp.PresentationModel.ElementConvention;

implementation

uses
  DSharp.Core.Reflection;

type
  ConventionManagerHelper = record helper for ConventionManager
    class procedure Initialize; static;
  end;

{ ConventionManagerHelper }

class procedure ConventionManagerHelper.Initialize;
begin
  AddElementConvention<TEdit>('Text', 'OnChange').ApplyBinding :=
    procedure(AViewModel: TObject; APropertyName: string;
      AViewElement: TComponent; ABindingType: TBindingType;
      AConvention: TElementConvention)
    begin
      if AViewModel.HasProperty(AViewElement.Name + 'Enabled') then
        SetBinding(AViewModel, AViewElement.Name + 'Enabled', AViewElement, 'Enabled');
    end;
end;

initialization
  ConventionManager.Initialize;

end.
Das ist noch nicht ideal und wird sicherlich in der Zukunft auch noch verbessert, denn so kann man nur eine Convention pro Control Klasse festlegen.
Stefan
  Mit Zitat antworten Zitat
CarlAshnikov

 
Delphi XE5 Enterprise
 
#47
  Alt 21. Mär 2014, 07:45
Hi ich habe 2 Fragen zum Thema:

Gibt es irgendwo eine Art Übersicht über die angebotenen Features von DSharp? Interessant wäre etwas ähnlich zu dem was Nick Hodges in Coding in Delphi für das Spring4D gemacht hat.

Ich habe mir das MVVM Sample Calculator angesehen aber ich kapiere nicht wie hier das Binding zustande kommt. Es gibt zwar eine BindingGroup, die enthält aber nichts. Kann mir hier jemand auf die Sprünge helfen?
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#48
  Alt 21. Mär 2014, 09:32
Hi,

nein, aktuell nicht - da DSharp so einiges enthält von "experimental, mal gucken, ob das geht" bis zu "stable and used in production"

MVVM ist ein etwas komplexes Gebiet - da es aber nach Caliburn Micro konzipiert ist, lohnt es auf jeden Fall sich dort ein wenig einzulesen um das Gesamtkonzept zu verstehen. Konkret zu der Frage: diese Aufgabe übernimmt der ViewModelBinder. Anhand von vordefinierten Conventions (die man auch anpassen und erweitern kann) stellt er Bindings zwischen dem View und dem ViewModel her.

MVVM ist aktuell übrigens irgendwo zwischen den beiden oben genannten Status - das in richtung "stable" zu bringen steht aber für's nächste halbe Jahr auf meiner Todo Liste. (Jeroen Pluimers hat übrigens schon mind einen Artikel darüber fürs Blaise Pascal Magazine geschrieben, wen das noch weitgehender interessiert)
Stefan
  Mit Zitat antworten Zitat
Whookie

 
Delphi 10.3 Rio
 
#49
  Alt 6. Feb 2015, 15:33
Hi!
Ich habe mich einwenig mit MVVM beschäftigt und bin dann auf DSharp gestoßen. Das Projekt sieht ziemlich umfangreich aus und wäre durchaus interessant um da tiefer einzutauchen.

Ein paar Fragen nach den ersten paar Stunden sind aber schon aufgetaucht:

1. Wird das Projekt noch aktiv bearbeitet?
2. Setzt das jemand in einem größeren Projekt ein?
2.1. Oder mit anderen Worten: Wie hoch ist das Risiko hier eine Menge Zeit rein zu stecken und dann in einer Sackgasse zu landen?
3. Mir ist es nicht gelungen irgendeins der MVVM-Samples zum Laufen zu bringen.
3.1. Entweder stimmen die Delarationen zwischen DSharp und Spring nicht (DSharp ist wohl mittlerweile inkompatibel mit Spring?)?
3.2. Oder die intern Properties passen nicht (mehr?) zur Library.Etwa ContactManager:

Delphi-Quellcode:
function TContactDetailsViewModel.GetContact: TContact;
begin
  Result := Item;
end;
Bringt einen "E2029 '[' erwartet" Fehler weil Item mittlerweile eine Array property mit String-Index geworden ist..

Ein paar nicht MVVM Sachen lassen sich compilieren (TreeviewPresenter), haben aber bei einem kurzen Test auch ein seltsames Verhalten an den Tag gelegt (TreeviewPresenter: "Ow" im Edit1 blendet - nicht ganz nachvollziehbar - eine Menge Daten aus?)...

Also grundsätzliche "Status" - Frage?
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#50
  Alt 6. Feb 2015, 15:54
http://www.delphipraxis.net/1286767-post25.html
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 5   « Erste     345   


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 16:50 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