Bitte sehr. Option toGridExtensions hinzugefügt und die "^" eingebaut. Mehr nicht. Läuft, falls man einen Node selektiert hat.
Nix läuft. Dass das mit dem selektierten Node funktioniert ist eher ein Seiteneffekt, aber keine Lösung.
Ich denke aber ich bin des Rätsels Lösung schon sehr sehr nahe. In TCustomVirtualStringTree.DoGetNodeWidth:
Delphi-Quellcode:
if Column = FHeader.MainColumn then
begin
// Primary column or no columns.
Data := InternalData(Node); // <-- Magic Wunderding !!!
if Assigned(Data) then
begin
Result := Data^;
if Result = 0 then
begin
Data^ := CalculateTextWidth(Canvas, Node, Column, Text[Node, Column]);
Result := Data^;
end;
end
else
Result := 0;
end
Der Schweinehund puffert doch die Textbreite tatsächlich! Wahrscheinlich aus Performancegründen, um eben nicht für jede einzelne Zelle die Textbreite über den DeviceContext berechnen zu müssen. Und hier kommt auch die Erklärung, warum es mit einem InvalidateNode funktioniert:
Delphi-Quellcode:
function TCustomVirtualStringTree.InvalidateNode(Node: PVirtualNode): TRect;
var
Data: PInteger;
begin
Result := inherited InvalidateNode(Node);
// Achtung !!! Hier des Rätsels Lösung:
// Reset node width so changed text attributes are applied correctly.
if Assigned(Node) then
begin
Data := InternalData(Node);
if Assigned(Data) then
Data^ := 0; // !!! InternalData wird auf 0 gesetzt, weshalb GetNodeWidth dann gezwungen ist neu zu berechnen.
// Reset height measured flag too to cause a re-issue of the OnMeasureItem event.
Exclude(Node.States, vsHeightMeasured);
end;
end;
So: Rätsel gelöst! Ich lag falsch, der VST puffert doch die Textbreite. Daher ist die einzig richtige Lösung, ein InvalidateNode zu machen.