Hallo zusammen
Folgendes Szenario:
In meinem Programm wird ein VirtualStringTree aus einer MemIniFile aufgebaut. Aus verschiedenen Gründen muß der VirtualStringTree auf FullExpand gesetzt werden; gleichzeitig aber die Möglichkeit bieten, beim Aufruf von ToggleNode ein Node zusammen oder auseinander zu falten. Mein Code sieht so aus (Content ist eine MemIniFile):
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
s: String;
SL: TStringList;
begin
SL := TStringList.Create;
case Column of
0:
begin
if VirtualStringTree1.GetNodeLevel(Node) = 0 then
begin
Content.ReadSections(SL);
s := SL[Node.Index];
CellText := s;
Content.ReadSection(s, SL);
if VirtualStringTree1.ChildCount[Node] <> Cardinal(SL.Count) then
VirtualStringTree1.ChildCount[Node] := SL.Count;
end
else
begin
Content.ReadSections(SL);
Content.ReadSection(SL[Node.Parent.Index], SL);
CellText := SL[Node.Index];
end;
end;
1:
if VirtualStringTree1.GetNodeLevel(Node) = 0 then
CellText := ''
else
begin
Content.ReadSections(SL);
s := SL[Node.Parent.Index];
Content.ReadSection(s, SL);
CellText := Content.ReadString(s, SL[Node.Index], 'n/a')
end;
end;
SL.Free;
{We cannot use VirtualStringTree1.FullExpand(nil) to expand all nodes as it
causes the main menu bar to stop responding.}
if Node^.Parent = Sender.RootNode then
VirtualStringTree1.Expanded[Node] := True;
end;
procedure TForm1.VirtualStringTree1InitNode(Sender: TBaseVirtualTree;
ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
if (VirtualStringTree1.GetNodeLevel(Node) = 0) then
VirtualStringTree1.CheckType[Node] := ctButton;
end;
procedure TForm1.VirtualStringTree1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
HIF: THitInfo;
Node: PVirtualNode;
begin
if ssLeft in Shift then
begin
VirtualStringTree1.GetHitTestInfoAt(X,Y,true,HIF);
if hiOnItemCheckbox in HIF.HitPositions then
begin
Node := VirtualStringTree1.GetNodeAt(X,Y);
VirtualStringTree1.ToggleNode(Node);
end;
end;
end;
Klappt soweit auch alles wie geplant - alle Nodes sind expandiert und der Button links von der Node Caption wird angezeigt. Mein Problem ist nur, daß ein Click auf den Button nicht ToggleNode(Node) aufruft. Ich weiß, daß ich nur die letzten beiden Zeilen aus OnGetText löschen muß, damit der Button reagiert, aber dann stehe ich vor dem Dilemma, daß die Nodes nicht mehr expandiert sind. Ich habe versucht, die beiden Zeilen im OnInitNode und diviersen anderen Events unterzubringen, aber leider ohne Erfolg. Entweder sind alle Nodes zusammengefaltet, oder aber der Button reagiert nicht. Weiß jemand, was ich hier falsch mache? Ich hab jetzt schon drei Tage nach einer Lösung gesucht und dabei meine letzten Haare eingebüßt...
Danke im voraus
Gruß
Uwe