Swanman's Horizon

性欲をもてあましつつなんらかの話をするよ。

DTween 110819版。

今回は2010やXEを使っている方にとっては内部処理の変更だけですが…。

DTweenをダウンロード

新しい機能

Delphi 2009以前のバージョンに対応(ただし制限付き)

ということで、今まで比較的新しめのDelphiでしか動かなかったDTweenですが、それ以外のバージョンにも対応しました。
手元にある一番古いバージョンがDelphi6なのでそれ以前の動作はちょっと確認できてないのですが、少なくとも6では動いてます。
で、肝心の制限ですが、元々DTweenは数値型のプロパティであれば何でも書き換え可能なのに対し、2009以前のバージョンにおける使用では、可視性がpublishedであり、さらに実行時型情報の生成が行われているクラスのプロパティのみ、という制限が付きます。
これだけだと何だか分かりづらいですが、DelphiコンポーネントはデフォルトでRTTIが生成されているTPersistent派生のクラスなので、ざっくり言えばフォームにポトペタできて、オブジェクトインスペクタに表示されているプロパティなら書き換えが可能、ってことになります。
それ以外の自作クラスで書き換えを行いたい場合は、以下のように$M指令を有効にした状態でクラスを作成して下さい。

{$M+}
TManbekun = class
private
  FLife: Integer;
published
  property Life: Integer read FLife write FLife default 0;
end;
{$M-}

あと微妙に制限とは違うんですが、Delphi6で以下の様なコードを書いた場合に「TweenToへのオーバーロード呼び出しはあいまいです」というエラーが発生することを確認しています。

procedure TForm1.HogeClick(Sender: TObject);
begin
  TTween.TweenTo(Sender, ['$Left', 100], 100).Play;
end;

これはTweenToとTweenFromメソッドでのみ発生し、Tweenメソッドでは発生しません。
以下の方法で回避できるため、原因はどうやら第一引数にTObjectを渡したことのようですが、かなり謎の挙動です。バグ?
もちろん2010以降では発生しません(7〜2009でどうなるかは持ってないので未確認です)。

TTween.TweenTo([Sender], ['$Left', 100], 100).Play; // 第一引数がオープン配列パラメータ版のオーバーロードならOK
TTween.TweenTo(TButton(Sender), ['$Left', 100], 100).Play; // TObject以外の型にキャストしてもOK
TTween.TweenTo(Button1, ['$Left', 100], 100).Play; // イベントハンドラを共有していないなら、いっそSenderを使わないのもOK

仕様変更

TEasing.XXXXが返す型をIEasingインターフェースに変更

TEasing周りは無名メソッドが使われていたため、古いバージョンに対応しようと思うとコンパイル条件で書き分けるか、バージョンの低い方に合わせるかという選択になると思うんですが、さすがにこれは量が量だったのでおとなしく後者で対処しましたとさ。めでたしめでたし。
この変更によって特に書き方が変わったりということは無いです。強いて言えばパラメータを取るElasticやBack系のイージング関数で、パラメータを省略した際にもカッコが必須だったのが必須じゃなくなりました。

// 今まではTEasing.ElasticEaseInなど一部のメソッドは「無名メソッドを返すメソッド」で、仕様上カッコを省略できなかった
TTween.TweenTo(Image1, ['$Width', 100], 500, TEasing.ElasticEaseIn()).Play;

// 今後はどのメソッドも「IEasingを返すメソッド」に統一されたので、カッコはいらなくなった(付けたままでもOK)
TTween.TweenTo(Image1, ['$Width', 100], 500, TEasing.ElasticEaseIn).Play;

Delphi 7〜2009の動作確認求む

ソースを直接見てもらえば分かりますが、「これはひどい」と思わず自分でも言いたくなるくらいコンパイル条件だらけになってる上、どの機能がどのバージョンで実装されたかがよく分かってないため、「Delphi○○では使えるはずの機能が使えなくなってる」ということがあるかもしれません。
Delphi 6で動いてる以上、全く動かないということは無いと思いますが、念のため該当バージョンをお持ちの方は動作確認していただけると助かります。
あと5以前については動いたらラッキー程度で。(旧型の)RTTIやTypInfoが存在してるバージョンであれば一応動くと思います。