在TTabSheet的选项卡上显示活动的简单方法

时间:2012-02-01 22:29:23

标签: delphi delphi-2009

基本上我想要一个活动指示器,它会一目了然地显示该选项卡上正在进行的活动计算。我正在寻找一些非常简单的东西,比如在标签上显示一个gif,或者显示一系列随计时器而变化的字符串。我不想要复杂的解决方案或需要新组件的解决方案。

我已经有了一个实现,但是我遇到了一个问题,我在这里要求更具体的解决方案:How to show backslash in a japanese locale

如果没有其他问题的解决方案,或者有更好的方法来解决这个问题,我会问更一般的问题。无论如何,我确信会有其他人可以用这么好的方法来做到这一点。

2 个答案:

答案 0 :(得分:3)

更新:

最简单的方法可能就是:

  • 在表单中添加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 :(得分:1)

另一种方法是使用PageControl或TabControl的OnDrawTab事件。同样,您需要一种机制来触发重绘,但您可以将图像直接绘制到选项卡的画布上,也可以切换星号或循环显示一系列点。这种方法为您提供了很大的灵活性。这是一个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;