увеличить TVirtualStringTree

Я хочу найти «лучший способ» увеличения /уменьшения TVirtualStringTree.
«Увеличение» означает имитацию увеличительного стекла.
«Наилучший путь» следует понимать, используя в приоритете свойства /методы, выделенные для этого в элементе управления TVirtualStringTree. Если методов не существует, предложите самый простой способ, избегая низкоуровневых API.

Как лучше объяснить этот вопрос,
Вот скриншот TVirtualStringTree в его начальном состоянии: начальное состояние http://didier.cabale.free.fr/temp/VST1.jpg.
.. и вот скриншот TVirtualStringTree в его желаемом состоянии: требуемое состояние http://didier.cabale.free.fr/temp/VST2.jpg

4 голоса | спросил Didier Cabalé 27 MarpmSun, 27 Mar 2016 12:32:21 +03002016-03-27T12:32:21+03:0012 2016, 12:32:21

1 ответ


0

Дорогой Дидье (мое то же самое),

вот что я сделал:
Важное примечание: это то, что я сделал, но я не уверен, что это оптимальное решение, поэтому любые новые идеи приветствуются !!

а. В том же обработчике событий (например, OnChange редактора).

  1. установите Font.Size для TVirtualStringTree Header:

    VirtualStringTree1.Header.Font.Size := UpDown1.Position;
    
  2. установите Font.Size узлов TVirtualStringTree:

    VirtualStringTree1.Font.Size := UpDown1.Position;
    
  3. установите Height для TVirtualStringTree Header:

    VirtualStringTree1.Header.Height := Round(VirtualStringTree1.Header.Height * Delta);
    
  4. установите Width для 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);
    

В. В обработчике события OnMeasureTextHeight TVirtualStringTree установите его NodeHeight[Node] свойство:

  Sender.NodeHeight[Node] := Round(Extent * 1.1);

С. установите toAutoChangeScale для TVirtualStringTree в false в Инспекторе объектов.

Все вместе, это дает:

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;
ответил Didier Cabalé 27 MarpmSun, 27 Mar 2016 13:18:37 +03002016-03-27T13:18:37+03:0001 2016, 13:18:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132