-1

重複の可能性:
グリッド プログレスバーまたはアニメーション
グラフィカル バーを StringGrid 列に追加する

Delphi 2010 を使用して、5 列の TStringGrid を作成しました。

ID、開始、終了、期間、および各セルに進行状況バーを描画するための列。

列 5 の幅 (例: 60) は、オプション ダイアログの [棒の幅] スピン編集フィールドで設定されます。

期間が (終了 - 開始) * 1440 (例: 0.39 分) であることを考えると、進行状況バーを合計バー幅のパーセンテージとして描画する必要があります。(つまり、39/60 = 65%) したがって、バーはセル全体で 65% ペイントする必要があります。また、バーの中央にパーセンテージを表示する必要があります。(ネイビー ブルーのバーと白いテキスト)。

このプログレスバーを描くのを手伝ってくれる人はいますか?

procedure Tphasedata.grdMainDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  LStrCell: string;
  LRect: TRect;
begin
 with (Sender as TStringGrid) do
  begin
    // Don't change color for first Column, first row
    if (ACol = 0) or (ARow = 0) then
      Canvas.Brush.Color := clBtnFace
    else
    begin
      case ACol of
        0: Canvas.Font.Color := clBlack;
        1: Canvas.Font.Color := clBlue;
        2: Canvas.Font.Color := clBlue;
        3: Canvas.Font.Color := clRed;
      end;
      // Draw the Band
      if ARow mod 2 = 0 then
        Canvas.Brush.Color := $00E1FFF9
      else
        Canvas.Brush.Color := $00FFEBDF;
      Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]);
      Canvas.FrameRect(Rect);

      //center the duration text
      if ACol = 3 then
      begin
        LStrCell := Cells[ACol, ARow]; // grab cell text
        Canvas.FillRect(Rect); // clear the cell
        LRect := Rect;
        LRect.Top := LRect.Top + 3; // adjust top to center vertical
        // draw text
        DrawText(Canvas.Handle, PChar(LStrCell), Length(LStrCell), LRect, DT_CENTER);
      end;

     i ACol = 4 then
     begin
      // draw progress bar here 
     end; 
    end;
  end;
4

1 に答える 1

1
var
   percent:Double;


procedure DrawTheText(const hDC: HDC; const Font: TFont; var Text: string; aRect:TRect);
var
 lRect:Trect;
begin
  with TBitmap.Create do
    try

      Width := aRect.Right - aRect.Left;
      Height := aRect.Bottom - aRect.Top;
      LRect :=Rect(0,0,width,height);
      Canvas.Font.Assign(Font);
      Canvas.Brush.Color := clBlack;
      Canvas.FillRect(Lrect);
      Canvas.Font.Color := clWhite;
      Canvas.TextRect(Lrect,Text,[tfCenter ,tfVerticalCenter,tfSingleLine]);
      BitBlt(hDC, aRect.Left, aRect.Top, Width, Height, Canvas.Handle, 0, 0, SRCINVERT);
    finally
      Free;
    end;
end;

procedure TForm3.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  LRect:Trect;
  s:String;
  c:TCanvas;
begin
   //.....yout code
      percent := 0.5;//Random(2) / 60;
   //.... case of wished Colum
   c := DrawGrid1.Canvas;
   LRect := Rect;
   LRect.Right := Round(LRect.Left + (LRect.Right - LRect.Left)*percent);
   inflaterect(LRect,-1,-1);
   c.Brush.Color := clNavy;
   c.Brush.Style := bsSolid;
   c.Pen.Color := clBlack;
   C.FillRect(LRect);
   s := FormatFloat('0.00 %' , percent * 100 );
   DrawTheText(c.Handle,DrawGrid1.font,s,rect);
end;
于 2012-11-02T15:11:49.663 に答える