Clube da Programação e Hardware

Tutorial, dicas, Programação, Hardware entre outros assuntos.
 
InícioInício  CalendárioCalendário  FAQFAQ  BuscarBuscar  MembrosMembros  GruposGrupos  Registrar-seRegistrar-se  Login  

Compartilhe | 
 

 DBGrid com Progressbar (Resolvido)

Ver o tópico anterior Ver o tópico seguinte Ir em baixo 
AutorMensagem
Vini_do_vale



Mensagens : 4
Data de inscrição : 29/08/2012

MensagemAssunto: DBGrid com Progressbar (Resolvido)   Qua Ago 29, 2012 10:31 pm

Preciso colocar uma progressbar em uma coluna do DBGrid, para por exemplo exibir a quantidade completa de uma tarefa. Não necessariamente precisa ser com progressbar, pode ser de qualquer forma desde que eu tenha dentro da coluna X uma barra representando a quantidade completada.


Última edição por Vini_do_vale em Seg Set 03, 2012 7:39 am, editado 1 vez(es)
Voltar ao Topo Ir em baixo
Ver perfil do usuário
vanix



Mensagens : 25
Data de inscrição : 20/01/2011

MensagemAssunto: Re: DBGrid com Progressbar (Resolvido)   Dom Set 02, 2012 7:37 pm

Vini_do_vale escreveu:
Preciso colocar uma progressbar em uma coluna do DBGrid, para por exemplo exibir a quantidade completa de uma tarefa. Não necessariamente precisa ser com progressbar, pode ser de qualquer forma desde que eu tenha dentro da coluna X uma barra representando a quantidade completada.


Não sei Entendi muito bém o que vc deseja, mas este exemplo não usa o componente Tprogress Bar, aqui é criada a barra para a terefa de
na dbgrid, veja o funcionamento e adpte ao que vc precisa.

Componentes usados:
timer = nome tmrProgresso.
ClientDataSet1
combobox1=nome cboEstiloProgressBar

propridade itens do combobox = Sólida
Segmentada

Text = Sólida



type
// alteração local para poder ter acesso à propriedade Row, sem
// ter que fazer aquela 'gambiarra' de criar uma classe 'hackeada'!!!
TDBGrid = class(DBGrids.TDBGrid)
public
property Row;
end;


private
procedure DisableDataControls;
procedure EnableDataControls;
procedure UpdateIndicators;
procedure SetupDataSet;
public
constructor Create(AOwner: TComponent); override;
end;

var
frmTempoChamados: TfrmTempoChamados;

implementation

uses
Math, SysUtils, Windows, DateUtils;

const
clLightOrange = TColor($0091C8FF);
clOrange = TColor($000080FF);

{$R *.dfm}


procedure TfrmTempoChamados.Button1Click(Sender: TObject);
begin
Close;
end;

constructor TfrmTempoChamados.Create(AOwner: TComponent);
begin
inherited;
Position := poScreenCenter;
BorderStyle := bsSingle;
BorderIcons := [biSystemMenu];
Application.Icon.Assign(Self.Icon);
Application.Title := Self.Caption;
SetupDataSet;
tmrProgresso.Enabled := true;
end;

procedure TfrmTempoChamados.UpdateIndicators;
var
rowDelta: Integer;
row: integer;
lNow: TDateTime;
lInterval, lDiff: Int64;
lPerc: Extended;
lBookmark: TBookmark;
begin
DisableDataControls;
lBookmark := ClientDataSet1.GetBookmark;
rowDelta := -1 + DBGrid1.Row;
row := ClientDataSet1.RecNo;
try
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
// cálcula tempo decorrido desde a abertura do chamado

{ 1 - verifica o intervalo total a ser verificado }
lInterval := Succ(MillisecondsBetween(
ClientDataSet1DATAHORACHAMADO.AsDateTime,
ClientDataSet1DATAHORACHAMADO.AsDateTime +
TimeOf(ClientDataSet1TEMPORESPONDER.AsDateTime)));

{ 2 - verifica quanto foi decorrido da ocorrência }
lNow := Now();
lDiff :=
MillisecondsBetween(ClientDataSet1DATAHORACHAMADO.AsDateTime, lNow);

{ 3 - calcula o percentual }
lPerc := Min((lDiff / lInterval) * 100.00, 100.00);

// configura 'barra de progresso' para o percentual calculado
ClientDataSet1.Edit;
if cboEstiloProgressBar.ItemIndex = 0 then
ClientDataSet1TEMPODECORRIDO.AsString :=
StringOfChar('g', Trunc(lPerc) div ClientDataSet1TEMPODECORRIDO.Size)
else
ClientDataSet1TEMPODECORRIDO.AsString :=
StringOfChar('¢', Trunc(lPerc) div ClientDataSet1TEMPODECORRIDO.Size);
ClientDataSet1.Post;

// vai para a próxima ocorrência a ser atualizada
ClientDataSet1.Next;
end;
finally
if ClientDataSet1.BookmarkValid(lBookmark) then
ClientDataSet1.GotoBookmark(lBookmark)
else
begin
ClientDataSet1.RecNo := row;
ClientDataSet1.MoveBy(-rowDelta);
ClientDataSet1.MoveBy(rowDelta);
end;
ClientDataSet1.FreeBookmark(lBookmark);
EnableDataControls;
end;
end;


procedure TfrmTempoChamados.tmrProgressoTimer(Sender: TObject);
begin
tmrProgresso.Enabled := false;
try
UpdateIndicators
finally
tmrProgresso.Enabled := true
end
end;

procedure TfrmTempoChamados.DisableDataControls;
begin
while not ClientDataSet1.ControlsDisabled do
ClientDataSet1.DisableControls
end;

procedure TfrmTempoChamados.EnableDataControls;
begin
while ClientDataSet1.ControlsDisabled do
ClientDataSet1.EnableControls
end;

procedure TfrmTempoChamados.ClientDataSet1NewRecord(DataSet: TDataSet);
begin
ClientDataSet1DATAHORACHAMADO.AsDateTime := Now()
end;

procedure TfrmTempoChamados.SetupDataSet;
begin
with ClientDataSet1 do
begin
CreateDataSet;
AppendRecord(['Problema na impressora', Now(), StrToTime('00:02:00'), EmptyStr]);
AppendRecord(['Windows não inicia', Now(), StrToTime('00:02:30'), EmptyStr]);
AppendRecord(['Impressora manchando impressões', Now(), StrToTime('00:01:45'), EmptyStr]);
end;
end;

procedure TfrmTempoChamados.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
const
AFontes: array[0..1] of string = ('Webdings', 'Wingdings 2');
Aligns: array[TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER);
var
lColor: TColor;
lText: string;
lRect: TRect;
begin
// pega o valor do campo a ser escrito na célula
lText := DBGrid1.DataSource.DataSet.FieldByName(Column.FieldName).DisplayText;

// associa a fonte usada pela coluna como fonte do grid para efeito de
// escrita do texto
DBGrid1.Canvas.Font.Assign(Column.Font);

// checa se a coluna é que conterá a 'barra de progresso' para
// definir a cor certa do texto
DBGrid1.Canvas.Font.Charset := ANSI_CHARSET;
if Column.FieldName = ClientDataSet1TEMPODECORRIDO.FieldName then
begin;
DBGrid1.Canvas.Font.Name := AFontes[cboEstiloProgressBar.ItemIndex];
DBGrid1.Canvas.Font.Charset := SYMBOL_CHARSET;
if Length(lText) >= 8 then // acima de 80% sem resposta
lColor := clRed
else if Length(lText) >= 6 then // acima de 60% sem resposta
lColor := clOrange
else if Length(lText) >= 4 then // acima de 40% sem resposta
lColor := clLightOrange
else if Length(lText) >= 2 then // acima de 20% sem resposta
lColor := clYellow
else // abaixo de 20% sem resposta
lColor := clGreen;
DBGrid1.Canvas.Font.Color := lColor;
end else if gdSelected in State then
DBGrid1.Canvas.Font.Color := clHighlightText
else
DBGrid1.Canvas.Font.Color := clWindowText;

// verifica a cor de fundo adequada para a célula de acordo
// com o seu estado no grid
if gdSelected in State then
DBGrid1.Canvas.Brush.Color := clBackground
else
DBGrid1.Canvas.Brush.Color := clWindow;
DBGrid1.Canvas.FillRect(Rect);

// ajusta área de escrita do texto
lRect := Rect;
InflateRect(lRect, -1, -1);

// desenha o texto com a função DrawText() da API do Windows
DrawText(DBGrid1.Canvas.Handle, PChar(lText), -1, lRect,
DT_VCENTER or DT_NOCLIP or DT_SINGLELINE or Aligns[Column.Alignment]);
end;




Espero que vc possa adptar ao que vc nescessida.
Voltar ao Topo Ir em baixo
Ver perfil do usuário
Vini_do_vale



Mensagens : 4
Data de inscrição : 29/08/2012

MensagemAssunto: Re: DBGrid com Progressbar (Resolvido)   Seg Set 03, 2012 7:39 am

vanix escreveu:
Vini_do_vale escreveu:
Preciso colocar uma progressbar em uma coluna do DBGrid, para por exemplo exibir a quantidade completa de uma tarefa. Não necessariamente precisa ser com progressbar, pode ser de qualquer forma desde que eu tenha dentro da coluna X uma barra representando a quantidade completada.


Não sei Entendi muito bém o que vc deseja, mas este exemplo não usa o componente Tprogress Bar, aqui é criada a barra para a terefa de
na dbgrid, veja o funcionamento e adpte ao que vc precisa.

Componentes usados:
timer = nome tmrProgresso.
ClientDataSet1
combobox1=nome cboEstiloProgressBar

propridade itens do combobox = Sólida
Segmentada

Text = Sólida



type
// alteração local para poder ter acesso à propriedade Row, sem
// ter que fazer aquela 'gambiarra' de criar uma classe 'hackeada'!!!
TDBGrid = class(DBGrids.TDBGrid)
public
property Row;
end;


private
procedure DisableDataControls;
procedure EnableDataControls;
procedure UpdateIndicators;
procedure SetupDataSet;
public
constructor Create(AOwner: TComponent); override;
end;

var
frmTempoChamados: TfrmTempoChamados;

implementation

uses
Math, SysUtils, Windows, DateUtils;

const
clLightOrange = TColor($0091C8FF);
clOrange = TColor($000080FF);

{$R *.dfm}


procedure TfrmTempoChamados.Button1Click(Sender: TObject);
begin
Close;
end;

constructor TfrmTempoChamados.Create(AOwner: TComponent);
begin
inherited;
Position := poScreenCenter;
BorderStyle := bsSingle;
BorderIcons := [biSystemMenu];
Application.Icon.Assign(Self.Icon);
Application.Title := Self.Caption;
SetupDataSet;
tmrProgresso.Enabled := true;
end;

procedure TfrmTempoChamados.UpdateIndicators;
var
rowDelta: Integer;
row: integer;
lNow: TDateTime;
lInterval, lDiff: Int64;
lPerc: Extended;
lBookmark: TBookmark;
begin
DisableDataControls;
lBookmark := ClientDataSet1.GetBookmark;
rowDelta := -1 + DBGrid1.Row;
row := ClientDataSet1.RecNo;
try
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
// cálcula tempo decorrido desde a abertura do chamado

{ 1 - verifica o intervalo total a ser verificado }
lInterval := Succ(MillisecondsBetween(
ClientDataSet1DATAHORACHAMADO.AsDateTime,
ClientDataSet1DATAHORACHAMADO.AsDateTime +
TimeOf(ClientDataSet1TEMPORESPONDER.AsDateTime)));

{ 2 - verifica quanto foi decorrido da ocorrência }
lNow := Now();
lDiff :=
MillisecondsBetween(ClientDataSet1DATAHORACHAMADO.AsDateTime, lNow);

{ 3 - calcula o percentual }
lPerc := Min((lDiff / lInterval) * 100.00, 100.00);

// configura 'barra de progresso' para o percentual calculado
ClientDataSet1.Edit;
if cboEstiloProgressBar.ItemIndex = 0 then
ClientDataSet1TEMPODECORRIDO.AsString :=
StringOfChar('g', Trunc(lPerc) div ClientDataSet1TEMPODECORRIDO.Size)
else
ClientDataSet1TEMPODECORRIDO.AsString :=
StringOfChar('¢', Trunc(lPerc) div ClientDataSet1TEMPODECORRIDO.Size);
ClientDataSet1.Post;

// vai para a próxima ocorrência a ser atualizada
ClientDataSet1.Next;
end;
finally
if ClientDataSet1.BookmarkValid(lBookmark) then
ClientDataSet1.GotoBookmark(lBookmark)
else
begin
ClientDataSet1.RecNo := row;
ClientDataSet1.MoveBy(-rowDelta);
ClientDataSet1.MoveBy(rowDelta);
end;
ClientDataSet1.FreeBookmark(lBookmark);
EnableDataControls;
end;
end;


procedure TfrmTempoChamados.tmrProgressoTimer(Sender: TObject);
begin
tmrProgresso.Enabled := false;
try
UpdateIndicators
finally
tmrProgresso.Enabled := true
end
end;

procedure TfrmTempoChamados.DisableDataControls;
begin
while not ClientDataSet1.ControlsDisabled do
ClientDataSet1.DisableControls
end;

procedure TfrmTempoChamados.EnableDataControls;
begin
while ClientDataSet1.ControlsDisabled do
ClientDataSet1.EnableControls
end;

procedure TfrmTempoChamados.ClientDataSet1NewRecord(DataSet: TDataSet);
begin
ClientDataSet1DATAHORACHAMADO.AsDateTime := Now()
end;

procedure TfrmTempoChamados.SetupDataSet;
begin
with ClientDataSet1 do
begin
CreateDataSet;
AppendRecord(['Problema na impressora', Now(), StrToTime('00:02:00'), EmptyStr]);
AppendRecord(['Windows não inicia', Now(), StrToTime('00:02:30'), EmptyStr]);
AppendRecord(['Impressora manchando impressões', Now(), StrToTime('00:01:45'), EmptyStr]);
end;
end;

procedure TfrmTempoChamados.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
const
AFontes: array[0..1] of string = ('Webdings', 'Wingdings 2');
Aligns: array[TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER);
var
lColor: TColor;
lText: string;
lRect: TRect;
begin
// pega o valor do campo a ser escrito na célula
lText := DBGrid1.DataSource.DataSet.FieldByName(Column.FieldName).DisplayText;

// associa a fonte usada pela coluna como fonte do grid para efeito de
// escrita do texto
DBGrid1.Canvas.Font.Assign(Column.Font);

// checa se a coluna é que conterá a 'barra de progresso' para
// definir a cor certa do texto
DBGrid1.Canvas.Font.Charset := ANSI_CHARSET;
if Column.FieldName = ClientDataSet1TEMPODECORRIDO.FieldName then
begin;
DBGrid1.Canvas.Font.Name := AFontes[cboEstiloProgressBar.ItemIndex];
DBGrid1.Canvas.Font.Charset := SYMBOL_CHARSET;
if Length(lText) >= 8 then // acima de 80% sem resposta
lColor := clRed
else if Length(lText) >= 6 then // acima de 60% sem resposta
lColor := clOrange
else if Length(lText) >= 4 then // acima de 40% sem resposta
lColor := clLightOrange
else if Length(lText) >= 2 then // acima de 20% sem resposta
lColor := clYellow
else // abaixo de 20% sem resposta
lColor := clGreen;
DBGrid1.Canvas.Font.Color := lColor;
end else if gdSelected in State then
DBGrid1.Canvas.Font.Color := clHighlightText
else
DBGrid1.Canvas.Font.Color := clWindowText;

// verifica a cor de fundo adequada para a célula de acordo
// com o seu estado no grid
if gdSelected in State then
DBGrid1.Canvas.Brush.Color := clBackground
else
DBGrid1.Canvas.Brush.Color := clWindow;
DBGrid1.Canvas.FillRect(Rect);

// ajusta área de escrita do texto
lRect := Rect;
InflateRect(lRect, -1, -1);

// desenha o texto com a função DrawText() da API do Windows
DrawText(DBGrid1.Canvas.Handle, PChar(lText), -1, lRect,
DT_VCENTER or DT_NOCLIP or DT_SINGLELINE or Aligns[Column.Alignment]);
end;




Espero que vc possa adptar ao que vc nescessida.





deu para adaptar sim Valeu!.
Voltar ao Topo Ir em baixo
Ver perfil do usuário
Conteúdo patrocinado




MensagemAssunto: Re: DBGrid com Progressbar (Resolvido)   Hoje à(s) 5:13 am

Voltar ao Topo Ir em baixo
 
DBGrid com Progressbar (Resolvido)
Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo 
Página 1 de 1
 Tópicos similares
-
» [RESOLVIDO] Dinâmica de água
» [Resolvido]Problema com terreno acidentado
» [Resolvido] Como saber qual objeto esta mais perto?
» [Resolvido] Criptografar Imagem
» [Resolvido] Como configuro o meu para aparecer as categorias em vez dos topicos?

Permissão deste fórum:Você não pode responder aos tópicos neste fórum
Clube da Programação e Hardware :: PROGRAMAÇÃO :: Delphi-
Ir para: