AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi In TreeViewPresenter einen einzelnen Node von VirtualStringTree updaten

In TreeViewPresenter einen einzelnen Node von VirtualStringTree updaten

Ein Thema von jus · begonnen am 11. Jun 2019
Antwort Antwort
jus

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

In TreeViewPresenter einen einzelnen Node von VirtualStringTree updaten

  Alt 11. Jun 2019, 18:46
Hallo,

ich stelle diese Lösung für die Leute rein, die wie ich eher einen eingeschränkten Wissensstand in Delphi haben , und da ich letzte Woche ziemlich lange daran herumprobiert habe. Vielen Dank noch an Stefan Glienke für seinen Support, dass er mich in die richtige Richtung gelenkt hat. Wie einige von euch mitgebekommen haben, bin ich gerade dabei die TreeViewPresenter(TVP) Komponente von DSharp als zusätzliche Zwischenschicht zur VirtualStringTree(VST) in meinen Projekten einzubauen, wo ich bisher nur die VST verwendet habe. Damit ist es für mich leichter die GUI von der Businesslogik zu trennen.

Ich stand vor der Problemstellung, dass ich bei Änderungen von Daten im Datenobjekt von einem VST-Node nur einen betroffenen Node neuzeichnen wollte. Dies war bisher bei einer VST Komponente ohne Probleme mit InvalidateNode(Node: PVirtualNode) möglich. Doch wie macht man das bei einer VST mit vorgeschaltenem TVP? Kurz vorweg die Lösung steckt eigentlich bereits in DSharp mitgelieferten \dsharp\Samples\VirtualTreeviewSample.dproj Beispiel und wurde auch in Stefan Glienke Blog angedeutet. So, genug geredet anbei der Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, DSharp.Windows.ColumnDefinitions,
  DSharp.Windows.CustomPresenter, DSharp.Windows.TreeViewPresenter, VirtualTrees
  , Spring
  , Spring.Collections
  , DSharp.Core.DataTemplates
  , Vcl.StdCtrls
  , DSharp.Bindings.Notifications
  , DSharp.Core.PropertyChangedBase
  ;

type
  TForm1 = class(TForm)
    VirtualStringTree1: TVirtualStringTree;
    TreeViewPresenter1: TTreeViewPresenter;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    Items: IList<TObject>;
  public
    { Public-Deklarationen }
  end;

  TNamedItem = class(TPropertyChangedBase)
  private
    fName: string;
    FValue: Integer;
    FItems: IList<TObject>;
    procedure SetValue(aValue: Integer);
  public
    constructor Create(const name: string);
    property Name: string read fName write fName;
    property Value: Integer read FValue write SetValue;
    property Items: IList<TObject> read FItems write FItems;
  end;

  TItemTemplate = class(TDataTemplate<TNamedItem>)
    function GetItems(const Item: TNamedItem): IObjectList; override;
    function GetText(const Item: TNamedItem; const ColumnIndex: Integer): string; override;
  end;

var
  Form1: TForm1;

implementation

uses DSharp.Collections.ObservableCollection;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  RootItem: TNamedItem;
  SubItem: TNamedItem;
begin
  RootItem := TNamedItem(items[0]);
  SubItem := RootItem.Items[0] as TNamedItem;
  SubItem.Value := RootItem.Value + 1;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  folder1, folder2: TNamedItem;
begin
  items := TObservableCollection<TObject>.Create();
  folder1 := TNamedItem.Create('Folder 1');
  folder1.Value := 1;
  folder2 := TNamedItem.Create('Folder 1.1');
  folder2.Items.AddRange([TNamedItem.Create('File 1'), TNamedItem.Create('File 2')]);
  folder1.Items.Add(folder2);
  items.Add(folder1);

  folder1 := TNamedItem.Create('Folder 2');
  items.Add(folder1);

  TreeViewPresenter1.View.ItemTemplate := TItemTemplate.Create;
  TreeViewPresenter1.View.ItemsSource := items as IObjectList;
end;

{ TNamedItem }

constructor TNamedItem.Create(const name: string);
begin
  inherited Create;
  fName := name;
  Fitems := TObservableCollection<TObject>.Create(); // auch in den Unterknoten muß die Liste mit TObservableCollection<TObject>.Create() erzeugt werden!
end;

procedure TNamedItem.SetValue(aValue: Integer);
begin
  if FValue = aValue then exit;

  FValue := aValue;
  NotifyOfPropertyChange('Value');
end;

{ TItemTemplate }

function TItemTemplate.GetItems(const Item: TNamedItem): IObjectList;
begin
  if Item.Items.Count>0 then
    Result := TNamedItem(Item).Items as IObjectList
  else
    Result := nil;
end;

function TItemTemplate.GetText(const Item: TNamedItem;
  const ColumnIndex: Integer): string;
begin
  case ColumnIndex of
    -1, 0: Result := Item.Name;
    1: Result := IntToStr(Item.Value);
  end;
end;

end.

lg,
jus

Geändert von jus (11. Jun 2019 um 18:53 Uhr)
  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 21:28 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