Sign in to follow this  
Pimpao

[resolvido] Efeito "marquee" No Delphi

Recommended Posts

Aew pessoal,

Preciso fazer um trabalho do curso, e tenho que fazer com que o label se movimente, (propriedade left) e quando ele chega no fim do form aparesse do outro lado, até ai beleza.

O problema está aqui: eu tinha que fazer com que a medida que os caracteres fossem sumindo do form iam aparecendo do outro lado do formulário e continuassem se movimentando.

É como o efeito "marquee" do codigo html...

Espero respostas, desde já agradeço.

Rafael.

Share this post


Link to post
Share on other sites
O problema está aqui: eu tinha que fazer com que a medida que os caracteres fossem sumindo do form iam aparecendo do outro lado do formulário e continuassem se movimentando.
Vale utilizar outro label?

Share this post


Link to post
Share on other sites
Sim

contando que fike do jeito que eu falei vale tudo ^^

Nem tudo. O trabalho do curso é seu e você deve fazê-lo. ;)

A pergunta deveria ser uma dica.

Voce deve saber que vai precisar de um timer (para mover a posição num intervalo de tempo) e dois labels. O lance é fazer um label entrar no final da área client (ClientWidth ou ClientHeigth) enquanto o outro vai saindo (Left ou Top). Observe que o mesmo tanto que sair de um lado deve estar entrando no outro.

Share this post


Link to post
Share on other sites
Nem tudo. O trabalho do curso é seu e você deve fazê-lo. ;)

A pergunta deveria ser uma dica.

err....meu amigo, eu fiz o trabalho, está quase pronto (só falta isso) se você quiser dar uma olhada pra ver como ficou, segue o link:

http://rapidshare.com/files/31315427/reverter.rar

eu so preciso saber como eu faco o efeito marquee... que eu vou precisar de um timer isso eu sei, é só o efeito marquee mesmo...

dê uma olhada no projeto pra você entender melhor...

Obrigado, abraços

Edited by Pimpao

Share this post


Link to post
Share on other sites

seu programa está com um errinho, vo escreve algo, manda ele para, apaga o que você escreveu,escreve outra coisa e manda ele inverter, a palavrinha que fica se mexendo aparece o invertido do que você escreveu antes com o invertido que você escreveu agora pouco.

Ex:

1ª vez que escreve : asdf

invertido : fdsa

aparece a palavra se movendo "fdsa"

apaga o "asdf"

2º vez que escreve : qwer

invertido : rewq

aparece a palavra se movendo "fdsarewq"

da uma olhada aí XD

p.s : o projeto é seu e não sei o que pretendes fazer com ele, mas eu faria uma procedure para que toda vez que o você escreveu mude, o edit.text do "invertido" se apague, ouse seja edit.text := '';

Edited by deio

Share this post


Link to post
Share on other sites
err....meu amigo, eu fiz o trabalho, está quase pronto (só falta isso) se você quiser dar uma olhada pra ver como ficou, segue o link:

http://rapidshare.com/files/31315427/reverter.rar

eu so preciso saber como eu faco o efeito marquee... que eu vou precisar de um timer isso eu sei, é só o efeito marquee mesmo...

"só falta isso", justamenta a parte mais complexa do programa. A única que exige algum esforço. ;)

Observei que é um trabalho em dupla...

Siga a dica que dei, utilize dois labels. Comece com um visível (seu label6) e outro oculto (novo label7). Quando o label visível ultrapassar os limites da janela, torne o outro visível e siga movendo ele (como fez com o anterior). Mas antes de dar visibilidade a ele, calcule a posição em que deverá aparecer: é a quantidade de pixels que ultrapassaram a janela. Como achar essa posição:

label7.Left := -(label7.Canvas.TextWidth(label7.caption) -((label6.left +label6.Canvas.TextWidth(label6.Caption)) -clientwidth));

vou por metade do código aqui, se você entendeu o espírito da coisa, completará a outra metade:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if not label6.visible then
  begin
    if ((label7.left +label7.Canvas.TextWidth(label6.Caption)) > clientwidth) then
    begin
      label6.Left := -(label6.Canvas.TextWidth(label6.caption) -((label7.left +label7.Canvas.TextWidth(label7.Caption)) -clientwidth));
      label6.Visible := true;
    end;
  end else
  begin
    if (label6.Left+2) >= ClientWidth then
      label6.visible := false
    else
      label6.Left := label6.Left+2;
  end;

  """
end;

Não esqueça de levar em consideração as observações pertinentes do deio

Outra dica, faça a identação do código porque visualizar lógicas com if's sem identação é complicado - dá muito trabalho.

Share this post


Link to post
Share on other sites

@deio: vlw eu já arrumei o que você disse xD

@micheus: beleza, vo tenta fazer, qlqr coisa posto aí (vou comecar a adicionar comentarios no codigo...vlw)

Edited by Pimpao

Share this post


Link to post
Share on other sites
@micheus: beleza, vo tenta fazer, qlqr coisa posto aí (vou comecar a adicionar comentarios no codigo...vlw)
Comentários também são bons, mas eu me refiro a identação. Veja o mesmo código que postei antes da forma como você faz em seu código fonte:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not label6.visible then
begin
if ((label7.left +label7.Canvas.TextWidth(label6.Caption)) > clientwidth) then
begin
label6.Left := -(label6.Canvas.TextWidth(label6.caption) -((label7.left +label7.Canvas.TextWidth(label7.Caption)) -clientwidth));
label6.Visible := true;
end;
end else
begin
if (label6.Left+2) >= ClientWidth then
label6.visible := false
else
label6.Left := label6.Left+2;
end;

"""
end;

Qual a forma que você acha que fica mais legível?! ;)

Share this post


Link to post
Share on other sites

@identação - ahh ok... eu ainda não vejo mta diferença de dar esses espaços... mas eu já to começando a fazer isso! vlw!

@ sobre o codigo - Outra coisa, eu não consegui terminar o codigo cara =/, tipo, eu entendi oque você disse (quando o label6 está saindo do form, o label7 começa a entrar... mas eu não consegui termina =/)

tem como você falar o que eu está faltando? não precisa terminar o codigo, so fala o que está faltando pra eu tenta aqui... eu to começando a mexer agora com delphi não to muito ligado nas coisas (por isso o professor está dando 2pnts a mais na media pra quem conseguir fazer...), vlw espero que me ajude!

falou

Edited by Pimpao

Share this post


Link to post
Share on other sites

2 pnts O.o parece até meu professor de geografia do ano passado que dava uma "carinha feliz" que ajudava bastante na média XD

dar os "espaços" gera uma sensação de treeview, então você identifica de onde se refere o comando que você está escrevendo, pois quando o comando tem várias linhas de código você pode se perder um pouco( já aconteceu várias vezes comigo ¬¬' )...

Share this post


Link to post
Share on other sites
@ sobre o codigo - Outra coisa, eu não consegui terminar o codigo cara =/, tipo, eu entendi oque você disse (quando o label6 está saindo do form, o label7 começa a entrar... mas eu não consegui termina =/)
:huh:

tem como você falar o que eu está faltando? não precisa terminar o codigo, so fala o que está faltando pra eu tenta aqui...
Tá bom, eu vou falar o que falta, mas vou ter que concluir o código para isso, e não é o que pretendia.

Se você tivesse observado com atenção o que eu postei na resposta parcial, você teria sacado o que está faltando. Veja que lá eu coloquei no meio do comentário : label7.Left := -(label7.Canvas.TextWidth(label7.caption) -((label6.left +label6.Canvas.TextWidth(label6.Caption)) -clientwidth));

Esse label7 e o outro label de que lhe falei, não foi?! Então, la no código parcial, que coloquei tem exatamente a mesma linha, só que falando do label6 (o que você já possui), logo, o que tá faltando é você duplicar o código:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if not label6.visible then
  begin
    if ((label7.left +label7.Canvas.TextWidth(label6.Caption)) > clientwidth) then
    begin
      label6.Left := -(label6.Canvas.TextWidth(label6.caption) -((label7.left +label7.Canvas.TextWidth(label7.Caption)) -clientwidth));
      label6.Visible := true;
    end;
  end else
  begin
    if (label6.Left+2) >= ClientWidth then
      label6.visible := false
    else
      label6.Left := label6.Left+2;
  end;

// *** aqui o código do label6, duplicado para o label7  - daria para simplificar (otimizar) usar o mesmo 
//       código para os dois labels, mas...
  if not label7.visible then
  begin
    if ((label6.left +label6.Canvas.TextWidth(label6.Caption)) > clientwidth) then
    begin
      label7.Left := -(label7.Canvas.TextWidth(label7.caption) -((label6.left +label6.Canvas.TextWidth(label6.Caption)) -clientwidth));
      label7.Visible := true;
    end;
  end else
  begin
    if (label7.Left+2) >= ClientWidth then
      label7.visible := false
    else
      label7.Left := label7.Left+2;
  end;
end;
então, como já disse antes, você adiciona esse label7 ao seu form, define a sua propriedade Visible como False e, lá no seu click do botão "Processar", evidentemente você teria que copiar o caption do label6 para o label7:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ...  // aqui estão aquelas coisas que você tem no seu código, não vou repeti-las mas elas continuam aqui heim!!!
  for I:=cont downto I do
  begin
    label6.caption:=label6.caption+Frase[I];
    edit2.text:=edit2.text+Frase[I];
  end;
  label7.caption := label6.caption;       // <<< acrescentar esta linha <<<
end;

Só isso!!! ;)

eu to começando a mexer agora com delphi não to muito ligado nas coisas (por isso o professor está dando 2pnts a mais na media pra quem conseguir fazer...), vlw espero que me ajude!
Bom, você vai levar esses pontos de "lambuja". O problema é que você vai ter que correr atrás...

Nesta questão de iniciantes, (você não é o único por aqui) segue uma dica que de chata poucos usam, mas é um tema de Algoritmos chamado "Teste de Mesa", ele é ótimo em situações como esta, facilitando na detecção/solução de problemas. Só para ter uma idéia do que é isto dê uma espiada neste arquivo que achei na net e procure pela palavra "teste de mesa" - arquivo

Abraços

Share this post


Link to post
Share on other sites

Micheus,

Você é foda de mais cara! muito obrigado, ficou certinho, do jeito que era pra ficar! amanha eu levo na escola e publico o forum xD

vlw, muito obrigado micheus e deio!

vou dar uma olhada no teste de mesa vlw

[PROBLEMA RESOLVIDO]

Edited by Pimpao

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this