我的设想是这样的,
   状态栏上的字符过一秒右移一个字符,当移到顶点时又恢复到原点,又重新移动。用定时器实现,这样做效率可能不是很高,但我暂时也想不起别的更好的办法。设一个定时器,定时为一秒。
然后每秒触发一个事件:
事件代码实现功能如下:全局变量
TIMENUMBER:=0 //用来对定时器的触发事件记数   (每一次触发,记数加一,字符串右移一位,
             // 当计数器达到一定次数,比如20时,记数次数清零,即右移20个字符后,恢复
            //到起始处,重新移动VAR
   I:INTEGER;
   STR,STR1:STRING;
BEGIN
  TIMENUMBER:=TIMENUMBER+1;
  IF TIMENUMBER=20 THEN TIMENUMBER:=0;  //记数次数清零,
  STR=‘欢迎光临’;//设定要显示的状态栏字符
  STR1=STR;
  FOR I:=0 TO TIMENUMBER DO
  BEGIN
    STR1:=‘ ’+STR1;
  END;                      //移位的实现,就是在前面添空格字符
  statusbar1.panels.items[1].text:=STR1;  //重写状态栏信息 
END;

解决方案 »

  1.   

    也可以把一个Label放到Statusbar上(请参考http://www.csdn.net/expert/topic/83/83223.shtm),再用定时器控制Label中的字。
    下面是个简单的例子:procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
      Panel: TStatusPanel; const Rect: TRect);
    begin
        TmpRect:=Rect;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        with Label1 do
        begin
              Top:=TmpRect.Top+4;
              Left:=TmpRect.Left+4;
              Width:=TmpRect.Right-TmpRect.Left;
              Height:=TmpRect.Bottom-TmpRect.Top;
              Visible:=True;
              Parent:=StatusBar1;
        end;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
        Label1.Caption := Copy(Label1.Caption,3,Length(Label1.Caption)-2);
    end;
      

  2.   

    状态栏上的字符滚动是很容易实现的
    实例如下:
    void __fastcall TfrmMain::FormCreate(TObject *Sender)
    {Str1="欢迎你使用学生管理系统!由于编写时间仓促,难免有不可预料的异常发生,疏误之处望使用者提出宝贵意见,以便改版时改进! 谢谢合作!";
     Str1="                              "+Str1;
    Str2=Str1;}
    void __fastcall TfrmMain::Timer2Timer(TObject *Sender)
    {
    int length;
     StatusBar1->Panels->Items[3]->Text=Str1;
     length=Str1.Length();
    if(length>0)
       Str1=Str1.Delete(1,2);
    else
       Str1=Str2;
    }
      

  3.   


    不流畅,不好。
    还是自己画Canvas比较好。