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

(Resolvido) Imagem piscando por causa do timer


Vivendo&Aprendendo

Pergunta

Olá pessoal!

Seguinte, preciso colocar uma label em um panel para que ela fique andando sempre mostrando o valor que a empresa tem a receber e a pagar, isso eu já fiz.

O problema é o seguinte, tenho um timer para fazer a label andar e tenho uma imagem como plano de fundo do meu sistema que cada usuário tem a sua própria conforme o gosto, essa imagem eu salvo apenas o caminho no banco de dados, e ai vem o problema quando a label começa a andar no panel e imagem fica piscando a cada "passo" que a label dá.

Porque isso acontece?

Fiz um teste em um form sozinho com a label, o timer, image, e buscando a imagem de fundo do banco e deu certinho, só fica piscando na minha aplicação.

Abraços

Alexandre

Editado por Vivendo&Aprendendo
Link para o comentário
Compartilhar em outros sites

21 respostass a esta questão

Posts Recomendados

  • 0
Fiz um teste em um form sozinho com a label, o timer, image, e buscando a imagem de fundo do banco e deu certinho, só fica piscando na minha aplicação.

use a propriedade DoubleBuffered para resolver isto.

property DoubleBuffered: Boolean;

veja estes posts

http://scriptbrasil.com.br/forum/index.php...=DoubleBuffered

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Jhonas...

Colocquei no oncreate do form:

PnTopo.DoubleBuffered := True; //Painel onde está a Label que esta andando.

ImgPrinc.DoubleBuffered := True; //Timage onde está uma imgem de plano de fundo que fica piscando, neste componente não aceitou esse comando

FrmPrincipal.DoubleBuffered := True; //Form onde estão o TImage e o label que está andando.

Não deu certo a imagem continua piscando.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Fiz um teste em um form sozinho com a label, o timer, image, e buscando a imagem de fundo do banco e deu certinho, só fica piscando na minha aplicação.

Vivendo&Aprendendo, isso demonstra que o flicker deve estar associado a forma como este seu backgroud é mostrado no form do seu sistema.

Como você implementou ele?

Já que um panel é opaco, você deve estar fazendo algo para que a imagem apareça no fundo dele também.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Micheus e Jhonas.

É o seguinte, tenho um form que nele tem: um TImage (ImgPrinc) como plano de fundo que recebe a imagem onde o endereço dessa imagem está salvo no banco de dados, tem um Panel (PnTopo) que fica no topo do form e neste panel tenho uma label (LblInf) que deve ficar "andando" pelo panel (PnTopo). A imagem do TImage (ImgPrinc) não tem nada haver com o código que faz a Label (LblInf) andar no panel.

Segue abaixo o código do Timer que faz a label andar e o código que puxa o endereço do banco de dados e joga a imagem no Timage.

Código do Timer:

If LblInf.Top >= -(LblInf.Height) then
    LblInf.Top := LblInf.Top - 1
  else
    LblInf.Top := PnTopo.Height;
Código para puxar a imagem que está no OnActivate do Form:
Try
    OpenPictureDialog.FileName := DmDados.Senhas.FieldByName('Tela').AsString;
    ImgPrinc.Picture.LoadFromFile(OpenPictureDialog.FileName);
  except
    Application.MessageBox('A Figura não foi encontrada!','Aviso',mb_IconInformation +mb_ok);
  end;

É isso ai, se puderem me ajudar agradeço;

Alexandre

Link para o comentário
Compartilhar em outros sites

  • 0
Segue abaixo o código do Timer que faz a label andar e o código que puxa o endereço do banco de dados e joga a imagem no Timage.

Código do Timer:

If LblInf.Top >= -(LblInf.Height) then
    LblInf.Top := LblInf.Top - 1
  else
    LblInf.Top := PnTopo.Height;
Código para puxar a imagem que está no OnActivate do Form:
Try
    OpenPictureDialog.FileName := DmDados.Senhas.FieldByName('Tela').AsString;
    ImgPrinc.Picture.LoadFromFile(OpenPictureDialog.FileName);
  except
    Application.MessageBox('A Figura não foi encontrada!','Aviso',mb_IconInformation +mb_ok);
  end;

Vivendo&Aprendendo, se fizer isto que você sugere, no máximo vou lhe responder com o que você postou inicialmente:

Fiz um teste em um form sozinho com a label, o timer, image, e buscando a imagem de fundo do banco e deu certinho.
Digo isto porque já tenho um demo nestas condições.

você não conseguiria fazer uma aplicação (inútil) com este "defeito" pra que ser possa avaliar?

Este lance do background ainda está meio obscuro.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá

você não conseguiria fazer uma aplicação (inútil) com este "defeito" pra que ser possa avaliar?

Este lance do background ainda está meio obscuro.

É o seguinte, tenho um form que nele tem: um TImage (ImgPrinc) como plano de fundo que recebe a imagem onde o endereço dessa imagem está salvo no banco de dados, tem um Panel (PnTopo) que fica no topo do form e neste panel tenho uma label (LblInf) que deve ficar "andando" pelo panel (PnTopo). A imagem do TImage (ImgPrinc) não tem nada haver com o código que faz a Label (LblInf) andar no panel.

O plano de fundo é um componente TImagem, no meu banco de dados tenho uma tabela de Senhas para cadastrar os usuários do sistema, a sua senha, as telas que ele poderá ter acesso e a imagem que ele configurar como plano de fundo. Essa é a imagem que aparecerá no plano de fundo sempre que ele acessar o sistema, na tabela eu salvo apenas o caminho da imagem, ai quando acesso o sistema no OnActivate ele vai la na tabela verifica o caminho e joga a imagem para o TIMagem, tudo isso funciona certinho.

O problema é que agora quero colocar no form uma label para ficar "andando" e mostrando quanto o usuário ainda tem para Receber e para Pagar até o dia autal, isso também está certinho, mas quando abro o sistema e a label começa a "andar" o TImage fica piscando conforme a intervalo atribuido no Timer.

Esse é o meu problema...

Não sei se fui claro...

Abraços

Editado por Vivendo&Aprendendo
Link para o comentário
Compartilhar em outros sites

  • 0
O problema é que agora quero colocar no form uma label para ficar "andando" e mostrando quanto o usuário ainda tem para Receber e para Pagar até o dia autal, isso também está certinho, mas quando abro o sistema e a label começa a "andar" o TImage fica piscando conforme a intervalo atribuido no Timer.

Esse é o meu problema...

Não sei se fui claro...

Vivendo&Aprendendo, foi claro como já havia sido antes.

Mas, eu também vou tentar ser mais claro na minha respota: também tenho um exemplo com um form que tem um TImage (align = alClient), um TPanel (align = alTop) e um TLabel dentro deste panel, sendo movido via propriedade Left (da direita para a esquerda) através do evento OnTimer de um TTimer com temporiação de 100ms e nada de DoubleBuffered setado. (mesmo fazendo o label rolar na vertical e adicionando botões, não houve qualquer mudança)

E... Nada de piscar!

Como vê, a menos que você consiga fazer uma pequena aplicação que gere o efeito que você descreve e compartilhe com quem se habilitar a ajudar, você não vai ter resposta a este tópico.

Muito provavelmente, há algum suposto "detalhe" que está gerando este probleminha e, nestas condições, só você conseguirá achá-lo.

Abraços e boa sorte.

Link para o comentário
Compartilhar em outros sites

  • 0
Muito provavelmente, há algum suposto "detalhe" que está gerando este probleminha e, nestas condições, só você conseguirá achá-lo.

Bom, agora sabemos qual o "detalhe" que impedia a repetição do problema no exemplo que eu tinha: você não mencionou que este form era um fsMDIForm.

O problema passa por uma observação que já foi feita em outro post - a existência de uma janela na área de fundo do form MDI principal.

Entretanto, no caso do componente TImage, não daria para aplicar o lance do SetParent porque este componente não tem um handle de janela (como usado no post citado).

A solução chega a ser boba, mas resolve:

- remova este seus TImage;

- adicione um TPanel, ajuste align com alClient, BevelInner e BevelOut com bvNone

- coloque seus TImage neste panel, normalmente.

Só isto!!

Seguem algumas recomendações com relação a fração do projeto enviado:

1) Evite imagens com tamanhos exagerados. A "Plano d Fundo 01.jpg" tem dimensões 3236x2427 e 300ppp (1MB). Note que isto é resolução para impressão. Em geral, monitores não chegam a esta resolução, bem como não excedem 96ppp. Redimensionar a imagem para um tamanho mais razoável (350KB), poupará memória e processamento ao redesenhar a mesma;

2) num procedimento deste tipo, tente usar a lógica:

procedure TFrmPrincipal.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  If Application.MessageBox('Têm certeza que deseja finalizar o sistema?','Aviso !',MB_ICONQuestion +MB_YESNO) = MrYes Then
    CanClose := True
  Else
    CanClose := False;
end;
o resultado da expressão no if .. then, já não resultará em True ou False? Então, simplesmente atribua ele à variável:
procedure TFrmPrincipal.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := Application.MessageBox('Têm certeza que deseja finalizar o sistema?', 
                                     'Aviso !',MB_ICONQuestion +MB_YESNO) = MrYes;
end;
3) no evento OnActivate, não há porque você utilizar o OpenPictureDialog como intermediário - use o campo diretamente:
...
  try
   // ** ISSO...
   //  OpenPictureDialog.FileName := DmDados.Senhas.FieldByName('Tela').AsString;
   //  ImgPrinc.Picture.LoadFromFile(OpenPictureDialog.FileName);
   // ** FICA APENAS ASSIM...
    ImgPrinc.Picture.LoadFromFile(DmDados.Senhas.FieldByName('Tela').AsString);
  except
   ...
end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Micheus...

Muito obrigado pelas dicas... Só há um problema ainda... fiz as alterações que você me enviou, mas quando coloco um panel e o image sobre ele e ai abro os forms do meu sistema que são MDI os forms não aparecem, eles ficam atrás do panel.

Já tentei dar um Send To Back mas não funcionou.

O que pode ser?

Abraços

Editado por Vivendo&Aprendendo
Link para o comentário
Compartilhar em outros sites

  • 0
Só há um problema ainda... fiz as alterações que você me enviou, mas quando coloco um panel e o image sobre ele e ai abro os forms do meu sistema que são MDI os forms não aparecem, eles ficam atrás do panel.

Agora você pode fazer uso daquele post que passei como referência e deverá funcionar.

No evento OnCreate do seu form, use o comando abaixo, passando o Panel em questão como parâmetro:

Windows.SetParent(Panel1.Handle, ClientHandle);

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olha Micheus funcionou, agora os forms aparecem na frente do panel, mas ainda há um probleminha: a imagem que eu escolho para abrir como plano de fundo não vem no tamanho correto, ou seja, ela pega apenas um pedaço do form e o outro fica sem nada, no topo e na esquerda ela fica sem imagem, tipo fica como começando a imagem no left 50 e no topo 30 por exemplo..

Link para o comentário
Compartilhar em outros sites

  • 0
a imagem que eu escolho para abrir como plano de fundo não vem no tamanho correto, ou seja, ela pega apenas um pedaço do form e o outro fica sem nada, no topo e na esquerda ela fica sem imagem, tipo fica como começando a imagem no left 50 e no topo 30 por exemplo..

bom, estes problemas deveriam estar relacionados com as propriedades da figura (align, stretch, center, autosize e proportional) e acredito que você tenha que verificar isto.

A princípio, seu form principal deveria estar com um panel align=alTop (o dos botões) e outro align=alClient (o das figuras). Neste último estaria sua figura da esquerda (com align=alLeft) e a da imagem central com align=alClient e stretch=true. (se não me engano)

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus me desculpe, mas configurei o panel e o timage, já troquei as propriedades para ver se muda alguma coisa e nada. No topo fica em branco como se não tivesse imagem.

As propriedades estão da seguinte maneira:

Panel da imagem

Align = alcliente

bevelinier = bvnone

bevelouter = bvnone

Dentro desse panel estão os dois images da esquerda e o central.

Image:

Align = alclient

AutoSize = true

Center = true

Stretch = true

Essas já mudei para false e não funcionou também.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus me desculpe, mas configurei o panel e o timage, já troquei as propriedades para ver se muda alguma coisa e nada. No topo fica em branco como se não tivesse imagem.

Ok. Dei uma verificada no exemplo, fazendo aquela última alteração que lhe havia sugerido e realmente observei o problema citado.

Não vou me alongar explicando o motivo, mas está relacionado a forma como aquela "janela de fundo" (ClientHandle) avalia a área a ser pintada, ajustando o posicionamento/alinhamento dos componentes nela colocados (nosso panel) ou sobre ela colocados (PnTop - panel do menu). Assim, não poderemos usar a propriedade Align=alClient para o Panel1.

Para contornarmos este novo problema, observe o seguinte:

- PnTop (panel do menu) -> Align=alTop

- StbBarra (barra de status) -> Align=alBottom

- Panel1 (panel onde colocaremos as imagens - no miolo da tela) -> Align=alNone; não se preocupe com a largura e altura dele, bem como com o posicionamento;

No Panel1, coloque os componentes:

- ImgLetreiro (imagem lateral esquerda) Align=alLeft; Stretch=True; AutoSize=True; Center=False; Proportional=False;

- ImgPrinc (imagem que ocupa a área central) Align=alClient; Stretch=True; AutoSize=False; Center=True; Proportional=False;

No evento OnCreate do FrmPrincipal, coloque o seguinte código:

procedure TFrmPrincipal.FormCreate(Sender :TObject);
begin
 // Fazemos o Panel1 ficar "grudado" na área client do form MDI
  Windows.SetParent(Panel1.Handle, ClientHandle);
 // garantimos o posicionamento inicial do Panel1
  Panel1.Top := 0;
  Panel1.Left := 0;
 // forçamos a atualização das dimensões do Panel1
  FormResize(Sender);
end;
No evento OnResize do FrmPrincipal, coloque o seguinte código:
procedure TFrmPrincipal.FormResize(Sender: TObject);
begin
 // Recalculamos as dimensões do Panel, baseado no novo tamanho da janela
  Panel1.Height := ClientRect.Bottom -PnTopo.Height -StbBarra.Height -4;
  Panel1.Width := ClientRect.Right -4;
end;

Com estas alterações, acho que você consegue fechar este tópico.

Abraços

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,4k
×
×
  • Criar Novo...