AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi DSharp Binding zeitweise deaktivieren?

DSharp Binding zeitweise deaktivieren?

Ein Thema von jus · begonnen am 25. Jun 2019 · letzter Beitrag vom 26. Jun 2019
Antwort Antwort
jus

Registriert seit: 22. Jan 2005
285 Beiträge
 
Delphi 2007 Professional
 
#1

DSharp Binding zeitweise deaktivieren?

  Alt 25. Jun 2019, 00:23
Hallo,

ich setze die Binding Funktion von DSharp ein, um die View Komponente TreeViewPresenter an ein ViewModel zu binden.
Auf der Form/View Seite:
Delphi-Quellcode:
procedure TViewForm.FormCreate(Sender: TObject);
begin
//...
  ViewModel := TViewModel.Create;
  ViewModel.LoadItemsFromDatabase;
  binding := TBinding.Create(ViewModel, 'TreeViewPresenter1Items', TreeViewPresenter1, 'View.ItemsSource');
end;
In ViewModel.pas sieht es dann etwa so aus:
Delphi-Quellcode:

type
  TDataItem = Class
  private
    FValue1: Integer;
  public
  property Value1: Integer read FValue1 write FValue1;
  end;

  TViewModel = Class
  private
    FTreeViewPresenter1Items: IObjectList;
  public
    constructor Create;
    procedure LoadItemsFromDatabase;
  property TreeViewPresenter1Items: IObjectList read FTreeViewPresenter1Items;
  end;

implementation

procedure TViewModel.LoadItemsFromDatabase;
var
  Item: TDataItem;
  i: Integer;
begin
  FTreeViewPresenter1Items.Clear;
  // lade ca. 2000 Einträge aus einer Datenbanktabelle

  for i := 0 to 2000 do
  begin
    Item := TDataItem.Create;
    //Übertrage Zeile für Zeile die Einträge aus der Tabelle in die "FTreeViewPresenter1Items" Liste......
    FTreeViewPresenter1Items.Add(Item);
  end;
end;
Das Binding funktioniert einwandfrei. Doch das Problem beginnt damit, dass von Zeit zu Zeit die FTreeViewPresenter1Items Liste neu aus der Datenbank mit der Methode TViewModel.LoadItemsFromDatabase eingelesen werden muß. In meinem aktuell Fall sind es ca. 2000 Zeile aus einer Tabelle. Dann dauert es wesentlich länger als wenn das Binding nicht nicht wäre. Ohne Binding benötigt die for-Schleife von der Methode TViewModel.LoadItemsFromDatabase <1ms mit Binding ca. 7Sekunden.
Ich habe versucht in der View das Binding.Enabled während auf der Aktualisierung auf FALSE setzen, dies hat zwar leichte Verbesserung von ca.1-2 Sekunden eingespart. Kann man zeitweise das Binding komplett deaktiveren?
Was wäre die Best Practice in so einem Falle?

Lg,
jus

Geändert von jus (25. Jun 2019 um 00:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.531 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: DSharp Binding zeitweise deaktivieren?

  Alt 25. Jun 2019, 08:53
Das Binding, was du erstellt hast, sorgt nur dafür, dass die IObjectList Instanz an den TVP gehangen wird - sonst nichts.
Dass das neu befüllen so lange dauert, liegt daran, dass der TVP auf jedes OnChanged reagiert (~2000 mal caRemoved beim .Clear und ~2000 mal caAdded beim .Add)

Bei solchen Aktionen bietet es sich an, entweder BeginUpdate/EndUpdate auf dem TVP aufzurufen, oder View.ItemsSource vorher ab- und nachher wieder anzuhängen.
Einen Mechanismus, wie man ihn von TDataSet kennt, indem man diesem sagen kann, dass sämtliche angebundenen UI Controls nicht auf Änderungen reagieren sollen, gibt es bei einer Liste nicht.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (25. Jun 2019 um 08:56 Uhr)
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
285 Beiträge
 
Delphi 2007 Professional
 
#3

AW: DSharp Binding zeitweise deaktivieren?

  Alt 25. Jun 2019, 17:18
Das Binding, was du erstellt hast, sorgt nur dafür, dass die IObjectList Instanz an den TVP gehangen wird - sonst nichts.
Dass das neu befüllen so lange dauert, liegt daran, dass der TVP auf jedes OnChanged reagiert (~2000 mal caRemoved beim .Clear und ~2000 mal caAdded beim .Add)

Bei solchen Aktionen bietet es sich an, entweder BeginUpdate/EndUpdate auf dem TVP aufzurufen, oder View.ItemsSource vorher ab- und nachher wieder anzuhängen.
Einen Mechanismus, wie man ihn von TDataSet kennt, indem man diesem sagen kann, dass sämtliche angebundenen UI Controls nicht auf Änderungen reagieren sollen, gibt es bei einer Liste nicht.
Hallo Stefan, vielen Dank für die prompte Antwort. ehhm.... wie meinst du das mit abhängen? Oder wie macht man das Abhängen? Meinst du sowas wie binding.free?

lg,
jus
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.531 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: DSharp Binding zeitweise deaktivieren?

  Alt 25. Jun 2019, 23:01
Auf nil setzen...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
285 Beiträge
 
Delphi 2007 Professional
 
#5

AW: DSharp Binding zeitweise deaktivieren?

  Alt 26. Jun 2019, 13:40
Ok, vielen Dank Stefan! Jetzt funktioniert es wesentlich schneller!

lg,
jus
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf