Autor Beitrag
schitho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: So 29.06.03 22:02 
Hi,

beschäftige mich gerade mit der VirtualTreeView Komponente.

Kann schon Nodes hinzufügen und löschen, auf Klicks reagieren und auch nach Spalten sortieren. :)

Seitdem ich jedoch auch Icons anzeigen lasse, dauert es eine halbe Ewigkeit bis mein Baum auf einen Klick auf einen Node reagiert. :crying:

Derzeit verwende ich folgenden Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.VSTGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  Data: PTreeData;
begin
  if not Assigned(Node) then Exit;
  Data:=VST.GetNodeData(Node);
  VST.BeginUpdate;
  case Kind of
    ikState: // for the case the state icon has been requested
      ImageIndex := -1;
    ikNormal, ikSelected: // normal or the selected icon is required
      case column of
        0: ImageIndex := Data.Image;
      end;
  end;
  VST.EndUpdate;
end;



Wenn ich diesen Teil einfach mit {} deaktiviere reagiert mein Baum wieder schön schnell auf jeden Klick.

Woran kann das liegen???

Gruß
Thomas

_________________
(Sorry! Leider ewiger Delphi-Neuling)
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Mo 30.06.03 00:14 
hallo,

hast du mal probiert, was passiert, wenn du vst.beginupdate; und vst.endupdate; auskommentierst?

Gruß
Ken
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Mo 30.06.03 21:04 
Zitat:
hast du mal probiert, was passiert, wenn du vst.beginupdate; und vst.endupdate; auskommentierst?


Hab ich. Dadurch ergibt sich keine Änderung.

Es bleibt total träge. :cry:

_________________
(Sorry! Leider ewiger Delphi-Neuling)
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Mo 30.06.03 21:36 
Ich vermute, dass der Fehler irgendwo anders sich versteckt hat. Daher erlaube ich mir den ganzen Quelltext hier zu posten:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    VST: TVirtualStringTree;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ImageList1: TImageList;
    StaticText1: TStaticText;
    SpinEdit1: TSpinEdit;
    procedure Button1Click(Sender: TObject);
    procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure VSTClick(Sender: TObject);
    procedure VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure VSTCompareNodes(Sender: TBaseVirtualTree; Node1,
      Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
    procedure VSTHeaderClick(Sender: TVTHeader; Column: TColumnIndex;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure VSTGetImageIndex(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
      var Ghosted: Boolean; var ImageIndex: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
  PTreeData = ^TTreeData;
  TTreeData = record
    FCaption: String;
    FColumn1: String;
    Image   : Integer;
  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;
  Data^.FColumn1:=ARecord.FColumn1;
  Data^.Image:=ARecord.Image;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  TreeData: TTreeData;
  Node : PVirtualNode;

begin
  VST.NodeDataSize:=SizeOf(TTreeData);
  VST.BeginUpdate;
  TreeData.FCaption:=Edit1.Text;
  TreeData.FColumn1:='Bild-Index ' + IntToStr(SpinEdit1.Value);
  TreeData.Image:=SpinEdit1.Value;
  Node:=VST.FocusedNode;
  AddVSTStructure(VST,Node,TreeData);
  VST.EndUpdate;
end;



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

var
  Data: PTreeData;
begin
  if not Assigned(Node) then Exit;
  Data:=VST.GetNodeData(Node);
  case Column of
    0: CellText:=Data.FCaption;
    1: CellText:=Data.FColumn1;
  end;

end;

procedure TForm1.VSTClick(Sender: TObject);
var
  Node: PVirtualNode;
  Data: PTreeData;

begin
  Node:=VST.FocusedNode;
  if not Assigned(Node) then Exit;
  Data:=VST.GetNodeData(Node);
  StaticText1.Caption:='Name: ' + Data.FCaption + '   Spalte: ' +Data.FColumn1;
end;

procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  Data: PTreeData;
begin
  if not Assigned(Node) then Exit;
  Data:=VST.GetNodeData(Node);
  if Assigned(Data) then
  begin
    Data.FCaption:='';
    Data.FColumn1:='';
    Data.Image:=0;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Node: PVirtualNode;
begin
  Node:=VST.FocusedNode;
  if not Assigned(Node) then Exit;
  VST.BeginUpdate;
  VST.DeleteChildren(Node);
  VST.DeleteNode(Node);
  VST.EndUpdate;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 VST.BeginUpdate;
 VST.Clear;
 VST.EndUpdate;
end;

procedure TForm1.VSTCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
  data1: PTreeData;
  data2: PTreedata;
begin
  Data1:=VST.GetNodeData(Node1);
  Data2:=VST.GetNodeData(Node2);
  if Column = 0 then
  begin
    if (not Assigned(Data1)) or (not Assigned(Data2)) then Result:=0;
    Result:=CompareText(Data1.FCaption, Data2.FCaption);
  end;
end;

procedure TForm1.VSTHeaderClick(Sender: TVTHeader; Column: TColumnIndex;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Column = 0 then
  begin
    VST.BeginUpdate;
    VST.SortTree(Column,Sender.SortDirection,True);
    VST.EndUpdate;
    if Sender.SortDirection=sdAscending then
      Sender.SortDirection:=sdDescending
    else
      Sender.SortDirection:=sdAscending;
  end;
end;

procedure TForm1.VSTGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  Data: PTreeData;
begin
  if not Assigned(Node) then Exit;
  Data:=VST.GetNodeData(Node);
  VST.BeginUpdate;
  case Kind of
    ikState: // for the case the state icon has been requested
      ImageIndex := 2;
    ikNormal, ikSelected: // normal or the selected icon is required
      case column of
        0: ImageIndex := Data.Image;
        1: ImageIndex := -1;
      end;
  end;
  VST.EndUpdate;
end;

end.


Noch eine Erläuterung zur Form:

Also es gibt den VirtualTreeView mit der Bezeichnung VST.
Dann hab ich den Button1 um Nodes hinzuzufügen, den Button2 um Nodes zu löschen und den Button3 um alle Nodes zu löschen.

In Edit1 kann ich festlegen welchen Text der Node haben soll und über SpinEdit1 kann ich zusätzlich die Indexnummer für das Icon auswählen.

StaticText1 dient zur Anzeige, wenn man auf einen Node klickt.

VST selbst hat überdies 2 Spalten.

Fall's es jemanden interessiert: Teile meines Codes stammen aus einem Tutorial.

So das war es. Vielleicht findet jetzt jemand den (oder die :oops: ) Fehler.

Danke!!!

_________________
(Sorry! Leider ewiger Delphi-Neuling)
schitho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 288

XP Home SP2
D2005 Prof
BeitragVerfasst: Mo 30.06.03 21:47 
Ich hab den Fehler gefunden :lol:

Es ist mir allerdings uuuuurrrrrr peinlich :oops: , dass es doch an vst.beginupdate und vst.endupdate lag. :shock:

Ich dachte ich hatte es gestern auch ohne vst.beginupdate und vst.endupdate ausprobiert und es sei dadurch keine Änderung eingetreten. So kann man sich irren :autsch:


Daher nochmals SORRY und Danke an CenBells

_________________
(Sorry! Leider ewiger Delphi-Neuling)