Einzelnen Beitrag anzeigen

jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#25

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 27. Mär 2019, 23:50
So zur späten Stunde noch eine neue Version mit einer kleinen Automatisierung beim Verknüpfen von VST mit TObjectList, indem ich eine neue Methode mit TBindVSTToObjectListHelperClass.BindVST einführe.

Die Code in TForm1.Button1Click ist ein bisschen kürzer geworden und TForm1.vstInitNode wurde entfernt.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Contnrs, StdCtrls, VirtualTrees, VSTBindObjectListUnit;

type
  TNodeDataClass = class
  private
    FSpalte1: string;
    FSpalte2: string;
    FSpalte3: Integer;
  public
  property Spalte1: string read FSpalte1 write FSpalte1;
  property Spalte2: string read FSpalte2 write FSpalte2;
  property Spalte3: Integer read FSpalte3 write FSpalte3;
  end;

  TForm1 = class(TForm)
    vst: TVirtualStringTree;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
  private
    { Private-Deklarationen }
    DataList: TObjectList;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  TBindVSTToObjectListHelperClass.BindVST(VST,DataList);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  NodeData: TNodeDataClass;
begin
  DataList := TObjectList.Create;

  for i := 0 to 3 do
  begin
    NodeData := TNodeDataClass.Create;
    NodeData.Spalte1 := IntToStr(i);
    NodeData.Spalte2 := 'Spalte '+IntToStr(i);
    NodeData.Spalte3 := i;
    DataList.Add(NodeData);
  end;
end;

procedure TForm1.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  data: PTreeData;
begin
  data:= Sender.GetNodeData(Node);
  if not Assigned(data^.FObject) then Exit;

  case Column of
    0: CellText := TNodeDataClass(data^.FObject).FSpalte1;
    1: CellText := TNodeDataClass(data^.FObject).FSpalte2;
    2: CellText := IntToStr(TNodeDataClass(data^.FObject).FSpalte3);
  end;
end;

end.
Dafür wurde das Verknüpfen in VSTBindObjectListUnit.pas ausgelagert.
Delphi-Quellcode:
unit VSTBindObjectListUnit;

interface

uses Contnrs, VirtualTrees;

type

  PTreeData = ^TTreeData;
  TTreeData = record
    FObject : TObject;
  end;

  TBindVSTToObjectListHelperClass = class
  private
    class var fObList: TObjectList;
    class var fVST: TVirtualStringTree;
    class procedure VstInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
  public
    class procedure BindVST(AVST: TVirtualStringTree; AObList: TObjectList);
  end;

implementation

{ TBindVSTToObjectListHelperClass }

class procedure TBindVSTToObjectListHelperClass.BindVST(AVST: TVirtualStringTree; AObList: TObjectList);
begin
  if not assigned(AObList) then exit;
  fObList := AObList;
  fVST := AVST;
  fVST.Clear;
  fVST.NodeDataSize := SizeOf(TTreeData);
  fVST.OnInitNode := TBindVSTToObjectListHelperClass.VstInitNode;
  fVST.RootNodeCount := fObList.Count;
end;

class procedure TBindVSTToObjectListHelperClass.VstInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  data: PTreeData;
begin
  data := fVST.GetNodeData(Node);
  data^.FObject := fObList[Node.Index];
end;

end.
Wie schon vorher erwähnt für die Leute die noch ein Delphi 2007 im Einsatz haben.

Lg,
jus
Angehängte Dateien
Dateityp: rar VSTObjectList.rar (3,0 KB, 10x aufgerufen)

Geändert von jus (27. Mär 2019 um 23:56 Uhr)
  Mit Zitat antworten Zitat