Thema: Delphi Virtual TreeView

Einzelnen Beitrag anzeigen

generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#17

Re: Virtual TreeView

  Alt 26. Apr 2004, 10:18
der vst ist um einiges schnell als der treeview von windows.

der trick ist die statische speicherverwaltung.
erstell mal ein form, ein vst drauf, 4 spalten

um mit den vst zu arbeiten muss du dir erstmal ein record erstellen welches dann spaeter die daten halten soll.
desweiteren brauchst du einen zeiger auf deine daten.

Delphi-Quellcode:
type
  pVstDaten = ^rVstDaten;
  rVstDaten = Record
    spalte1, spalte2, spalte3 : String;
  end;
nun muss du den vst noch mitteilen wie gross deine daten sind.
das geht am besten im form.create

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  VirtualStringTree1.NodeDataSize:=sizeof(rVstDaten);
end;
wenn jetzt ein knoten hinzugefügt wird weiss der vst wieviel platz er jedesmal allocen muss.
um den tree zu füllen machst du folgendes:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
    aktueller_knoten : PVirtualNode;
    Daten_zum_knoten : pVstDaten;
begin
  // u.a. neuzeichnen verhindern
  VirtualStringTree1.BeginUpdate;
  for i:=0 to 1000 do
  begin
    aktueller_knoten:=VirtualStringTree1.AddChild(nil);
    Daten_zum_knoten:=VirtualStringTree1.GetNodeData(aktueller_knoten);

    Daten_zum_knoten.zeile:=i;
    Daten_zum_knoten.spalte1:='Das ist der Text Spalte: 1 Zeile:'+inttostr(i);
    Daten_zum_knoten.spalte2:='Das ist der Text Spalte: 2 Zeile:'+inttostr(i);
    Daten_zum_knoten.spalte3:='Das ist der Text Spalte: 3 Zeile:'+inttostr(i);
  end;
  // wieder zeichnen lassen;
  VirtualStringTree1.EndUpdate;
end;

da baum zeigt jetzt erstmal nur "node" als text an.
es gibt ein ereignis "ongettext"
dort gibts du den text zurueck der im knoten angezeigt werden soll.
hat den vorteil das du die daten beliebig aufbereiten kannst.

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);

var Daten_zum_knoten : pVstDaten;
begin
  Daten_zum_knoten:=VirtualStringTree1.GetNodeData(node);

  if TextType=ttNormal then
  begin
    case Column of
      0: CellText:=Daten_zum_knoten.spalte1;
      1: CellText:=Daten_zum_knoten.spalte2;
      2: CellText:=Daten_zum_knoten.spalte3;
      3: celltext:='Nun die Dynamische Spalte Nummer 4 mit Zeile:'+IntToStr(Daten_zum_knoten.zeile);
    end;
  end;
end;
so das sollte es sein.
  Mit Zitat antworten Zitat