Простой способ показать активность на вкладке для TTabSheet - PullRequest
4 голосов
/ 02 февраля 2012

По сути, мне нужен индикатор активности, который с первого взгляда покажет, что на этой вкладке идет активный расчет. Я ищу что-то очень простое, например, показ GIF на вкладке или последовательность строк, которые меняются с таймером. Я не хочу сложного решения или решения, которое требует новых компонентов.

У меня уже есть реализация, но у меня проблема с ней, поэтому я прошу более конкретное решение здесь: Как отобразить обратную косую черту в японском языке

В случае, если не существует решения другой проблемы или существует значительно лучший способ сделать это, я задаю более общий вопрос. В любом случае, я уверен, что найдутся другие, которые могли бы использовать хороший способ сделать это.

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012

Обновление:

Возможно, самый простой способ:

  • Добавьте TImageList к вашей форме.
  • Добавьте анимационные изображения в список изображений.
  • Установите константу cMaxImageIndex для последнего индекса анимированного списка.
  • Подключите ImageList к TPageControl.
  • Объявите функцию NextImageIndex.
  • Активируйте таймер, когда это необходимо.
  • В событии таймера установите свойство таблицы ImageIndex.

См. Код:

Const
  cMaxImageIndex = 5;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FImageIndex := 0;
end;

function TForm1.NextImageIndex: Integer;
begin
  Inc(FImageIndex);
  if (FImageIndex > cMaxImageIndex) then FImageIndex:= 0;
  Result := FImageIndex;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  PageControl1.Pages[0].ImageIndex := NextImageIndex;
end;

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

1 голос
/ 02 февраля 2012

Другой подход заключается в использовании события OnDrawTab PageControl или TabControl.Опять же, вам понадобится механизм для запуска перерисовки, но вы можете либо нарисовать изображение непосредственно на холсте вкладки, либо переключать звездочку или циклически проходить ряд точек.Такой подход дает вам большую гибкость.Вот событие OnTabDraw, которое не делает ничего, кроме рисования вкладок со статическим градиентом;Вы можете использовать его в качестве отправной точки.

procedure TabDraw(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
const
  TCM_GETITEMRECT = $130A;
type
  TRIVERTEX = packed record
    X, Y: DWORD;
    Red, Green, Blue, Alpha: Word;
  end;
var
  vert: array[0..1] of TRIVERTEX;
  gRect: GRADIENT_RECT;
  iHeight,
  iWidth: Integer;
begin
  with FTabControl.Canvas do begin
    if Active then begin
      Brush.Color := TAB_ACTIVECOLOUR;
      FillRect(Rect);
    end
    else begin
      vert[0] .x := Rect.Left;
      vert[0] .y := Rect.Top;
      vert[0] .Red := $ab00;
      vert[0] .Green := $ab00;
      vert[0] .Blue := $ab00;
      vert[0] .Alpha := $ab00;
      vert[1] .x := Rect.Right;
      vert[1] .y := Rect.Bottom;
      vert[1] .Red := $ef00;
      vert[1] .Green := $ef00;
      vert[1] .Blue := $fe00;
      vert[1] .Alpha := $0000;
      gRect.UpperLeft  := 0;
      gRect.LowerRight := 1;
      GradientFill(FTabControl.Canvas.Handle, @vert, 2, @gRect, 1, GRADIENT_FILL_RECT_V);
    end;
    iHeight := (Rect.Bottom - Rect.Top) - TextHeight(FTabControl.Tabs[TabIndex]);
    if not Active then
      Inc(iHeight, 4);
    iWidth := (Rect.Right - Rect.Left) - TextWidth(FTabControl.Tabs[TabIndex]);
    Brush.Style := bsClear;
    TextOut(Rect.Left + (iWidth div 2), Rect.Top + (iHeight div 2), FTabControl.Tabs[TabIndex]);
  end;
end;
...