Delphi-PRAXiS
Seite 1 von 2  1 2      

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 VirtualTreeView - Anfängerhilfe (https://www.delphipraxis.net/98006-virtualtreeview-anfaengerhilfe.html)

oghma 20. Aug 2007 16:22


VirtualTreeView - Anfängerhilfe
 
Hallo!

Ich hab gerade VirtualTreeView entdeckt und möchte es gerne in meinem aktuellen Projekt verwenden. Zum Einarbeiten hab ich dieses Turorial verwendet: http://www.dsdt.info/tutorials/virtualtreeview/

Ich möchte jetzt den View in TabellenForm.
Dazu hab ich mal folgenden Typ angelegt:
Delphi-Quellcode:
PTreeData = ^TTreeData;
TTreeData = record
  id: integer;
  bezeichnung: String;
end;
Den VirtualStringTree füll ich so:
Delphi-Quellcode:
procedure TfUebersicht.Button6Click(Sender: TObject);
var  TreeData: TTreeData;
begin
  VST.NodeDataSize:=SizeOf(TTreeData);
  VST.BeginUpdate;
  TreeData.id:=1;
  TreeData.bezeichnung:='Erster Knoten';
  AddVSTStructure(VST,nil,TreeData);
  TreeData.id:=2;
  TreeData.bezeichnung:='Zweiter Knoten';
  AddVSTStructure(VST,nil,TreeData);
  VST.EndUpdate;
end;
und die GetText-Methode schaut so aus:
Delphi-Quellcode:
procedure TfUebersicht.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  Data: PTreeData;
begin
  Data:=VST.GetNodeData(Node);
  case Column of
    0: CellText := inttostr(Data.id);
    1: CellText := Data.bezeichnung;
  end;
end;
Die ID wird korrekt angezeigt. Das Bezichnung-Feld bleibt leer. Wenn ich anstatt dem String-Feld, ein zweiter Integer-Feld verwende, dann steht in jeder Zeile 0.

Kann mir vielleicht irgendwer einen Hinweis geben, wo der Fehler liegen könnte?

Danke, Oghma

DeddyH 20. Aug 2007 16:54

Re: VirtualTreeView - Anfängerhilfe
 
Versuch es mal so:
Delphi-Quellcode:
case Column of
    0: CellText := inttostr(Data^.id);
    1: CellText := Data^.bezeichnung;
  end;

Hawkeye219 20. Aug 2007 17:09

Re: VirtualTreeView - Anfängerhilfe
 
Herzlich willkommen in der Delphi-PRAXiS, Oghma!

Ich vermute den Fehler in deiner Anpassung der Routine AddVSTStructure. Sie sollte bei dir etwa so aussehen:

Delphi-Quellcode:
function AddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
  ARecord: TTreeData): PVirtualNode;
var
  Data: PTreeData;
begin
  Result:=AVST.AddChild(ANode);
  Data:=AVST.GetNodeData(Result);
  AVST.ValidateNode(Result, False);
  Data^ := ARecord;
{alternativ:
  Data.id := ARecord.id;
  Data.bezeichnung := ARecord.bezeichnung;

end;
Gruß Hawkeye

oghma 20. Aug 2007 20:09

Re: VirtualTreeView - Anfängerhilfe
 
Zitat:

Zitat von Hawkeye219
Herzlich willkommen in der Delphi-PRAXiS, Oghma!

Ich vermute den Fehler in deiner Anpassung der Routine AddVSTStructure. Sie sollte bei dir etwa so aussehen:

Bingo! Wahrscheinlich hätte ich da noch 5h suchen können, und wär nicht drauf gekommen. Da brauch ich wohl eine neue Brille :nerd: Danke!

Also auf zu etwas schwierigeren Aufgaben...

FilouLE 11. Jan 2009 11:46

Re: VirtualTreeView - Anfängerhilfe
 
Ich steh jetzt vor dem selben Problem. Das Tutorial hab ich mir durchgelesen und das Erstellen der "Nodes" mit ihren "Children" ist kein Problem, allerdings kann ich weder den "Nodes" noch den "Children" eine Beschriftung verpassen. Ich hab die Contributions zu VST, die Quelltexte aus dem Tutorial und dieses hier ausprobiert, es funktioniert einfach nicht. Lade ich den Quellcode aus den Contributions, funktioniert alles, schneide ich mir ein paar Schnipsel davon aus und baue sie in mein Programm ein funktioniert die Beschriftung nicht.

Gibt es noch etwas was man noch beachten muss?

mkinzler 11. Jan 2009 11:48

Re: VirtualTreeView - Anfängerhilfe
 
Zeig mal deinen Code, dann finden wir den fehler wahrscheinlich schneller

FilouLE 11. Jan 2009 12:34

Re: VirtualTreeView - Anfängerhilfe
 
Mehr ist es nicht. Es ist quasi das Beispiel aus dem Tutorial.
Wenn ich den Button1 betätige, werden 100 Nodes erzeugt, die den den defaultText "Node" haben.
'Node-Nummer: '+IntToStr(I) wird völlig ignoriert.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  VirtualTrees, StdCtrls, ExtCtrls, jpeg, Tabs;

type
  TMainForm = class(TForm)
    TabSet1 : TTabSet;
    ListBox1: TListBox;
    Button1 : TButton;
    Button2 : TButton;
    Edit1   : TEdit;
    VST    : TVirtualStringTree;

    procedure Button1Click(Sender: TObject);
  private
    //
  public
    { Public declarations }
  end;

var
  Form1: TMainForm;

implementation

{$R *.dfm}

type
  PTreeData = ^TTreeData;
  TTreeData = record
    FCaption: String;
    FColumn1: String;
end;

function AddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
  ARecord: TTreeData): PVirtualNode;
var
  Data: PTreeData;
begin
  Result:=AVST.AddChild(ANode);
  Data :=AVST.GetNodeData(Result);
  AVST.ValidateNode(Result, False);
  Data^.FCaption:=ARecord.FCaption;
end;

procedure TMainForm.Button1Click(Sender: TObject);
var
  I: Integer;
  TreeData: TTreeData;
begin
  VST.NodeDataSize:=SizeOf(TTreeData);

  VST.BeginUpdate;
  for I:=0 to 100 do
  begin
    TreeData.FCaption := 'Node-Nummer: '+IntToStr(I);
    AddVSTStructure(VST, nil, TreeData);
  end;
  VST.EndUpdate;
end;

end.
[edit=mkinzler] Code-tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit]

Hawkeye219 11. Jan 2009 12:43

Re: VirtualTreeView - Anfängerhilfe
 
Hallo,

du musst das Ereignis OnGetText des VST bedienen, in dem du den Text für einen Knoten liefern kannst. Wenn du das richtig machst, solltest du alle 101 Knoten mit dem richtigen Text im Baum sehen.

P.S.: Das Setzen von NodeDataSize wäre besser im Ereignis OnCreate des Formulars aufgehoben.

Gruß Hawkeye

FilouLE 11. Jan 2009 13:02

Re: VirtualTreeView - Anfängerhilfe
 
Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
begin
  VST.NodeDataSize:=SizeOf(TTreeData);
end;

procedure TMainForm.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
          Column: Integer; TextType: TVSTTextType; var CellText: WideString);
var
  Data: PTreeData;
begin
  Data:=VST.GetNodeData(Node);

  CellText := Data^.FCaption;
end;
Gesagt, getan. Es regt sich immer noch nichts. Nach wie vor erscheint der defaultText.

FilouLE 11. Jan 2009 14:16

Re: VirtualTreeView - Anfängerhilfe
 
Ich hab die Lösung gefunden. Das Event OnGetText musste ich noch einmal neu über den Object-Inspector erzeugen, dann erscheint auch der Text (Caption) in VST. Ohne diesen Eintrag gibt es scheinbar das OnGetText nicht. Anders kann ich mir's nicht erklären.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 Uhr.
Seite 1 von 2  1 2      

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