【问题标题】:Why the form moving effect is not happening the first time?为什么表格移动效果不是第一次发生?
【发布时间】:2010-12-12 10:21:55
【问题描述】:

我正在使用此代码显示一个带有类似信使弹出窗口的表单:

  TimeSleep := 5;

  for i := 1 to FormHeight do
  begin
    Form.Top := Form.Top - 1;

    Sleep(TimeSleep);
  end

它工作顺利,但只是从第二次开始。我的意思是我的表单上有一个调用循环的按钮,当我第一次单击表单时突然显示没有滑动效果。如果我再次点击,效果会起作用。

我怎样才能让它从第一次开始工作?

谢谢。

【问题讨论】:

  • 你什么时候给 TimeSleep 分配任务?

标签: delphi pascal


【解决方案1】:

您没有发布足够的代码来确定它,但我假设您的表单在您第一次单击按钮之前不可见或者甚至没有窗口句柄,因此表单的移动是'不可见。如果你插入

Form.Show;
Form.Update;

在循环之前,事情也应该第一次工作。请注意对Update() 的调用,它需要真正显示在上一行中可见的表单。

同样,您应该在循环内更改Top 属性之后插入对Update() 的调用-它也可以执行对Application.ProcessMessages() 的调用,而不会像大锤一样。只要有更好的方法,请尽量不用Application.ProcessMessages(),搜索 Stack Overflow 以了解有关此问题的讨论。

关于循环的另外两条建议:

  • 如果有任何原因导致您的 Sleep() 长于您请求的 5 毫秒,则移动将不顺畅 - 最好计算自上次以来经过的时间减去窗体顶部坐标的量运动。

  • 任何人都不会看到您的表单以 1 个像素的增量移动 - 人眼和大脑的速度不足以以这种速度收集和处理信息,甚至您房间里的猫和昆虫也只会查看您的显示器每秒进行的 60 次左右更新。所以Sleep() 的参数设置为 20 甚至 50 比 5 合理得多。相应地调整表单移动。

编辑:

以下是一些示例代码,即使有不同的延迟,也会创建表单的持续移动:

uses
  MMSystem;

procedure TForm1.Button1Click(Sender: TObject);
var
  Frm: TForm;
  TicksStart, TicksNow: Longword;
  Progress: Single;
begin
  Frm := TForm.CreateNew(Self);
  try
    // slide a form of 600 by 500 pixel into view over a period of 100 millis
    Frm.SetBounds((Screen.Width - 600) div 2, -500, 600, 500);
    Frm.Show;

    TicksStart := timeGetTime;
    while True do begin
      Sleep(15);
      TicksNow := timeGetTime;
      if TicksNow - TicksStart >= 1000 then
        break;
      Progress := (TicksNow - TicksStart) / 1000;
      Frm.Top := - Round((1.0 - Progress) * 500);
    end;
    Frm.Top := 0;

    Sleep(500);
  finally
    Frm.Free;
  end;
end;

【讨论】:

  • 感谢您的提示。您说“最好计算自上次移动以来经过的时间减去窗体顶部坐标的量。”你能给我提供更正的代码吗? “相应地调整表单移动”是什么意思?我是 Delphi 的绝对初学者。
  • @emurad:你的意思是你是编程的绝对初学者?
  • @emurad:我发布了一些示例代码,但考虑到您对 Andreas 的态度,我很想不这样做。他的评论可能没有帮助,但你的粗鲁仍然是完全不能接受的。
  • @emurad:对不起,我在那儿有点不敏感。
【解决方案2】:

尝试添加“Application.ProcessMessages;”睡觉前。

【讨论】:

  • 非常感谢。它有效,但为什么在第一次调用期间没有自动处理消息?
  • @emurad:当然不是。在您的线程中执行的代码就是您编写的代码。所以在你的程序循环中,如果你想处理消息,你必须自己做。 (提示:买一本关于 Win32 编程的书。)
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2013-05-28
相关资源
最近更新 更多