При работе с деревом (VirtualStringTree) в Delphi часто возникает потребность в визуальном отображении различных состояний процессов. Одним из способов является изменение цвета фона ячеек в зависимости от определенных условий. В этом материале мы рассмотрим, как реализовать анимацию цвета фона ячеек при создании и удалении процессов, подобно поведению Process Explorer или Process Hacker.
Подготовка
Для начала, нам нужно подготовить данные о процессах и связать их с узлами дерева. Пусть у нас есть процедура UpdateProcessTree, которая обновляет дерево процессов на основе полученных данных:
procedure TMainForm.UpdateProcessTree(ProcessList: TArray<PProcessData>);
begin
// Обновляем дерево процессов
// ...
end;
Изменение цвета фона ячеек
Теперь, чтобы изменить цвет фона ячеек в зависимости от различных условий, мы будем переопределять процедуру BeforeCellPaint для нашего дерева:
procedure TMainForm.ProcessVstBeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
NodeData: PProcessData;
begin
if Node = nil then
Exit;
NodeData := Sender.GetNodeData(Node);
if NodeData = nil then
Exit;
// Определяем цвет фона ячейки на основе различных условий
// ...
// Проверяем, нужно ли менять цвет фона ячейки при создании или удалении процесса
if (NodeData^.isProcessMarkedForCreation or NodeData^.isProcessMarkedForDeletion) then
begin
// Если нужно, меняем цвет фона ячейки на зеленый или красный
if NodeData^.isProcessMarkedForCreation then
TargetCanvas.Brush.Color := $0000FF00
else
TargetCanvas.Brush.Color := $00FF0000;
TargetCanvas.FillRect(CellRect);
end;
end;
Анимация цвета фона
Чтобы реализовать анимацию цвета фона при создании и удалении процессов, нам нужно запустить таймер, который будет менять цвет фона ячейки на определенное время. Создадим для этого две переменные: FCreationTimer и FDeletionTimer, которые будут использоваться для хранения таймеров создания и удаления процессов соответственно.
Определим процедуры-обработчики таймеров, которые будут менять флаг isProcessMarkedForCreation или isProcessMarkedForDeletion и перерисовывать дерево:
procedure TMainForm.CreationTimerHandler(Sender: TObject);
begin
with Sender as TTimer do
begin
// Меняем флаг и перерисовываем дерево
with TNodeData(ProcessVst.GetNodeData(Owner)) do
begin
isProcessMarkedForCreation := False;
ProcessVst.InvalidateNode(Owner);
end;
// Останавливаем и удаляем таймер
Enabled := False;
FTimerManager.Remove(Sender);
end;
end;
procedure TMainForm.DeletionTimerHandler(Sender: TObject);
begin
with Sender as TTimer do
begin
// Меняем флаг и перерисовываем дерево
with TNodeData(ProcessVst.GetNodeData(Owner)) do
begin
isProcessMarkedForDeletion := False;
ProcessVst.InvalidateNode(Owner);
end;
// Останавливаем и удаляем таймер
Enabled := False;
FTimerManager.Remove(Sender);
end;
end;
Теперь, когда мы получаем уведомление о создании или удалении процесса, мы запускаем соответствующий таймер и меняем флаг для узла дерева:
procedure TMainForm.OnProcessCreated(Process: PProcessData);
begin
// Обновляем дерево процессов
UpdateProcessTree([Process]);
// Запускаем таймер для анимации цвета фона при создании процесса
FCreationTimer := FTimerManager.Add(TimerProc: CreationTimerHandler, Owner: ProcessVst.GetNode(Process), Interval: 1000);
with TNodeData(ProcessVst.GetNodeData(Process)) do
isProcessMarkedForCreation := True;
ProcessVst.InvalidateNode(Process);
end;
procedure TMainForm.OnProcessDeleted(Process: PProcessData);
begin
// Обновляем дерево процессов
UpdateProcessTree([]);
// Запускаем таймер для анимации цвета фона при удалении процесса
FDeletionTimer := FTimerManager.Add(TimerProc: DeletionTimerHandler, Owner: ProcessVst.GetNode(Process), Interval: 1000);
with TNodeData(ProcessVst.GetNodeData(Process)) do
isProcessMarkedForDeletion := True;
ProcessVst.InvalidateNode(Process);
end;
Теперь, когда процесс создается или удаляется, соответствующая ячейка в дереве будет менять цвет фона на зеленый или красный в течение одной секунды, после чего возвращаться к исходному цвету. Это позволяет визуально отобразить созда
Статья о реализации анимации цвета фона ячеек в дереве (VirtualStringTree) при создании и удалении процессов в Delphi, подобно поведению Process Explorer или Process Hacker.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.