2016-04-30 12 views
5

あなたの助けが必要です(私は探しています)。私はデルファイ・シアトルにいて、フォームのスムーズなサイズ変更をしようとしています。 Delphi:smooth collapse/expand form

enter image description here

がどのように私はそれを実現することができます。私の場合は、「リサイズ」のように拡大/ほんの少し崩壊のですか?

私はTTIMER使用を試してみた:

procedure TForm1.Timer1Timer(Sender: TObject); 
var 
h, t: integer; 
begin 
t := Button10.Top + Button10.Height + 10; //slide TForm from/to this point 
if t > h then 
begin 
h := h + 1; 
Form1.Height := h; 
end 
else 
begin 
Timer1.Enabled := false; 
end; 
end; 

...しかし、それは(何の加速/減速を)非常にシンプルに見えないし、小さな間隔でゆっくりと作品です。

+2

ローカル変数( 'h'や' t'など)は呼び出し間で永続的ではありません(タイマーイベント)。これらはスタックに割り当てられ、プロシージャの終了時に存在するように確保されます。繰り返しの呼び出しであなたは幸運かもしれないし、同じメモリが再利用されますが、これに頼るのは間違っています。 TTimerの解像度は1msに設定することができますが、10ms〜15msです。また、メッセージベースであり、タイマーメッセージは優先度が低いメッセージです。より正確でパフォーマンスの高いタイマーを使用するには、winapiマルチメディアタイマーを使用します。最後に、シンプルなコードはシンプルな外観を与えるかもしれませんが、なぜそれが加速/減速を示すことを期待していますか? –

答えて

6

TTimersで複雑になる必要はありません。これは、あなたが必要とする滑らかさを含む、崩壊するフォームと拡張するフォームの両方を処理します。

トリックは、ターゲットサイズ - 現在の高さを取って、各反復でdiv 3を計算することで、各ステップを計算することです。これは初期の崩壊を加速したり、展開したり、フォームが目標サイズに近づくほど減速します。

procedure TForm1.SmoothResizeFormTo(const ToSize: integer); 
var 
    CurrentHeight: integer; 
    Step: integer; 
begin 
    while Height <> ToSize do 
    begin 
    CurrentHeight := Form1.Height; 

    // this is the trick which both accelerates initially then 
    // decelerates as the form reaches its target size 
    Step := (ToSize - CurrentHeight) div 3; 

    // this allows for both collapse and expand by using Absolute 
    // calculated value 
    if (Step = 0) and (Abs(ToSize - CurrentHeight) > 0) then 
    begin 
     Step := ToSize - CurrentHeight; 
     Sleep(50); // adjust for smoothness 
    end; 

    if Step <> 0 then 
    begin 
     Height := Height + Step; 
     sleep(50); // adjust for smoothness 
    end; 
    end; 
end; 

procedure TForm1.btnCollapseClick(Sender: TObject); 
begin 
    SmoothResizeFormTo(100); 
end; 

procedure TForm1.btnExpandClick(Sender: TObject); 
begin 
    SmoothResizeFormTo(800); 
end; 
+1

ジョンありがとう!これはまさに私が見たいと思ったものです! –

+0

は私を助けました。ありがとうございました – Rahul