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 で公開されていると思いますので、オブジェクト インスペクタでも設定できます。

于 2012-12-06T17:27:19.443 に答える
2

スリープ手順を使用する代わりに、移動にかかる時間を決定する方が良いことがわかりました. これは、さまざまな速度のコンピューターに対してより適切に調整され、さまざまな移動距離に対しても調整されます。画面上を移動するのに 1 秒かかるようにしたい場合は、再描画の間に小さなステップで移動する必要があります。

正確な理由は覚えていませんが、親を再描画するコードも追加しました。オブジェクトが画面上を移動したときにゴースト イメージが残るという問題があったと思います。

これが私たちが使用しているコードです。これは、画面のオンとオフを切り替えることができるコンポーネント内にあります。

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 に答える