hola, disculpen, aqui esta la forma en q lo hice:
q_curacion es un TZQuery y cada segundo hago un refresh al query con un TTimer.
En esta pantalla voy insertando registros en una BD y le digo en que fecha y hora empieza y en que fecha y hora termina, y durante este tiempo se debera mostrar una barra de progreso representando el procentaje de los minutos transcurridos.
Código Delphi
[-]
procedure Tf_telecuracion.dbg_telecuracionDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
fValue,minTotal, minTrans: Integer;
ActualPenColor, ActualBrushColor: TColor;
EmptyDS: Boolean;
DrawRect: TRect;
fWidth1, fLeft2: Integer;
StrValue: string;
begin
if not (Column.FieldName = 'progreso') then begin
Exit;
end;
minTotal:= MinutesBetween(q_curacion.FieldByName('inicio').AsDateTime, q_curacion.FieldByName('final').AsDateTime);
minTrans:= MinutesBetween(q_curacion.FieldByName('inicio').AsDateTime, now);
fValue:= minTrans * 100 DIV minTotal;
if fValue > 100 then
fValue:= 100;
StrValue := IntToStr(fValue) + CHAR_PERCENT;
DrawRect := Rect;
InflateRect(DrawRect, -1, -1);
fWidth1 := Round((DrawRect.Right - DrawRect.Left) * (fValue / 100));
ActualPenColor := TDBGrid(Sender).Canvas.Pen.Color;
ActualBrushColor := TDBGrid(Sender).Canvas.Brush.Color;
TDBGrid(Sender).Canvas.Pen.Color := clHighlight;
TDBGrid(Sender).Canvas.Brush.Color := clWhite;
TDBGrid(Sender).Canvas.Rectangle(DrawRect);
if (fValue > 0) then begin
TDBGrid(Sender).Canvas.Pen.Color := clGreen;
TDBGrid(Sender).Canvas.Brush.Color := clGreen;
DrawRect.Right := DrawRect.Left + fWidth1;
InflateRect(DrawRect, -1, -1);
TDBGrid(Sender).Canvas.Rectangle(DrawRect);
end;
DrawRect := Rect;
InflateRect(DrawRect, -2, -2);
TDBGrid(Sender).Canvas.Brush.Style := bsClear;
fLeft2 := DrawRect.Left + (DrawRect.Right - DrawRect.Left) shr 1 -
(TDBGrid(Sender).Canvas.TextWidth(StrValue) shr 1);
TDBGrid(Sender).Canvas.TextRect(DrawRect, fLeft2,
DrawRect.Top + SPACE_TO_CENTER_CELLTEXT, StrValue);
TDBGrid(Sender).Canvas.Pen.Color := ActualPenColor;
TDBGrid(Sender).Canvas.Brush.Color := ActualBrushColor;
end;