2012-01-01 26 views
3

什么,我想现在要做的就是创建一个使用TMemo组件和TTimer滚动使用TTimer备注文本只显示前3行

procedure TAboutBox.Timer1Timer(Sender: TObject); 
begin 
Memo1.ScrollBy(0,-1); 
end; 

的Tmemo行包含的文本scroling信用文本信用,是这样的:

三江源到:
Junifer LAMDA
为例用户2
编码器蒙娜丽莎
等等等等

一切都按预期工作,我已将timer.interval设置为1ms,文本可以平滑滚动,但它只显示3条第一行,然后显示一个空格,除非我在备忘录中单击并使用鼠标手动拖动,然后它会显示一些行,然后当我释放时它会再次消失。

我试过TRichedit和TListBox,但问题依然存在。这怎么可能?

+3

1ms?它不是太小? – Baatar 2012-01-01 14:00:28

+0

是的,在win32上,TTimer使用Windows定时器,并且间隔被修剪为USER_TIMER_MINIMUM(0x0000000A) – az01 2012-01-01 15:52:09

+1

除了使用TMemo/TRichEdit/TlistBox之外,您还考虑过替代答案吗? – menjaraz 2012-01-01 17:26:58

回答

4

在我看来,ScrollBy不是为了做你想做的事。更何况我不认为TMemo是必要的。

我可能会用标签做这件事,并将其移动到计时器事件上。就像这样:

procedure TScrollingTextForm.FormCreate(Sender: TObject); 
begin 
    Label1.Caption := 
    'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do '+ 
    'eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad '+ 
    'minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip '+ 
    'ex ea commodo consequat. Duis aute irure dolor in reprehenderit in '+ 
    'voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur '+ 
    'sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt '+ 
    'mollit anim id est laborum.'; 
    Label1.Top := ClientHeight; 
end; 

procedure TScrollingTextForm.Timer1Timer(Sender: TObject); 
begin 
    Label1.Top := Label1.Top - 1; 
end; 

我发现,我需要做双缓冲(DoubleBuffered := True)的形式,以避免闪烁滚动时。

+4

我认为自定义绘制窗体的“OnPaint”事件中的文本会稍微优雅些。 – 2012-01-01 15:31:02

+0

@andreas我认为你是对的,但我的目标只是一个非常简单的答案。新年快乐! – 2012-01-01 16:35:11

+0

您的解决方案完美无缺,但TLabel在移动时会闪烁,这使得它不太灵活。试图把代码放在形式Onpaint事件中,但仍然闪烁。 ? – 2012-01-01 16:54:49