我的设想是这样的,
状态栏上的字符过一秒右移一个字符,当移到顶点时又恢复到原点,又重新移动。用定时器实现,这样做效率可能不是很高,但我暂时也想不起别的更好的办法。设一个定时器,定时为一秒。
然后每秒触发一个事件:
事件代码实现功能如下:全局变量
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;
状态栏上的字符过一秒右移一个字符,当移到顶点时又恢复到原点,又重新移动。用定时器实现,这样做效率可能不是很高,但我暂时也想不起别的更好的办法。设一个定时器,定时为一秒。
然后每秒触发一个事件:
事件代码实现功能如下:全局变量
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;
下面是个简单的例子: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;
实例如下:
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;
}
不流畅,不好。
还是自己画Canvas比较好。