4

使用 Delphi XE2 我想让一些按钮在 delphi 应用程序中移动。

我写了这段代码:

procedure TForm1.DoSomething;
var x : integer;
begin    
   for x := 200 downto 139 do begin
       // move two buttons
      Button1.Top := x;
      Button3.Top := x;
       // skip some repaints to reduce flickering
      if (x mod 7 = 1) then begin
          Form1.Repaint;
      Sleep(50);
   end;
end;

不幸的是,运行此程序时它仍然显着闪烁。

这是我的问题:有什么方法可以使动画流畅(没有任何闪烁)?

编辑: 为了使动画更流畅,在 sleep(50) 中将 50 更改为更小的值并删除此行:

if(x mod 7 = 1) then begin
4

2 回答 2

4

设置Form1.DoubleBufferedTrue。您可以在代码中执行此操作,但我认为该属性已在 XE2 中发布,因此您也可以在 Object Inspector 中设置它。

于 2012-12-06T17:27:19.443 回答
2

我发现最好决定你希望运动需要多长时间,而不是使用睡眠程序。这可以更好地适应不同速度的计算机,也可以适应不同的移动距离。如果您希望它在屏幕上移动需要 1 秒,则需要在重绘之间以较小的步长移动,而在屏幕上移动只需 0.5 秒。

我不记得确切原因,但我们还添加了代码来重新绘制父级。我认为我们遇到了当我们的对象在屏幕上移动时留下重影的问题。

这是我们正在使用的代码。这是一个可以在屏幕上移动和离开的组件内部。

procedure TMyObject.ShiftRight;
var
  TicksStart: int64;
  StartLeftValue: integer;
  EndLeftValue: integer;
  NewLeftValue: integer;
  LeftValueDif: integer;
  RemainingTicks: int64;

begin
  StartLeftValue := Self.Left;
  EndLeftValue := Self.Left + Self.Width;
  LeftValueDif := EndLeftValue - StartLeftValue;

  TicksStart := GetTickCount();
  RemainingTicks := FadeTime;  // Fade Time is a constants that dermines how long the 
                               // slide off the screen should take

  while RemainingTicks > 0 do
  begin
    NewLeftValue := (LeftValueDif * (FadeTime - RemainingTicks)) div FadeTime;
    Self.Left := Max(StartLeftValue, NewLeftValue);
    Self.Parent.Repaint;
    Self.Repaint;

    RemainingTicks := FadeTime - int64(GetTickCount - TicksStart);
  end;

  if Self.Left < EndLeftValue then
    Self.Left := EndLeftValue;

  Self.Parent.Repaint;    
  Self.Repaint;
end;
于 2012-12-06T20:24:01.907 回答