Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Scroll horizontal texto (https://www.clubdelphi.com/foros/showthread.php?t=65478)

jaimeh 18-12-2009 09:49:42

Scroll horizontal texto
 
Hola a todo el mundo

Verán, tengo lo siguiente:

Código Delphi [-]
   if i <= length(Edit1.Text) then
   begin
     label1.Caption := LeftStr(s, i);
     Inc(i);
   end
   else begin
     s := s + ' ';
     label1.Caption := s;
   end;

Este código desplaza los caracteres de izquierda a derecha en un label.
Pero el problema es que lo hace a saltos. Habría alguna forma de que
fuera un desplazamineto suave, sin saltos. He probado el doublebuffer
del form.
Me imagino que habrá que hacerlo a través de alguna librería gráfica

A ver si hay alguien que me pueda orientar

Saludos a todos.

Neftali [Germán.Estévez] 18-12-2009 10:32:39

No se a qué te refieres con "saltos".
Utilizando un Timer debería funcionar sin problemas. Aunque no se si lo utilizas.
¿Podrías poner el código completo?

jaimeh 18-12-2009 11:56:14

Gracias por responderme Neftali

La rutina que he puesto va dentro del evento de un timer de 50 ó 100ms,
pero con letras grandes se nota que el desplazamiento no es suave.
Es como si tuviera que hacerse a nivel de pixels y no de caracteres.

Y otra cosa, con la rutina que he puesto no sabría como hacer para
que volviese ha empezar a entrar por la derecha, cuando acabara de salir
por la izquierda del label.

Esto sería para un rótulo.

Saludos a todos

jaimeh 18-12-2009 12:01:53

Pongo el todo el codigo, aunque es una prueba

Código Delphi [-]
var
   s: string;
   i: Integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
   //
   s:= Edit1.Text;
   Timer1.Enabled := true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   Timer1.Enabled := false;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
   //
   i:= 1;
   Form1.DoubleBuffered := true;
   Label1.Perform(WM_SETREDRAW, 0, 0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 //

   if i <= length(Edit1.Text) then
   begin
     label1.Caption := LeftStr(s, i);
     Inc(i);
   end
   else begin
     s := s + ' ';
     label1.Caption := s;
   end;


end;

Neftali [Germán.Estévez] 18-12-2009 12:21:28

Cita:

Empezado por jaimeh (Mensaje 349117)
...pero con letras grandes se nota que el desplazamiento no es suave. Es como si tuviera que hacerse a nivel de pixels y no de caracteres.

en ese caso sólo se me ocurre que la etiqueta o texto la guardes como imagen (antes de empezar la animación) y luego en cada paso cortes una sección por la izquierda y la pegues por la derecha. No se si me explico....

Cita:

Empezado por jaimeh (Mensaje 349117)
Y otra cosa, con la rutina que he puesto no sabría como hacer para que volviese ha empezar a entrar por la derecha, cuando acabara de salir por la izquierda del label.

Debería bastar con poner en el Timer esto:
Código Delphi [-]
  Str := Label1.caption;
  Str := Copy(Str, 2, length(Str)) + Str[1];
  Label1.Caption := Str;

cocute 18-12-2009 20:57:20

en los componentes Jedi tienen un par de componentes para eso, que funcionan tambien con imagenes. http://jvcl.delphi-jedi.org/Downloads.htm

Pero vamos viendo lo simple que parece con lo que te dice Neftali creo que basta.

Aleca 18-12-2009 21:29:59

Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    Button1: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    cTexto: String;
    nLargoMarq: Integer;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Byte;
  nLarTexto: Byte;
begin
  cTexto := 'Hola Mundo';
  nLargoMarq := 50;
  nLarTexto := Length(cTexto);
  for i := 1 to nLargoMarq - nLarTexto do
    Insert(' ', cTexto, 0);
  Label1.Caption := cTexto;
  Timer1.Interval := 100;
  Timer1.Enabled := True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
  cChar: String[1];
begin
  cChar := copy(cTexto, 1, 1);
  Delete(cTexto, 1, 1);
  cTexto := cTexto + cChar;
  Label1.Caption := cTexto;
  Label1.RePaint;
end;
end.
fijate si te sirve. :)

jaimeh 20-12-2009 18:00:16

Muchas gracias por responderme a todos,

La rutina de neftali se ajustaba al ancho de la cadena de texto, claro que
el ancho de la label fija (sin autosize) quería que fuera mucho mayor
que el ancho de la cadena de texto.

La rutina de aleca, el nlargoMarq yo quería que fuera el ancho de la label
fija (sin autosize), habria que saber cuantos caracteres cabrían en la label
(para hacer las cuentas), y ahí habría que averiguar la cantidad de pixeles
que ocupa la font. De todas formas se notan bastante los saltos en el
desplazamiento.

Utilizando jvcl con el componente jvSrollText va bastante bien, yo de este
ya sabía de él, pero no había hecho con él las pruebas. Se puede decir la
cantidad de pixeles que queremos que se desplacen en cada momento,
con lo cual llegamos a conseguir un desplazaminto bastante suave.

El único problema que he encontrado, es que su metodo Pause me deja
colgado el programa, así que no se como hacer para que se pueda parar
el desplazamiento y luego volver a seguir desplázandose desde donde
estaba. Habría que poner después de jvScrollText.Pause algo pero no se
el qué.


Muchas gracias a todos y saludos

jaimeh 20-12-2009 18:22:24

Disculpad,

Ya vi como se podía parar y reanudar el desplazamiento solo hace falta
poner la propiedad jvScrollText.ScrollPixels := 0 para parar el desplazamiento y darle un valor positivo para que se reanude.

Muchas gracias a todos y saludos.


La franja horaria es GMT +2. Ahora son las 16:12:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi