2012-02-01 4 views
4

기본적으로 해당 탭에서 진행중인 계산이 진행중인 것을 한 눈에 보여주는 활동 표시기가 필요합니다. 나는 탭에서 gif를 보여 주거나 타이머로 바뀌는 일련의 문자열을 보여주는 것과 같이 매우 간단한 것을 찾고 있습니다. 복잡한 솔루션이나 새로운 구성 요소가 필요한 솔루션을 원하지 않습니다.TTabSheet의 탭에서 활동을 보여주는 간단한 방법

이미 구현을 가지고,하지만 난 여기에보다 구체적인 솔루션을 요구하고있어 그 문제에 봉착 : 다른에 대한 해결책이 아니라고 How to show backslash in a japanese locale

경우를 문제가 있거나이 작업을 수행하는 데 훨씬 더 좋은 방법이 있다는 것을 알기 위해보다 일반적인 질문을하고 있습니다. 어쨌든, 나는 이것을 할 수있는 좋은 방법을 사용할 수있는 다른 사람들이있을 것이라고 확신합니다.

+0

GIF는 '매우 간단하지 않습니다'. 왜 탭의 캡션 끝에 별표를 두는 것이 좋을까요? –

+0

켄 이완 ... 각 질문이 다른 질문과 연결될 것으로 예상했기 때문에 분명히 어딘가에서 시작해야했습니다! 어쨌든, 나는 이것을하기위한 좋은 방법에 대한 제안을 찾고 있습니다. 나는 원래의 아이디어가 마음에 들었지만 파이프와 백 슬래시가 작동하지 않는 것처럼 작동하지 않을 것 같은 느낌이 들었습니다. 지금 어떤 방향으로 향해야 할지를 놓치지 않았습니다. – boileau

+0

@AndreasRejbrand 나는 뭔가 움직이기를 원합니다. 어쨌든 저장되지 않은 변경 표시기로 별표를 사용하고 있으므로 생각하지 않아도됩니다. – boileau

답변

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를 설정하고 작업이 완료되면 당신은 또한 탭에 대한 기본 이미지를 가지고 몇 가지 논리가있을 수 있습니다.

+0

+1, cMaxImageIndex 상수를 세 번째 점으로 이미지 목록의 이미지의 높은 색인에 설정하는 것과 같은 것을 언급 할 수도 있습니다. – TLama

+1

@TLama, 네, 좀 더 많은 의견을 추가했습니다. –

+0

내 요구 사항에 맞추기 위해 약간 변경해야했지만 결과에 만족합니다. 감사. – boileau

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; 
+0

맞춤형 탭이 작동하지만 복잡한 접근 방식이나 가벼운 요구 사항이 들리며 "간단한"요청을했습니다. 이미지 목록을 사용하여 애니메이션 이미지를 사용하는 LU RD의 접근법은 훨씬 간단합니다. –

관련 문제