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

Анимация цвета фона ячеек в дереве при создании и удалении процесса в Delphi

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

При работе с деревом (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, которые будут использоваться для хранения таймеров создания и удаления процессов соответственно.

FTimerManager: TTimerManager;
FCreationTimer: TTimer;
FDeletionTimer: TTimer;

Определим процедуры-обработчики таймеров, которые будут менять флаг 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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 23:47:35/0.003471851348877/0