The Big Red X

/ .NET

image
何だか格好良さげなタイトルですが、Windowsフォームアプリの例外関連の話。
上のような画面を見たことのある開発者の方もいるかと思いますが、フォームやコントロールの描画処理で何らかの例外が発生すると描画が中止されて赤い×マーク(バツマーク、バッテン)が表示されます。
通常はユーザコントロールなどの内部処理で落ちた場合などに発生するケースが多いと思うのですが、この×マーク、一旦表示されると元の表示状態に戻すのがなかなか難しく、普通は画面を開き直したり、アプリ再起動くらいしか手段がありません。
この問題を解決すべく、海外のWebサイトを徘徊した結果、見つけた回避策が以下の方法。

OnPaintイベントでわざとエラーを発生させて×マークを表示した後、ボタンクリックで再描画を行うサンプルです。
実際のアプリではOnThreadExceptionで×マークの原因となったスレッド例外を捕捉したら再描画、といった感じになるでしょうか。
ハイライト表示した箇所が強制再描画のくだりですが、リフレクションでSetStateなる内部メソッドを呼び出してエラー状態を解消するという、なかなかの荒業。
SetStateや0x400000の意味などはソースを直接覗くしか知るすべがないようです。
とりあえずVBで書いていますが、参考にさせていただいたこちらのサイトにC#で書かれたサンプルも掲載されています。
もちろん、根本的な描画時エラーを取り除いて×マーク自体を出現させないようにすることが先決ですので、どうしても解決できない場合の参考ということで…


ワイドタイル対応

/ Windows Phone

image
IS12T以来、国内から消滅していたWindows Phoneが遂に復活、というわけで、「MADOSMA」発売直前でにわかに盛り上がっているWPクラスタ。
アプリ開発している側としても国内のWPユーザが増えるのは大歓迎なので、ささやかながら貢献すべく、積年の課題であったWindows Phoneアプリのワイドタイル対応に手をつけてみました。

とりあえずのターゲットは弊社提供アプリの中で日本国内では最もDL数の多い「タイルカレンダー」。
それでも世界向けの「Live Calendar」と比べると5%にも満たない程度のDL数しかないので、基本的にメンテナンスも後回しにしていたのですが、Live Calendarに先駆けてワイドタイルに対応することにしました。(テストリリースという意味合いのほうが大きかったりしてw)

ワイドタイルに対応すること自体は実はそれほど難しいものではなくて、表示するネタさえ用意できればすぐにでもできるのですが、カレンダーの隣に表示するとしたらやっぱスケジュールでしょ、ということになるわけで、このスケジュールの取得が経験上色々と厄介だったりするわけです。
それと、バックグラウンドでのタイル更新に伴うメモリ問題。
バックグラウンドの場合、利用可能なメモリ量がOSによってごく少量に限定されてしまうため、大きな画像を扱ったりするとメモリ不足で動かなくなってしまいます。
実際にエミュレータで試してみると、WP8では明らかなメモリ不足に陥ってしまうようだったので、結局ワイドタイル表示への対応はWP8.1限定という形にせざるをえませんでした。
表示レイアウトも悩みどころでしたが、所詮691×336ピクセルの枠しかありませんので、今日/明日の予定だけを表示するようにしてシンプルにまとめてみました。
個人的に鬼門であったスケジュールの取得には案の定手こずったものの、何とか安定的に取得できるようになったので、これは他のアプリにもフィードバックしていきたいと思う所存。
また、ワイドタイル対応に伴って今回からWP7系は切り捨てる形になったので、改修のついでにWP8以降から追加されたSaveAppointmentTaskを使った「予定の追加」もアプリ内から行えるようにしてみました。
編集や削除ができるAPIがあれば文句なしなのですが、ここらへん今一歩ですね。
個人的にはこれでようやく内蔵のカレンダーアプリを使わなくても何とか運用できるレベルになったかな、という感じ。
あとはピボットの挙動調整と、日付をタップした際の視覚フィードバックを追加して、無事に改修完了。
カレンダーの描画にはチューニングの余地がありそうだけども、低スペックなLumia 525でもサクサク動くようなので今のところは手を入れていません。

そんなこんなで、一応ワイドタイル化を果たしてはみたものの、こんなんでよろしかったでしょうか?w
新たにWPユーザとなるMADOSMAユーザさん、スタート画面の賑やかしにオススメですのでよろしかったらどうぞ。
感想、要望等ありましたらレビューにでも入れてあげてください。
なお、この後少し様子を見てLive Calendarのワイドタイル対応をしていく予定です。