-1

Possible Duplicate:
Grid progressbar or animation
Add graphical bar to a StringGrid col

Using Delphi 2010, I have a TStringGrid with 5 columns

ID, Start, End, Duration, and a column to draw a progress bar in each cell.

column 5 width (example: 60) is set by the Bar width spin edit field in options dialog.

Given that duration is (end - start) * 1440 (example: 0.39 minutes), I need to draw the progress bar as a percentage of the total bar width. (i.e. 39/60 = 65%) therefore the bar should be painted 65% accross the cell. It also needs to show the percentage centered in the bar. (navy blue bar & white text).

can anyone help me to paint this progress bar ?

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;
Community
  • 1
  • 1
Blow ThemUp
  • 895
  • 6
  • 18
  • 29

1 Answers1

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;
bummi
  • 27,123
  • 14
  • 62
  • 101