При работе с 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, после изменения видимости прогресс бара. Это заставит родительский элемент управления перерисовать все свои дочерние элементы, что может привести к тому, что прогресс бар будет отрисован поверх других элементов.
В этом примере мы вызываем 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.