Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualStringTree Spalten und Gruppierung (https://www.delphipraxis.net/125132-virtualstringtree-spalten-und-gruppierung.html)

berndn 1. Dez 2008 10:31


VirtualStringTree Spalten und Gruppierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
da ich mich ja mit dem VirtualStringTree beschäftige ist es klar das nun die ganzen Anfänger Fragen kommen.
Ich habe jetzt hier mal den Sourcecode von einem einfachem Beispiel eingefügt sowie einen Screenshot wie es aussieht nach dem man das VirtualStringTree mit dem Button1 gefüllt hat.
Die VW Rubrik zeigt wie es schön wäre jedoch erhalte ich natürlich nicht den Markennamen da er im Abschnitt der daten nicht zugwiesen wird.
Bei Ford klappt es natürlich aber ich möchte vermeiden das in der 1. Spalte der Gruppenname pro Zeile wiederholt wird.
Ideen ?

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TOAutos = class(TObject)
  public
    MarkenName: string;
    Modell: string;
    Farbe: string;
  end;
  TOAutoMarken = class(TOAutos)
  public
  end;

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  daten : TOAutos;
  gruppe : TOAutoMarken;
  node: PVirtualNode;
begin
  gruppe := TOAutoMarken.Create;
  gruppe.MarkenName := 'VW';

  node:=vst.AddChild(nil, gruppe);

  daten := TOAutos.Create;
  with daten do
  begin
    // MarkenName := 'VW';
    Modell := 'Käfer';
    Farbe := 'schwarz';
  end;
  vst.AddChild(node, daten);

  daten := TOAutos.Create;
  with daten do
  begin
    // MarkenName := 'VW';
    Modell := 'Golf';
    Farbe := 'rot';
  end;
  vst.AddChild(node, daten);

  daten := TOAutos.Create;
  with daten do
  begin
    // MarkenName := 'VW';
    Modell := 'Polo';
    Farbe := 'grün';
  end;
  vst.AddChild(node, daten);

  gruppe := TOAutoMarken.Create;
  gruppe.MarkenName := 'Ford';

  node:=vst.AddChild(nil, gruppe);

  daten := TOAutos.Create;
  with daten do
  begin
    MarkenName := 'Ford';
    Modell := 'Cabri';
    Farbe := 'orange';
  end;
  vst.AddChild(node, daten);

  daten := TOAutos.Create;
  with daten do
  begin
    MarkenName := 'Ford';
    Modell := 'Taunus';
    Farbe := 'grau';
  end;
  vst.AddChild(node, daten);

  daten := TOAutos.Create;
  with daten do
  begin
    MarkenName := 'Ford';
    Modell := 'Fiesta';
    Farbe := 'pink';
  end;
  vst.AddChild(node, daten);


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  vst.NodeDataSize:=sizeof(TOAutos);
end;

procedure TForm1.vstDblClick(Sender: TObject);
var
  FocusedNode : PVirtualNode;
  daten : TOAutos;
begin
  FocusedNode := vst.FocusedNode;
  if FocusedNode <> nil then
  begin
    daten := TOAutos(vst.GetNodeData(FocusedNode)^);
    if daten.Modell<> '' then
    begin
      showmessage('Sie haben die Marke: ' + daten.MarkenName +
                  ' Modell: ' + daten.Modell +
                  ' mit der Farbe ' + daten.Farbe +
                  ' gewählt.');
    end;
  end
  else
  begin
    ShowMessage('Bitte vorher einen Eintrag auswählen.');
  end;
end;

procedure TForm1.vstFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  daten : TOAutos;
begin
  daten:=TOAutos(vst.GetNodeData(node)^);
  daten.free;
end;

procedure TForm1.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  daten: TOAutos;
begin
  daten := TOAutos(vst.GetNodeData(node)^);
  case Column of
    0: celltext:=daten.MarkenName;
    1: celltext:=daten.Modell;
    2: celltext:=daten.Farbe;
  end;

end;

end.

berndn 1. Dez 2008 10:47

Re: VirtualStringTree Spalten und Gruppierung
 
Es geht natürlich in dem ich in der Klasse TOAutos einfach einen Eintrag subMarkenName verwende. Aber eigentlich liegt der 'Fehler' ja hier:

Delphi-Quellcode:
procedure TForm1.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  daten: TOAutos;
begin
  daten := TOAutos(vst.GetNodeData(node)^);
  case Column of
    0: celltext:=daten.MarkenName;
    1: celltext:=daten.Modell;
    2: celltext:=daten.Farbe;
  end;

end;
Schmeisse ich hier die 0 raus habe ich in der 1. Spalte ( column[0] ) nur noch node als Eintrag was irgendwie auch Sinn macht :wink:

itashadow 1. Dez 2008 10:58

Re: VirtualStringTree Spalten und Gruppierung
 
Zitat:

Zitat von berndn
Es geht natürlich in dem ich in der Klasse TOAutos einfach einen Eintrag subMarkenName verwende. Aber eigentlich liegt der 'Fehler' ja hier:

Delphi-Quellcode:
procedure TForm1.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  daten: TOAutos;
begin
  daten := TOAutos(vst.GetNodeData(node)^);
  case Column of
    0: celltext:=daten.MarkenName;
    1: celltext:=daten.Modell;
    2: celltext:=daten.Farbe;
  end;

end;
Schmeisse ich hier die 0 raus habe ich in der 1. Spalte ( column[0] ) nur noch node als Eintrag was irgendwie auch Sinn macht :wink:

Delphi-Quellcode:
procedure TForm1.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  daten: TOAutos;
begin

  daten := TOAutos(vst.GetNodeData(node)^);

  case Column of
    0: if vst.GetNodeLevel(node) = 0 then celltext:=daten.MarkenName;
    1: celltext:=daten.Modell;
    2: celltext:=daten.Farbe;
  end;

end;
dürfte funktionieren

berndn 1. Dez 2008 11:12

Re: VirtualStringTree Spalten und Gruppierung
 
Danke. Die Idee war richtig aber musste ich noch ergänzen um natürlich die Beschriftung 'node' für die Subitems zu unterdrücken:

Delphi-Quellcode:
procedure TForm1.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  daten: TOAutos;
begin
  daten := TOAutos(vst.GetNodeData(node)^);
  case Column of
    { 0: celltext:=daten.MarkenName; }
    0: if vst.GetNodeLevel(node) = 0 then celltext:=daten.MarkenName else celltext:='';
    1: celltext:=daten.Modell;
    2: celltext:=daten.Farbe;
  end;

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz