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

Как вывести TBCFluentProgressRing и TBCMaterialProgressBarMarque на передний план в BGRA Controls

Delphi , Компоненты и Классы , TTreeView

 

При работе с BGRA Controls, такими как TBCFluentProgressRing и TBCMaterialProgressBarMarque, может возникнуть проблема с отображением их на переднем плане, особенно если они перекрываются другими элементами управления, например, VirtualStringTree. В этой статье мы рассмотрим причину такого поведения и предложим несколько решений, ориентированных на разработчиков, использующих Delphi и Pascal.

Проблема:

Автор вопроса столкнулся с тем, что методы BringToFront и SendToBack не оказывают никакого эффекта на TBCFluentProgressRing и TBCMaterialProgressBarMarque. Прогресс бар оставался скрытым за VirtualStringTree.

Причина:

Дело в том, что TBCFluentProgressRing и TBCMaterialProgressBarMarque, как и TPaintBox, унаследованы от TGraphicControl. В отличие от TWinControl (например, TButton, TEdit), TGraphicControl не являются полноценными окнами Windows. Они отрисовываются непосредственно на канве родительского элемента управления. Следовательно, изменение Z-порядка (порядка отрисовки) для таких компонентов стандартными методами не работает. Они просто рисуются в том порядке, в котором они добавлены в список дочерних элементов управления родителя.

Решение 1: Использование TPanel как контейнера

Как было предложено в обсуждении, наиболее простым и эффективным решением является помещение TBCFluentProgressRing или TBCMaterialProgressBarMarque внутрь TPanel. TPanel является TWinControl, и, следовательно, может быть перемещен на передний план. Таким образом, перемещая TPanel на передний план, мы перемещаем и все элементы управления, находящиеся внутри него.

Пример кода:

procedure TMainForm.FetchTimerTimer(Sender: TObject);
var
  Thread: TDataLoaderThread;
begin
  FetchTimer.Enabled:= false;
  Panel1.Visible:= true; // Panel1 содержит pgrLoading
  Panel1.BringToFront;
  Application.ProcessMessages;
  Thread:= TDataLoaderThread.Create(false);
  Thread.FreeOnTerminate:= true;
end;

В этом примере Panel1 является контейнером для pgrLoading (предположительно, TBCFluentProgressRing или TBCMaterialProgressBarMarque). Вызов Panel1.BringToFront выводит панель, а вместе с ней и прогресс бар, на передний план.

Альтернативное решение: Перерисовка родительского элемента управления

Если использование TPanel нежелательно, можно попробовать перерисовать родительский элемент управления, в котором находятся TBCFluentProgressRing и TBCMaterialProgressBarMarque, после изменения видимости прогресс бара. Это заставит родительский элемент управления перерисовать все свои дочерние элементы, что может привести к тому, что прогресс бар будет отрисован поверх других элементов.

Пример кода:

procedure TMainForm.FetchTimerTimer(Sender: TObject);
var
  Thread: TDataLoaderThread;
begin
  FetchTimer.Enabled:= false;
  pgrLoading.Visible:= true;
  VirtualStringTree1.Repaint; // Перерисовываем VirtualStringTree
  Application.ProcessMessages;
  Thread:= TDataLoaderThread.Create(false);
  Thread.FreeOnTerminate:= true;
end;

В этом примере мы вызываем VirtualStringTree1.Repaint после того, как сделали pgrLoading видимым. Это заставит VirtualStringTree1 перерисовать себя и, возможно, отрисовать pgrLoading поверх других элементов.

Важно: Этот метод не всегда надежен и может зависеть от реализации родительского элемента управления. Кроме того, он может привести к мерцанию экрана.

Альтернативное решение 2: Изменение порядка отрисовки компонентов в родительском элементе управления

Более сложный, но потенциально более эффективный подход - изменить порядок, в котором родительский элемент управления рисует свои дочерние компоненты. Это потребует доступа к внутренним структурам данных родительского элемента управления и может быть невозможным или нежелательным в зависимости от его реализации. В частности, для VirtualStringTree этот подход может быть очень сложным.

Заключение:

Наиболее простым и рекомендуемым решением для вывода TBCFluentProgressRing и TBCMaterialProgressBarMarque на передний план в BGRA Controls является использование TPanel как контейнера. Альтернативные решения, такие как перерисовка родительского элемента управления или изменение порядка отрисовки компонентов, могут быть более сложными и менее надежными. Выбор конкретного решения зависит от конкретной ситуации и требований к приложению.

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

В BGRA Controls компоненты TBCFluentProgressRing и TBCMaterialProgressBarMarque, унаследованные от TGraphicControl, для отображения поверх других элементов, таких как VirtualStringTree, рекомендуется поместить в TPanel, который, будучи TWinControl, может


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

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




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


:: Главная :: TTreeView ::


реклама


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

Время компиляции файла: 2024-12-22 17:14:06
2025-10-15 13:40:13/0.014810085296631/0