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

Решение проблемы отображения только первого узла в TVirtualStringTree

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

Заголовок: Неверное поведение PaintTree в TVirtualStringTree при использовании poUnbuffered

Описание проблемы: При использовании опции poUnbuffered в методе PaintTree компонента TVirtualStringTree отображается только первый узел дерева. Это поведение было замечено при использовании минимального примера VST и не меняется при смене версии компонента. При отключении опции poUnbuffered дерево отображается корректно. Несмотря на то, что все объекты правильно отрисовываются на канвасе, проблема, похоже, связана с обрезкой, но конкретная причина пока не ясна.

Пример кода, демонстрирующий проблему:

procedure TMainForm.Button2Click(Sender: TObject);
var
  saveBitmap: TBitmap;
begin
  saveBitmap := TBitmap.Create;
  try
    saveBitmap.Height := 400;
    saveBitmap.Width := 400;

    vst.PaintTree(
      saveBitmap.Canvas,
      Rect(0, 0, 400, 400),
      Point(0, 0),
      [poBackground, poColumnColor, poGridLines, poUnbuffered], // Удалите poUnbuffered, чтобы дерево отобразилось корректно
      pfDevice     // pixelformat
    );

    saveBitmap.SaveToFile('E:\temp\CanvasSave' + FormatDateTime('hhnnsszzz', Now) + '.bmp');
  finally
    saveBitmap.Free;
  end;
end;

Подробности: Между кодом для отрисовки с опцией poUnbuffered и без нее очень мало отличий. Основные различия заключаются в следующих фрагментах кода:

  1. Создание битмапа NodeBitmap и настройка его параметров при отсутствии опции poUnbuffered.
  2. Настройка высоты битмапа NodeBitmap и установка origine канваса при отсутствии опции poUnbuffered.
  3. Несколько операций BitBlt, копирующих битмап на канвас при отсутствии опции poUnbuffered.

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

Подтвержденный ответ (workaround): Проблема связана с некорректной работой метода ClipCanvas после изменения origine канваса. Чтобы исправить это, нужно изменить второй фрагмент кода следующим образом:

begin
  SetCanvasOrigin(PaintInfo.Canvas, -TargetRect.Left + Window.Left, -TargetRect.Top);
  // ClipCanvas(PaintInfo.Canvas, Rect(TargetRect.Left, TargetRect.Top, TargetRect.Right,
  //                                   Min(TargetRect.Bottom, MaximumBottom)))
  ClipCanvas(PaintInfo.Canvas, Rect(0, 0, TargetRect.Right - TargetRect.Left,
                                    Min(TargetRect.Bottom - TargetRect.Top, MaximumBottom - TargetRect.Top)));
end;

Это решение исправило проблему в моей ситуации, но может не подходить для всех случаев использования. Будьте осторожны при внесении изменений в код, так как компонент TVirtualStringTree может быть чувствителен к подобным изменениям.

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

Проблема связана с некорректной работой метода ClipCanvas после изменения origine канваса в TVirtualStringTree при использовании poUnbuffered.


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

Получайте свежие новости и обновления по 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:36:31/0.0032949447631836/0