【问题标题】:Scrolling a Memo text using TTimer shows only the first 3 Lines使用 TTimer 滚动备忘录文本仅显示前 3 行
【发布时间】:2012-01-31 09:00:27
【问题描述】:

我现在要做的是使用 TMemo 组件和 TTimer 创建一个滚动信用文本

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

Tmemo 行包含信用文本,类似于:

谢谢你:
Junifer lamda
示例用户 2
蒙娜丽莎编码器
等等

一切都按预期工作,我将 timer.interval 设置为 1ms ,文本滚动流畅,但它只显示前 3 行,然后显示一个空白区域,除非我在备忘录中使用鼠标手动单击并拖动,然后它显示一些行,然后当我释放时它又消失了。

我尝试使用 TRichedit 和 TListBox,但问题仍然存在。这怎么可能?

【问题讨论】:

  • 是的,在 win32 上 TTimer 使用 Windows 计时器,并且间隔被剪裁为 USER_TIMER_MINIMUM (0x0000000A)
  • 您是否也考虑过不使用 TMemo/TRichEdit/TlistBox 的替代答案?

标签: delphi text timer vertical-scrolling tmemo


【解决方案1】:

在我看来,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) 以避免滚动时闪烁。

【讨论】:

  • 我认为在表单的OnPaint 事件中自定义绘制文本会稍微优雅一些​​。
  • @andreas 我认为你是对的,但我的目标是一个非常简单的答案。新年快乐!
  • 您的解决方案完美运行,但 TLabel 在移动时闪烁,使其不那么优雅。试图将代码放在 Onpaint 事件的形式中,但仍然闪烁。 ?
  • 将表单的 DoubleBuffered 属性设置为 true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
相关资源
最近更新 更多