Dear Didier (my idem ego),
here is what I did:
Important note: this is what I did, but I'm not sure this is the optimal solution, thus any new ideas are more than welcome!!
A. In a same event Handler (eg Edit's OnChange).
set the Font.Size
of the TVirtualStringTree Header
:
VirtualStringTree1.Header.Font.Size := UpDown1.Position;
set the Font.Size
of the TVirtualStringTree nodes:
VirtualStringTree1.Font.Size := UpDown1.Position;
set the Height
of the TVirtualStringTree Header
:
VirtualStringTree1.Header.Height := Round(VirtualStringTree1.Header.Height * Delta);
set the column's Width
of the TVirtualStringTree Header
:
for i := 0 to VirtualStringTree1.Header.Columns.Count -1 do
VirtualStringTree1.Header.Columns.Items[i].Width := Round(VirtualStringTree1.Header.Columns.Items[i].Width * Delta);
B. On TVirtualStringTree's OnMeasureTextHeight
event Handler, set its NodeHeight[Node]
property:
Sender.NodeHeight[Node] := Round(Extent * 1.1);
C. set TVirtualStringTree's toAutoChangeScale
to false in Object Inspector.
All put together, it gives:
procedure TForm1.Edit3Change(Sender: TObject);
var
Delta: Double;
i: byte;
begin
Delta := UpDown1.Position / VirtualStringTree1.Font.Size;
VirtualStringTree1.BeginUpdate();
try
VirtualStringTree1.Font.Size := UpDown1.Position;
VirtualStringTree1.Header.Font.Size := UpDown1.Position;
VirtualStringTree1.Header.Height := Round(VirtualStringTree1.Header.Height * Delta);
for i := 0 to VirtualStringTree1.Header.Columns.Count -1 do
VirtualStringTree1.Header.Columns.Items[i].Width := Round(VirtualStringTree1.Header.Columns.Items[i].Width * Delta);
finally
VirtualStringTree1.EndUpdate();
end;
end;
procedure TForm1.VirtualStringTree1MeasureTextHeight(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const Text: string; var Extent: Integer);
begin
Sender.NodeHeight[Node] := Round(Extent * 1.1);
end;