![]() |
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 |
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:
Ein Klick auf Break zeigt dann diesen Callstack:
---------------------------
Debugger Exception Notification --------------------------- Project Explorer.exe raised exception class $C0000096 with message 'privileged instruction at 0x024d37f0'. --------------------------- Break Continue Help ---------------------------
Code:
Was in diese Zeile zeigt:
: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
Delphi-Quellcode:
Am Ende gibts noch Memory Leaks:
//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
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 --------------------------- |
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; |
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; |
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. |
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 ![]()
Delphi-Quellcode:
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.
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. |
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? |
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) |
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:
Bringt einen "E2029 '[' erwartet" Fehler weil Item mittlerweile eine Array property mit String-Index geworden ist..
function TContactDetailsViewModel.GetContact: TContact;
begin Result := Item; end; 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? |
AW: DSharp - Data bindings, MVVM und mehr für Delphi 2010 und höher
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz