DTween 110819版。
今回は2010やXEを使っている方にとっては内部処理の変更だけですが…。
新しい機能
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;