2013-08-17 75 views
1

我有一個Delphi XE2項目顯示滾動文本(更好的「選框文本」)。 在我的項目中,我有Timer1,Timer2,Button1,Button2,Label1Label2。 我的目標是在Label1之後顯示一些左滾動文本Button1.Click使用Timer1和一些右滾動文本在Label2之後Button1.Click使用Timer2右滾動文本

我定義了下面的代碼:

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    Label1: TLabel; 
    Label2: TLabel; 
    Button1: TButton; 
    Button2: TButton; 
    Timer1: TTimer; 
    Timer2: TTimer; 
    procedure FormCreate(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    procedure Timer1Timer(Sender: TObject); 
    procedure Timer2Timer(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Timer1.Enabled := true; 
    Timer2.Enabled := true; 
end; 

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

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Timer1.Interval := 100; 
    Timer2.Interval := 100; 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
const 
{$WRITEABLECONST ON} 
    ScrollingText : string = 'This is left scrolling text '; 
{$WRITEABLECONST OFF} 
var 
    ScrollPosition: Integer; 
begin 
    Label1.Caption := ScrollingText; 
    for ScrollPosition := 1 to (Length(ScrollingText) - 1) do 
    begin 
     ScrollingText[ScrollPosition] := Label1.Caption[ScrollPosition + 1]; 
     ScrollingText[Length(ScrollingText)] := Label1.Caption[1]; 
    end; 
end; 

procedure TForm1.Timer2Timer(Sender: TObject); 
const 
{$WRITEABLECONST ON} 
    ScrollingText : string = 'This is right scrolling text '; 
{$WRITEABLECONST OFF} 
var 
    ScrollPosition: Integer; 
begin 
    Label2.Caption := ScrollingText; 
    for ScrollPosition := (Length(ScrollingText) - 1) to 1 do 
    begin 
     ScrollingText[ScrollPosition] := Label2.Caption[ScrollPosition - 1]; 
     ScrollingText[Length(ScrollingText)] := Label2.Caption[1]; 
    end; 
end; 

end.  

我的問題是沒有發生使用Timer2是,Left Scrolling使用Timer1Right Scrolling發生。

+0

你嘗試一些調試,例如,使用調試器或在'Timer2Timer'的'for'循環中放置'ShowMessage('cat')'? [N.b .:你不必使用「貓」 - 任何哺乳動物都會這樣做。] –

+1

爲什麼你使用可寫類型常量,這是oxymoronic和早已棄用的「功能」? –

回答

3

for環路Timer2Timer應該往下跑,而不是向上:

procedure TForm1.Timer2Timer(Sender: TObject); 
const 
{$WRITEABLECONST ON} 
    ScrollingText : string = 'This is right scrolling text '; 
{$WRITEABLECONST OFF} 
var 
    ScrollPosition: Integer; 
begin 
    Label2.Caption := ScrollingText; 
    for ScrollPosition := (Length(ScrollingText) - 1) downto 2 do 
    begin 
     ScrollingText[ScrollPosition] := Label2.Caption[ScrollPosition - 1]; 
     ScrollingText[1] := Label2.Caption[Length(ScrollingText) - 1]; 
    end; 
end; 

但我建議不要使用可寫的常量,也沒有使用for循環都:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ... 
    Label2.Caption := 'This is right scrolling text '; 
end; 

procedure TForm1.Timer2Timer(Sender: TObject); 
var 
    S: String; 
begin 
    S := Label2.Caption; 
    S := S[Length(S)] + Copy(S, 1, Length(S) - 1); 
    Label2.Caption := S; 
end; 
+0

非常感謝。你的代碼工作正常。 – user2612109

+0

同樣在你的身上,我認爲那是設計。 – NGLN

+0

如果正確滾動文本意味着複製最後一個字符並全部在前面;那麼將離開滾動不意味着複製所有最後的字符加上第一個?你應該能夠自己發現這一點。 – NGLN