![]() |
VirtualStringTree - FullExpand Problem
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 |
Re: VirtualStringTree - FullExpand Problem
Pack deinen Code bitte in [ delphi ]...[ /delphi ] Tags. So kann das keiner lesen - und so will ich's auch nicht entziffern.
|
Re: VirtualStringTree - FullExpand Problem
Zitat:
Uwe |
Re: VirtualStringTree - FullExpand Problem
Dir ist klar, dass OnGetText ca. zwölfzigtausend mal pro Sekunde ausgelöst wird?
|
Re: VirtualStringTree - FullExpand Problem
Ist mir schon klar, aber wenn ich
Delphi-Quellcode:
in OnInitNode setze, dann werden die Nodes nicht ausgeklappt. Das ist genau mein Problem.
if Node^.Parent = Sender.RootNode then
VirtualStringTree1.Expanded[Node] := True; Uwe |
Re: VirtualStringTree - FullExpand Problem
Warum klappst du die Knoten nicht nach dem Laden des Baums aus?
|
Re: VirtualStringTree - FullExpand Problem
In welchem Event? Ich habe sämtliche in Frage kommenden ausprobiert und drehe mich im Kreis: entweder sind die Nodes ausgeklappt und die Buttons reagieren nicht, oder die Buttons reagieren, aber die Nodes sind zusammengefaltet.
|
Re: VirtualStringTree - FullExpand Problem
Ich meine dann, wenn du fertig bist mit dem Laden aus der MemIni.
Delphi-Quellcode:
procedure TMyClass.BuildTree;
begin OpenMemIni; CreateVSTStructure; VST.FullExpand; CloseMemIni; end; |
Re: VirtualStringTree - FullExpand Problem
Zitat:
[delphi]Include(InitialStates, ivsExpanded);[/quote] |
Re: VirtualStringTree - FullExpand Problem
@jbg
Danke für den Hinweis, aber mit dem Setzen des InitialStates habe ich es schon versucht. Führt in meinem Fall leider nicht zum Erfolg. @nuclearping Hm, das ist doch genau das, was ich momentan im OnGetText Event mache. In welchem Event soll ich deine Prozedur BuildTree dann aufrufen? Wenn ich es im OnGetText oder OnInitNode Event mache, kriege ich logischerweise dasselbe Ergebnis wie bisher. Ich glaube mittlerweile, daß mein Problem anders geartet ist. Wahrscheinlich muß ich doch den umständlichen Weg gehen und erst eine Record Structure aufbauen und diese mit OnInitNode initialisieren, statt das ganze in einem Rutsch im OnGetText zu erledigen. Das wollte ich eigentlich vermeiden, und laut Dokumentation sollte das in diesem Fall auch nicht nötig sein. Danke euch beiden Uwe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz