Delphi-PRAXiS
Seite 5 von 5   « Erste     345   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher (https://www.delphipraxis.net/164573-dsharp-data-bindings-mvvm-und-mehr-fuer-delphi-2010-und-hoeher.html)

Marco Erdmann 28. Feb 2013 15:16

AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
 
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

TiGü 4. Mär 2013 12:34

AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
 
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! :-D

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  
---------------------------

TiGü 4. Mär 2013 12:36

AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
 
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;

TiGü 4. Mär 2013 12:45

AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
 
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;

TiGü 4. Mär 2013 13:35

AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
 
Boah, ist das alles wegabstrahiert.
Man muss ja komplett umdenken! :shock:

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.

Stevie 4. Mär 2013 15:32

AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
 
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.

CarlAshnikov 21. Mär 2014 06:45

AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
 
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?

Stevie 21. Mär 2014 08:32

AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
 
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)

Whookie 6. Feb 2015 14:33

AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
 
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?

mkinzler 6. Feb 2015 14:54

AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
 
http://www.delphipraxis.net/1286767-post25.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.
Seite 5 von 5   « Erste     345   

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