Ich vermute, dass der Fehler irgendwo anders sich versteckt hat. Daher erlaube ich mir den ganzen Quelltext hier zu posten:
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 public 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: ImageIndex := 2; ikNormal, ikSelected: 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

) Fehler.
Danke!!!