RealStudio(REALbasic)でアニメーション
最近のMacアプリはヌルヌル動くのがデフォなのに、RealStudioにはそういう機能が全然ない。。
そんな訳で作りました。
最短1行でアニメーションできます。
NekoTweenContainer.Default.TweenFor(Self,"Top").StartTween(300)
アニメーションの種類や速度を変えたり、コールバックを設定する事も可能
//ImgViewは画像表示を行うクラスのインスタンス Dim Tw as NekoTween = NekoTweenContainer.Default.TweenFor(ImgView,"Scale") //アニメーションの種類と速度を指定(オプション) Tw.TweenType = NekoTween.kTypeEaseOut Tw.DurationMiliSec = 1500 //値が変わるたびに呼ぶメソッドを指定。 //ここでは再描画を行うRedrawメソッドをコール Tw.OnUpdate = New NekoCallback(ImgView,"Redraw") //Scaleの値を2.0までアニメーション Tw.StartTween(2.0)
絵箱4リリース候補版
出しました。
前回β版(ver4.0.0b,build=f141)からの変更点:
- 画像の選択機能を強化
- バージョンチェック機能を追加
- ヘルプメニューに「コメント・要望を送る」を追加
- バグ取り
よろしければ試してやって下さい。
大きな問題がなければ、このまま来週には正式リリースしたいと思います。
REALbasicでクラス名(String)からそのクラスのインスタンスを作る方法
REALbasicでは通常、インスタンスの作成には「New クラス名」という記述方法をする以外の方法はありません。
Dim D as Dictuinary = New Dictionary
この時の「Dictionary」はあくまでコンパイル時に解釈されるので、実行時に変更する事はできないのだけど・・・
これがもし、
Dim D as Dictuinary = Create("Dictionary")
みたいにできたら楽しいと思うの。
で、やってみた。
説明ややこしいのでソース全部のせます。
ポイントは、Introspectionを使ってClassInfo.Lookupメソッド(リファレンス未記載)を呼んで、文字列から該当クラスのTypeInfoを取得するところ。
未記載のクラス・メソッドを利用しているので一切公式の保証はありませんが、一応2008r5と2010r5で動作するらしいことを確認しました。
(本当に大丈夫なのかはわかりません。。)
function NewObject(ClassName as String,Params() as Variant) as Object '// Create a new instanse by ClassName string '// 2011 yuki@nekobooks.com '// '// ex: Dim o as Object = NewObject("Dictionary") 'search 'Lookup' method If mLookup = Nil Then 'mLookup is Modul's property to chche ,and is null at first. 'get an object of ClassInfo 'this ClassInfo object is used for calling 'Lookup' method Dim T as Introspection.TypeInfo = Introspection.GetType(Introspection.GetType(app)) Dim Ms() as Introspection.MethodInfo = T.GetMethods 'search 'Lookup' method For each M as Introspection.MethodInfo In Ms Dim Ps() as Introspection.ParameterInfo = M.GetParameters() If M.Name = "Lookup" and UBound(Ps) = 0 Then If Ps(0).ParameterType.FullName = "String" Then mLookup = M 'cache Lookup method Exit End If End If Next End If If mLookup = Nil Then Return Nil 'fail to find Lookup method End If 'Lookup target ClassInfo Dim LookupParam(0) as Variant LookupParam(0) = ClassName Dim TargetClassInfo as Introspection.TypeInfo = Introspection.TypeInfo(mLookup.Invoke(Nil,LookupParam)) If TargetClassInfo = Nil Then Return Nil 'Class NOT Found End If 'get constructors Dim CnstrI() as Introspection.ConstructorInfo = TargetClassInfo.GetConstructors() 'Try each constructor Dim V as Variant For each C as Introspection.ConstructorInfo in CnstrI Try V = C.Invoke(Params) 'raise an exception if param count or type is missmatched. then try next Exit Catch TEx as TypeMismatchException End Try Next Return V.ObjectValue End Function
面白いけど、どう使おう。。
REALbasicでsetTimeoutみたいなの作った - Introspection使ってみた
概要:「3秒後にウインドウを閉じる」とか、一発でできるよ
以上。
ダウンロード : NekoDelay(クラス&サンプルプロジェクト)
REALbasic2008r1 or r2が必要です。2007以下では動きません
解説:というか以下蛇足
REALbasicでこの手の処理は基本Timerを使わなきゃいけないので、正直めんどい。
ウインドウがTimerだらけになって、何がなんだかわからなくなった事のある
REALbasic開発者は、多分全員。
JavaScriptだったら
setTimeout(function(){alert("にゃー")},3000);//3秒後に「にゃー」と鳴く
とかできるじゃないですか。だから、REALbasicでもやってみた。
Call NekoDelay.CallMethod(Window1,"Close",3)//3秒後に閉じてみる
3秒後にWindow1を閉じちゃいます。メソッドに引数を渡したり、戻り値を取得したりもOK
詳しい事はサンプル見てね。
REALbasic2008で登場した噂のIntrospection(いんとろすぺくしょん?舌が回んない)使ってます。
難しそうなイメージがあったけど、核になる部分は5行くらいで書けた。
もっと色んな使い方ができそう。
改良してくれる人、アイデア投げてくれるひと募集中。
コードは自由に使ってくださいです。
(上のサンプルプロジェクトから直接クラス引っこ抜いて使ってください)
Ver3.5.2暫定リリース
先日見つかった不具合への対処と、ついでにいくつかの新機能を乗っけたver3.5.2を公開します。
とりあえずサイト上で暫定公開します。Vector経由での正式公開にはしばらく時間が掛かりますので
ご了承下さいませ。
QTGraphicsExporter.SavePictureをスレッド内で使用するとアプリケーションが応答しなくなる事がある
最近QuickTimeが新しくなったせいか、既存のRbアプリでタイトルのような障害が発生する事があります。
割合深刻な問題な上、原因発見が結構困難な問題ですが、現状それらしい情報が上がっていないようなので
ここで報告しておきます。
公式の報告はまだありません。Yukiの環境に依存する問題である可能性があります。
情報をお持ちの方はコメント下さい。
障害の内容
QTGraphicsExporter.SavePictureメソッド使用後、アプリケーションが応答しなくなる
発生環境
私の環境を描いておきます:
再現性
上記の環境では、以下の条件で100%再現します:
- スレッド(Threadクラス)内でQTGraphicsExporter.SavePictureを呼ぶ
- QTGraphicsExporterがスレッド外から参照されている状態でスレッドの処理を抜ける
- QTGraphicsExporterへの参照が0になったタイミングで応答不能
要するに
スレッド内でQTGraphicsExporterを使ったあと、スレッドが先に終了*1するとダメ。
ダイアログ開いて設定を済ませた後のQTGraphicsExporterをスレッドに渡してバックグラウンドで処理する、
という使い方はわりと一般的だと思うのですが。
どうする?
QTGraphicsExporterをスレッド内で使い捨てにするのが一番安全。
スレッドにQTGraphicsExporterを渡した場合、Runする前*2に確実に全ての参照を切る実装をしないと危険です。
絵箱3.5
公開準備中です。
Vectorには送ったので早ければ今週末には掲載されるかな。
UB対応で幾つかトラブルはあったものの、現状問題なく動いてくれています。
ver3.2の細かなバグも気づいた範囲で修正しています。
不具合を見つけた方はコメントでもよいのでご連絡いただければ幸いです。
ご意見ご感想ももちろん歓迎中です。
IntelMacな方は結構早くなりますのでオススメです。
一覧の枚数が多い場合にもメモリ消費が抑えられるよう、改良しました。
(少しだけ速度を犠牲にしています)。これからは絵箱もエコなのです。
//...でもアプリサイズが20MB大きすぎですよねぇ。
//いっそ「ユニバーサルバイナリー」じゃなくて「ファットバイナリー*1」って呼んだ方がいい気もする。
*1:ネタが古くてすみません