Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Colocar o Gauge na Linha Selecionada de um DBGrid


Luciano Umbelino

Pergunta

Pessoal bom dia,

Estou precisando de um auxílio, tenho uma thread que transmite via FTP(Indy 10), arquivos que estão em linhas de um dbgrid, quero faze um gauge mostrando o andamento da transferência na linha que aponta o arquivo que está sendo transmitido. O FTP está funcionando e coloquei o incrementação do gauge no eveno OnWork, só que está acontecendo que o gauge não está sendo exibido, peço a quem puder que me auxilie a resolver esse problema. Farei uma breve descrição dos eventos OnWorkBegin, OnWork e OnWokEnd:

Essas procedures estão na minha thread que responsável pela transmissão efetivamente.

procedure EnviaArquivo.FTPWorkBegin(ASender: TObject;

AWorkMode: TWorkMode; AWorkCountMax: Int64);

begin

if frmLstLogTransm <> nil then //Aqui eu verifico se o form está criado para evitar acces violation

begin

frmLstLogTransm.Gauge1.Visible := True;

frmLstLogTransm.Gauge1.Progress := 0;

if AWorkCountMax > 0 then

frmLstLogTransm.Gauge1.MaxValue := AWorkCountMax

else

frmLstLogTransm.Gauge1.MaxValue := TamanhoArqFTP;

end;

end;

procedure EnviaArquivoFTPWork(ASender: TObject; AWorkMode: TWorkMode;

AWorkCount: Int64);

begin

if frmLstLogTransm <> nil then

begin

// frmLstLogTransm.Gauge1.Progress := AWorkCount; //havia tentando a incrementação dessa maneira mas vi que neste campo só contem

//o tamanho total do arquivo

frmLstLogTransm.Gauge1.Progress := frmLstLogTransm.Gauge1.Progress + 1; //Por isso fiz dessa outra maneira

application .processmessages;

end;

end;

procedure EnviaOcorrenciasCanalFD.FTPWorkEnd(ASender: TObject;

AWorkMode: TWorkMode);

begin

if frmLstLogTransm <> nil then

frmLstLogTransm.Gauge1.Progress := TamanhoArqFTP;

end;

frmlstLogTransm é o form que contem o dbgrid com a relação de arquivos a serem transmitidos.

Está acontecendo que no dbGrid não aparece o gauge com o progresso da transmissão.

Bem, desde já agradeço.

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

De forma simples seria

procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
   Gauge1.Progress := AWorkCount;
   Gauge1.Refresh;

   // comandos
end;

procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
   Gauge1.MaxValue := AWorkCountMax;

   // comandos
end;

OBS: o componente Gauge deve ficar fora do DBgrid

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
De forma simples seria

procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
   Gauge1.Progress := AWorkCount;
   Gauge1.Refresh;

   // comandos
end;

procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
   Gauge1.MaxValue := AWorkCountMax;

   // comandos
end;

OBS: o componente Gauge deve ficar fora do DBgrid

abraço

Olá Jhonas, boa tarde, primeiramente grato pela sua atenção e boa vontade.

Então, uma coisa que quero é realmente fazer com que o gauge aparece na linha onde o arquivo que esta sendo transmitido apareça.

Mas para efeito de teste, pelo menos para ver o bendito gauge, fiz como você indicou e nem assim apareceu o bendito gauge, com certeza estou fazendo alguma coisa errada que ainda não descobri, estou basicamente a dois dias nisso sem uma solução satisfatória, se você tiver mais alguma dica ou algum caminho a seguir, será bem vinda.

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0
De forma simples seria

procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
   Gauge1.Progress := AWorkCount;
   Gauge1.Refresh;

   // comandos
end;

procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
   Gauge1.MaxValue := AWorkCountMax;

   // comandos
end;

OBS: o componente Gauge deve ficar fora do DBgrid

abraço

Olá Jhonas, boa tarde, primeiramente grato pela sua atenção e boa vontade.

Então, uma coisa que quero é realmente fazer com que o gauge aparece na linha onde o arquivo que esta sendo transmitido apareça.

Mas para efeito de teste, pelo menos para ver o bendito gauge, fiz como você indicou e nem assim apareceu o bendito gauge, com certeza estou fazendo alguma coisa errada que ainda não descobri, estou basicamente a dois dias nisso sem uma solução satisfatória, se você tiver mais alguma dica ou algum caminho a seguir, será bem vinda.

Grato.

Bem evoluiu a situação, estava acontecendo que o align do dbgrid estava alClient, portanto o bendito do gauge não aparecia.

Graças a dica do Jhonas verifiquei isso e ví que o gauge está funcionando.

Pois bem a questão agora é como colocar esse gauge na linha do dbgrid que indica o arquivo que está sendo transmitido, de maneira que o gauge sobreponha o dbgrid e fique visivel?

Link para o comentário
Compartilhar em outros sites

  • 0
Pois bem a questão agora é como colocar esse gauge na linha do dbgrid que indica o arquivo que está sendo transmitido, de maneira que o gauge sobreponha o dbgrid e fique visivel?

Eu prefiro criar um campo a mais na tabela onde ficara o gauge... esteticamente fica mais apresentavel

então seguindo esse raciocinio :

1 - acrescente um campo na sua tabela com o nome de gauge do tipo string com 20 posições

2 - coloque um componente Panel e dentro dele coloque um componente Gauge, ajustando o seu tamanho dentro do Panel ... O panel é necessário, pois o gauge ficaria atras do dbgrid e não seria mostrado

3 - defina o tamanho do Panel para que se ajuste ao tamanho do campo da celula do dbgrid ( campo gauge )

3 - coloque no evento OnDrawCell do DBGrid o codigo abaixo:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  DrawState: Integer;
  DrawRect: TRect;
begin
  if (gdFocused in State) then
  begin
    if (Column.Field.FieldName = 'GAUGE') then
    begin
     Panel1.Left := Rect.Left + DBGrid1.Left + 2;
     Panel1.Top := Rect.Top + DBGrid1.top + 2;
     Panel1.Width := Rect.Right - Rect.Left;
     Panel1.Height := Rect.Bottom - Rect.Top;
     Panel1.Visible := True;
    end
  end
  else
  begin
    if (Column.Field.FieldName = 'GAUGE') then
    begin
      DrawRect:=Rect;
      InflateRect(DrawRect,-1,-1);
      DBGrid1.Canvas.FillRect(Rect);
      DrawFrameControl(DBGrid1.Canvas.Handle, DrawRect,
        DFC_BUTTON, DrawState);
    end;
  end;

end;

OBS: ao clicar em uma linha de registro, o gauge aparecerá nessa linha ... o resto é só adaptar

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Pois bem a questão agora é como colocar esse gauge na linha do dbgrid que indica o arquivo que está sendo transmitido, de maneira que o gauge sobreponha o dbgrid e fique visivel?

Eu prefiro criar um campo a mais na tabela onde ficara o gauge... esteticamente fica mais apresentavel

então seguindo esse raciocinio :

1 - acrescente um campo na sua tabela com o nome de gauge do tipo string com 20 posições

2 - coloque um componente Panel e dentro dele coloque um componente Gauge, ajustando o seu tamanho dentro do Panel ... O panel é necessário, pois o gauge ficaria atras do dbgrid e não seria mostrado

3 - defina o tamanho do Panel para que se ajuste ao tamanho do campo da celula do dbgrid ( campo gauge )

3 - coloque no evento OnDrawCell do DBGrid o codigo abaixo:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  DrawState: Integer;
  DrawRect: TRect;
begin
  if (gdFocused in State) then
  begin
    if (Column.Field.FieldName = 'GAUGE') then
    begin
     Panel1.Left := Rect.Left + DBGrid1.Left + 2;
     Panel1.Top := Rect.Top + DBGrid1.top + 2;
     Panel1.Width := Rect.Right - Rect.Left;
     Panel1.Height := Rect.Bottom - Rect.Top;
     Panel1.Visible := True;
    end
  end
  else
  begin
    if (Column.Field.FieldName = 'GAUGE') then
    begin
      DrawRect:=Rect;
      InflateRect(DrawRect,-1,-1);
      DBGrid1.Canvas.FillRect(Rect);
      DrawFrameControl(DBGrid1.Canvas.Handle, DrawRect,
        DFC_BUTTON, DrawState);
    end;
  end;

end;

OBS: ao clicar em uma linha de registro, o gauge aparecerá nessa linha ... o resto é só adaptar

abraço

(Resolvido)

Grande Jhonas!!!

Fiz algumas modificações apenas para já exibir o gauge, pois o arquivo é transmitido assim que entra na lista, sem haver intervenção do usuário, e está funcionando bem a contento. Pode colocar o post como resolvido por gentileza.

Amigo, super agradecido, que bom poder contar com pessoas de boa vontade. Espero que você continue a ter a disponibilidade de auxiliar a quem precisa. Quem recebe o bem é quem sabe o bem que tem.

Grato, bom natal e felicidade a todos.

Editado por Luciano Umbelino
Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia.

Possuo a mesma dúvida, tenho um DBGrid, mas não é de Download, que já possui os valores máximos e atuais; gostaria de colocar um gauge para cada linha desses valores.

Tentei adaptar o código, mas infelizmente, por falta de prática e conhecimento, não obtive muito sucesso.

Caso alguém possa me dar alguma luz, fico agradecido!

Link para o comentário
Compartilhar em outros sites

  • 0
Possuo a mesma dúvida, tenho um DBGrid, mas não é de Download, que já possui os valores máximos e atuais; gostaria de colocar um gauge para cada linha desses valores

voce quer usar o gauge no DBGrid para qual finalidade ? tem que explicar melhor a sua idéia.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Possuo a mesma dúvida, tenho um DBGrid, mas não é de Download, que já possui os valores máximos e atuais; gostaria de colocar um gauge para cada linha desses valores

voce quer usar o gauge no DBGrid para qual finalidade ? tem que explicar melhor a sua idéia.

abraço

Possuo duas colunas, uma com quantidade da produtos produzidos e outra a produzir. Seria como se fosse uma "meta".

Link para o comentário
Compartilhar em outros sites

  • 0
Possuo a mesma dúvida, tenho um DBGrid, mas não é de Download, que já possui os valores máximos e atuais; gostaria de colocar um gauge para cada linha desses valores

voce quer usar o gauge no DBGrid para qual finalidade ? tem que explicar melhor a sua idéia.

abraço

Possuo duas colunas, uma com quantidade da produtos produzidos e outra a produzir. Seria como se fosse uma "meta".

Opa senhores, com ajuda de um amigo, consegui tal façanha:

if (Column.Field.FieldName = 'nome_coluna') then
  begin
    DrawRect:=Rect;
    InflateRect(DrawRect,-1,-1);
    painel.Width := Rect.Right - Rect.Left;
    painel.Height := Rect.Bottom - Rect.Top;
    
    gauge.MaxValue := dbgrid.Columns.Items[3].Field.AsInteger;
    gauge.Progress := dbgrid.Columns.Items[4].Field.AsInteger;
    gauge.Visible := True;
    dbgrid.Canvas.FillRect(Rect);
    DrawFrameControl(dbgrid.Canvas.Handle, DrawRect, DFC_Button, 0);
    painel.PaintTo(dbgrid.Canvas.Handle, Rect.Left, Rect.Top);
  end;

Funcionou certinho.

Agora problema nro 2 eheh... colocar o gauge como Double... tentei mudar na unit samples, mas não fui muito feliz não... alguma outra solução, pois preciso usar, por exemplo, 0,5%, números fracionados.

Desculpem pela ignorância, mas sou iniciante em delphi rs.

Obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0
Agora problema nro 2 eheh... colocar o gauge como Double... tentei mudar na unit samples, mas não fui muito feliz não... alguma outra solução, pois preciso usar, por exemplo, 0,5%, números fracionados.
como voce percebeu o gauge e o progressbar só aceita numeros inteiros

Então a lógica para um Gauge de 100 %

para cada 1% = "|" precisamos fazer um looping 100 vezes

( 100 barrinhas )

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

como a fonte usada nas barrinhas é o script, as barrinhas parecem uma unica barra cheia

Para um Gauge com incremento de 0.5 % teriamos que ter um Gauge com duzentas barrinhas

para cada 0.5% = "|" precisamos fazer um looping 200 vezes para obtermos os mesmos 100 %

nesse caso voce teria que criar o seu proprio gauge para que ele aceite numeros do tipo float

Desculpem pela ignorância, mas sou iniciante em delphi rs.

Como voce é iniciante, não teria como te explicar isso... mas seria algo parecido com isso

OBS: Esse código é só para exemplificar o que estou falando

procedure TForm1.Button1Click(Sender: TObject);
var X: Integer; Total: Integer; Percent1: string;
begin
   Total := 200;
   for X := 1 to Total do
      begin
         
         Percent1 := formatfloat(',0.00',((X * 100) / Total));
         Label1.Caption := Label1.Caption +'|';
         Label1.Repaint;
         Label2.Caption := Percent1;
         Label2.Refresh;
         Sleep(100);
      end;
end;

ou voce pode procurar na net algum componente gauge que aceite numeros do tipo float

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...