Einzelnen Beitrag anzeigen

lowmax_5

Registriert seit: 9. Mai 2003
Ort: Münster, NRW
258 Beiträge
 
Delphi 11 Alexandria
 
#1

TVirtualStringTree mit TObjectList

  Alt 28. Feb 2019, 23:57
Hallo,

ich stehe grad etwas auf dem Schlauch:
Ich möchte in einem TVirtualStringTree eine TObjectList anzeigen lassen die in etwa so aussieht:

Zeitraum Spalte1 Spalte2 Spalte 3
01/2019
==> Zeile1 Wert1 Wert2 Wert3
==> Zeile2 Wert3 Wert4 Wert5

02/2019
==> Zeile1 Wert6 Wert7 Wert8
==> Zeile9 Wert10 Wert11 Wert12


Als Ergebnis kommt aber nur folgendes raus:

Zeitraum Spalte1 Spalte2 Spalte 3
01/2019
==> Zeile1 Wert1 Wert2 Wert3
==> Zeile2 Wert3 Wert4 Wert5

02/2019
==> Node Node Node Node
==> Node Node Node Node

Was läuft das falsch? Wird das Object korrekt an ..GetText übergeben?


Die Objectlist ist wie folgt definiert:

Code:
unit uMyTypes;

interface

uses System.Classes,System.Generics.Collections;

type

  TDetailClass = class
   private
    FWert1: String;
    FCaption: String;
    FWert2: String;
    FWert3: String;
    procedure SetCaption(const Value: String);
    procedure SetWert1(const Value: String);
    procedure SetWert2(const Value: String);
    procedure SetWert3(const Value: String);
   public
    property Caption: String read FCaption write SetCaption;
    property Wert1: String read FWert1 write SetWert1;
    property Wert2: String read FWert2 write SetWert2;
    property Wert3: String read FWert3 write SetWert3;
  end;

  TDataClass = class
    private
    FZeitraum: String;
    FDetail1: TDetailClass;
    FDetail2: TDetailClass;
    procedure SetZeitraum(const Value: String);
    procedure SetDetail1(const Value: TDetailClass);
    procedure SetDetail2(const Value: TDetailClass);
    public
    constructor Create;
    destructor destroy;
    property Zeitraum: String read FZeitraum write SetZeitraum;
    property Detail1: TDetailClass read FDetail1 write SetDetail1;
    property Detail2: TDetailClass read FDetail2 write SetDetail2;
  end;

  PDataClass = ^TDataClass;

  TDataLst = TObjectList<TDataClass>;

implementation

{ TDetail }

procedure TDetailClass.SetCaption(const Value: String);
begin
  FCaption := Value;
end;

procedure TDetailClass.SetWert1(const Value: String);
begin
  FWert1 := Value;
end;

procedure TDetailClass.SetWert2(const Value: String);
begin
  FWert2 := Value;
end;

procedure TDetailClass.SetWert3(const Value: String);
begin
  FWert3 := Value;
end;

{ TData }



constructor TDataClass.Create;
begin
    FDetail1 := TDetailClass.Create;
    FDetail2 := TDetailClass.Create;
end;

destructor TDataClass.destroy;
begin
  FDetail1.Free;
  FDetail2.Free;
end;

procedure TDataClass.SetDetail1(const Value: TDetailClass);
begin
  FDetail1 := Value;
end;

procedure TDataClass.SetDetail2(const Value: TDetailClass);
begin
  FDetail2 := Value;
end;

procedure TDataClass.SetZeitraum(const Value: String);
begin
  FZeitraum := value;
end;


end.








Code:
procedure TForm5.Button10Click(Sender: TObject);
var
  vtc: TVirtualTreeColumn;
  vnHead: PVirtualNode;
  I: Integer;
  Data: TDataClass;
begin
  vstSP.Header.Options := vstSP.Header.Options + [hoVisible];


  vtc:= vstSP.Header.Columns.Add;
  vtc.Text:= 'Zeitraum';
  vtc.Width := 150;

  vtc:= vstSP.Header.Columns.Add;
  vtc.Text:= 'Wert1';
  vtc.Width := 100;

  vtc:= vstSP.Header.Columns.Add;
  vtc.Text:= 'Wert2';
  vtc.Width := 100;

  vtc:= vstSP.Header.Columns.Add;
  vtc.Text:= 'Wert3';
  vtc.Width := 100;


  vstSP.NodeDataSize:=SizeOf(TDataClass);

  vstSP.BeginUpdate;

  Data := TDataClass.Create;
  DataLst.Add(Data);
  Data.Zeitraum := '01/2019';
  vnHead:= AddVSTStructureHeadClass(vstSP, nil, TDataClass(DataLst[0]));

  Data.Detail1.Caption:='Zeile1:';
  Data.Detail1.Wert1 := 'Det1 - Wert1';
  Data.Detail1.Wert2 := 'Det1 - Wert2';
  Data.Detail1.Wert3 := 'Det1 - Wert3';
  AddVSTStructureDetailClass(vstSP, vnHead, TDataClass(DataLst[0]));

  Data.Detail2.Caption:='Zeile2:';
  Data.Detail2.Wert1 := 'Det2 - Wert1';
  Data.Detail2.Wert2 := 'Det2 - Wert2';
  Data.Detail2.Wert3 := 'Det2 - Wert3';
  AddVSTStructureDetailClass(vstSP, vnHead, TDataClass(DataLst[0]));



  //Daten Fuellen2
  Data := TDataClass.Create;
  DataLst.Add(Data);
  Data.Zeitraum := '02/2019';
  vnHead:= AddVSTStructureHeadClass(vstSP, nil, TDataClass(DataLst[1]));


  Data.Detail1.Caption:='Zeile1:';
  Data.Detail1.Wert1 := 'Det3 - Wert1';
  Data.Detail1.Wert2 := 'Det3 - Wert2';
  Data.Detail1.Wert3 := 'Det3 - Wert3';
  AddVSTStructureDetailClass(vstSP, vnHead, TDataClass(DataLst[1]));

  Data.Detail2.Caption:='Zeile2:';
  Data.Detail2.Wert1 := 'Det4 - Wert1';
  Data.Detail2.Wert2 := 'Det4 - Wert2';
  Data.Detail2.Wert3 := 'Det4 - Wert3';
  AddVSTStructureDetailClass(vstSP, vnHead, TDataClass(DataLst[1]));

  vstSP.EndUpdate;

  vstSP.FullExpand;

end;



procedure TForm5.vstSPFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  Data: PDataClass;
begin
  Data := vstSP.GetNodeData(Node);
  if Assigned(Data) then
  begin
    Data := nil;
  end;
end;


procedure TForm5.vstSPGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
  Data: PDataClass;

begin
  Data := vstSP.GetNodeData(Node);


  if vstSP.GetNodeLevel(Node)=0 then
  //if Node.Index=0 then
  begin
    case Column of
      0: CellText := Data.Zeitraum;
      1: CellText := '';
      2: CellText := '';
      3: CellText := '';
    end;
  end;

 if vstSP.GetNodeLevel(Node)=1 then
 //if Node.Index=1 then
  begin
    if vstSP.AbsoluteIndex(Node)=1 then
    begin
      case Column of
        0: CellText := Data.Detail1.Caption;
        1: CellText := Data.Detail1.Wert1;
        2: CellText := Data.Detail1.Wert2;
        3: CellText := Data.Detail1.Wert3;
      end;
    end;

    if vstSP.AbsoluteIndex(Node)=2 then
  //  if Node.Index=2 then
    begin
      case Column of
        0: CellText := Data.Detail2.Caption;
        1: CellText := Data.Detail2.Wert1;
        2: CellText := Data.Detail2.Wert2;
        3: CellText := Data.Detail2.Wert3;
      end;
    end;

  end;



end;
  Mit Zitat antworten Zitat