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 4 von 5   « Erste     234 5      
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 08:33 Uhr)
 
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#31
  Alt 10. Jul 2012, 17:05
Danke für deinen Report.

Hier treffen leider 2 Bugs zusammen:
Der eine liegt in der ObjAuto.pas begründet. Dort wird nicht berücksichtigt, dass Int64 besonders behandelt wird.
Daran kann ich nicht sehr viel machen. Inzwischen werden schon genug Bugs durch Runtime Patching ausgebügelt.

Der zweite Bug liegt in meiner Implementierung ab XE2 (auch ich hab nicht auf die Int64 Sonderbehandlung unter x86 geachtet) und kommt ungeachtet des consts oder nicht. Dies werde ich sobald wie möglich beheben.

Soll heißen: Int64 und const wird nicht funktionieren, ohne const bis XE ja, ab XE2 (32-bit) nachdem ich es gefixt habe.
Stefan
  Mit Zitat antworten Zitat
BlackSeven

 
Delphi XE7 Professional
 
#32
  Alt 11. Jul 2012, 07:52
Alles klar. Danke für die Info.
  Mit Zitat antworten Zitat
BlackSeven

 
Delphi XE7 Professional
 
#33
  Alt 9. Aug 2012, 07:43
Um nochmals auf DSharp und speziell auf MVVM zurückzukommen, werfe ich mal folgende Frage in den Raum:

Auf einer Form befindet sich eine Paintbox und ich möchte auf die "OnPaint" sowie "OnMouseMove" Ereignisse reagieren bzw. auf das Canvas zugreifen.
Löse ich das über einen speziellen "Presenter" oder wie ist dabei die beste Herangehensweise?
  Mit Zitat antworten Zitat
BlackSeven

 
Delphi XE7 Professional
 
#34
  Alt 16. Aug 2012, 08:26
Ich schätze mal, für die Behandlung von Events müssen in DSharp "Commands" implementiert werden.
Oder sehe ich das falsch?
  Mit Zitat antworten Zitat
BlackSeven

 
Delphi XE7 Professional
 
#35
  Alt 6. Okt 2012, 21:56
Hallo Stefan,

folgender, unter DXE2 (Zielplatform: Win64) kompilierter Code löst eine Exception aus:
First chance exception at $0000000000686EE1. Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'. Process Project1.exe

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private

    FClick: TNotifyEvent;

    function GetClick: TNotifyEvent;
    procedure SetClick(const AValue: TNotifyEvent);

  public

    property Click: TNotifyEvent read GetClick write SetClick;

  end;

var
  Form1: TForm1;

implementation

uses

  DSharp.Bindings;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

  TBinding.Create(Button1, 'OnClick', Self, 'Click');

end;

function TForm1.GetClick: TNotifyEvent;
begin

  Result := FClick;

end;

procedure TForm1.SetClick(const AValue: TNotifyEvent);
begin

  FClick := AValue;

end;

end.

Der Fehler tritt in der Unit "DSharp.Core.Expressions" auf:

Delphi-Quellcode:
procedure TPropertyExpression.SetValue(const Value: TValue);
var

...

begin

...

  if FIndex = -1 then
  begin
    
    if LProperty.IsWritable then
    begin
      LProperty.SetValue(LInstance.AsPointer, LValue); <--- hier
    end;

  end

...
System.Rtti.Invoke -> RawInvoke(CodeAddress, @block);
Angehängte Dateien
Dateityp: zip Test.zip (2,9 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#36
  Alt 31. Okt 2012, 10:14
Kurze Rückmeldung zu diesem Bug.

Mal wieder ein Fehler in Delphi - dort werden unter x64 bei Methodenaufrufen Parameter vom Typ tkMethod falsch behandelt (auch in XE3 noch existent).

Auch ohne DSharp nachstellbar:

Delphi-Quellcode:
var
  ctx: TRttiContext;
begin
  ctx.GetType(TForm1).GetMethod('SetClick').Invoke(Self, [TValue.From<TNotifyEvent>(Button1Click)]);
end
Mal sehen, ob ich das patchen kann.
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

 
Delphi XE2 Professional
 
#37
  Alt 21. Jan 2013, 17:31
@Stevie: Gibt es irgendwo ein Tutorial bzw. eine Übersicht was du alles eingebaut hast und was so alles geht? Ich nutze (bisher) wahrscheinlich nur 0,1% (eigentlich nur IEvent<T>) von DSharp
Thomas
  Mit Zitat antworten Zitat
Jens01
 
#38
  Alt 21. Jan 2013, 19:30
@Stevie: Gibt es irgendwo ein Tutorial bzw. eine Übersicht was du alles eingebaut hast und was so alles geht? Ich nutze (bisher) wahrscheinlich nur 0,1% (eigentlich nur IEvent<T>) von DSharp
Guck einfach mal die Samples durch.
  Mit Zitat antworten Zitat
Marco Erdmann

 
Delphi XE3 Professional
 
#39
  Alt 28. Feb 2013, 12:26
Hallo Zusammen,

ich bin neu in diesem Forum und mache gerade meine ersten Gehversuche mit DSharp. Ich habe versucht das VirtualTree-Beispiel mit dem QuantumGrid von DevExpress nachzubauen und bin dabei auf ein Problem gestoßen: Die Spalten-Captions im Grid werden noch korrekt gesetzt, aber die Zeilen werden niemals angezeigt, obwohl die Anzahl Zeilen durchaus richtig abgefragt wird. Ich vermute, dass ich noch einen Fehler im Template habe. Die Delphi-Version ist XE3 Update 2 und das Grid ist ein TcxGridTableView.

Die Klasse in meiner IList sieht so aus:
Delphi-Quellcode:
  
TEmployee = class(TPersistent)
  private
    FFirstName: string;
    FID: Integer;
    FName: string;
  public
    constructor Create(AID: Integer; const AName, AFirstName: string);
    property FirstName: string read FFirstName write FFirstName;
    property ID: Integer read FID write FID;
    property Name: string read FName write FName;
  end;
Das TDataTemplate sieht dann foglendermaßen aus:
Delphi-Quellcode:
  
TEmployeeTemplate = class(TDataTemplate)
  public
    function GetValue(const Item: TObject; const ColumnIndex: Integer): TValue; override;
    function GetTemplateDataClass: TClass; override;
  end;
Delphi-Quellcode:
function TEmployeeTemplate.GetTemplateDataClass: TClass;
begin
  Result := TEmployee;
end;

function TEmployeeTemplate.GetValue(const Item: TObject; const ColumnIndex: Integer): TValue;
begin
  case ColumnIndex of
    (-1), 0: Result := TEmployee(Item).ID;
    1: Result := TEmployee(Item).Name;
    2: Result := TEmployee(Item).FirstName;
  end;
end;
Ich bin noch nicht soweit in den Code eingestiegen, um genau zu verstehen, an welcher Stelle die Sache schiefgeht. Muss ich eventuell weitere virtuelle Methoden von TDataTemplate überschreiben? Ein Fingerzeig in die richtige Richtung wäre sehr nett.

Vielen Dank schonmal.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

 
Delphi 10.1 Berlin Enterprise
 
#40
  Alt 28. Feb 2013, 15:04
Hallo Marco,

ich denke, der Fallstrick wird gewesen sein, dass du das ItemTemplate direkt zugewiesen und somit das built-in DataTemplate überschrieben hast.
Dieses wird bei einem Presenter immer erstellt und beinhaltet die Standardimplementierungen für z.B. GetItemCount und GetItem.

Du musst somit die RegisterDataTemplate Methode nutzen, um dein Template für TEmployee dort zu nutzen:

Delphi-Quellcode:

GridViewPresenter1.View.ItemTemplate.RegisterDataTemplate(TEmployeeTemplate.Create);
Über diese Funktionalität kannst du unterschiedliche Templates in einem Presenter benutzen (wenn du z.B. eine Liste mit unterschiedlichen Klassen oder eine Hierarchie hast)
Stefan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 14:37 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