基本上我想要一个活动指示器,它会一目了然地显示该选项卡上正在进行的活动计算。我正在寻找一些非常简单的东西,比如在标签上显示一个gif,或者显示一系列随计时器而变化的字符串。我不想要复杂的解决方案或需要新组件的解决方案。
我已经有了一个实现,但是我遇到了一个问题,我在这里要求更具体的解决方案:How to show backslash in a japanese locale
如果没有其他问题的解决方案,或者有更好的方法来解决这个问题,我会问更一般的问题。无论如何,我确信会有其他人可以用这么好的方法来做到这一点。
答案 0 :(得分:3)
更新:
最简单的方法可能就是:
TImageList
。cMaxImageIndex
设置为动画列表的最后一个索引。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;