2012-02-01 16 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定数をイメージリストのイメージの高インデックスに設定する 'のようなものを第3のポイントとして挙げることもできます。 – 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の手法は、私にとってもっと簡単です。 –

関連する問題