Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Автозаполнение размера столбца в виртуальном дереве строк Delphi

Delphi , Синтаксис , Деревья

(TVirtualStringTree) — это полезная функция, которая позволяет столбцам автоматически подстраиваться под содержимое. Однако, при использовании свойства hoAutoSpanColumns, которое позволяет тексту перетекать из одного столбца в другой, если он не помещается в текущий столбец, могут возникнуть проблемы с автозаполнением размера столбца.

Проблема заключается в том, что когда текст в столбце должен охватывать всю ширину виртуального дерева строк, он останавливается на ширине последнего столбца, а не расширяется на всю ширину дерева. При использовании функции AutoFitColumns для автозаполнения размера столбца, другие столбцы сдвигаются, чтобы соответствовать ширине заполненного столбца, что не является желаемым результатом.

Для решения этой проблемы можно использовать следующий код, который позволяет автозаполнить размер столбца для охвата всего текста в перетекающем столбце, не сдвигая другие столбцы:

type
  TVirtualStringTree = class(VirtualTrees.TVirtualStringTree)
  protected
    function GetSpanColumn(Node: PVirtualNode): TColumnIndex; virtual;
  public
    procedure AutoFitSpanColumn(DestColumn: TColumnIndex; Node: PVirtualNode);
  end;

implementation

{ TVirtualStringTree }

function TVirtualStringTree.GetSpanColumn(Node: PVirtualNode): TColumnIndex;
begin
  { this returns visible span column for the given node, InvalidColumn otherwise }
  Result := Header.Columns.GetLastVisibleColumn;
  while ColumnIsEmpty(Node, Result) and (Result <> InvalidColumn) do
    Result := Header.Columns.GetPreviousVisibleColumn(Result);
end;

procedure TVirtualStringTree.AutoFitSpanColumn(DestColumn: TColumnIndex; Node: PVirtualNode);
var
  ColsWidth: Integer;
  SpanWidth: Integer;
  SpanOffset: Integer;
  SpanColumn: TColumnIndex;
begin
  SpanColumn := GetSpanColumn(Node);

  if SpanColumn <> InvalidColumn then
  begin
    { get the total width of the header }
    ColsWidth := Header.Columns.TotalWidth;
    { get the width of the span text cell as it would be autosized }
    SpanWidth := DoGetNodeWidth(Node, SpanColumn) + DoGetNodeExtraWidth(Node, SpanColumn) +
      DoGetCellContentMargin(Node, SpanColumn).X + Margin;
    { and get the left position of the span cell column in header }
    SpanOffset := Header.Columns[SpanColumn].GetRect.Left;
    { now, the width of the autosized column we increase by the subtraction of the fully
      visible span cell width and all columns width increased by offset of the span cell
      column; in other words, we'll just increase or decrease width of the DestColumn to
      the difference of width needed for the span column to be fully visible, or "fit" }
    Header.Columns[DestColumn].Width := Header.Columns[DestColumn].Width +
      SpanWidth - ColsWidth + SpanOffset;
  end;
end;

Этот код определяет функцию GetSpanColumn, которая возвращает последний видимый столбец для данного узла или InvalidColumn, если такой столбец не найден. Функция AutoFitSpanColumn используется для автозаполнения размера столбца для охвата всего текста в перетекающем столбце. Она получает общую ширину заголовка, ширину ячейки перетекающего текста, как если бы она была автозаполнена, а также левое положение столбца ячейки в заголовке. Затем она увеличивает ширину столбца, на который указывает DestColumn, на разницу между шириной, необходимой для полного отображения перетекающего столбца, и общей шириной всех столбцов, увеличенной на смещение столбца ячейки.

При использовании этого кода, перетекающий текст будет полностью отображаться в столбце, на который указывает DestColumn, без сдвига других столбцов.

Создано по материалам из источника по ссылке.

При использовании свойства `hoAutoSpanColumns` в виртуальном дереве строк Delphi (TVirtualStringTree) для перетекания текста между столбцами может возникнуть проблема с автозаполнением размера столбца, при которой текст останавливается на ширине последнег


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Деревья ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 01:44:21/0.0034229755401611/0