の最近のブログ記事

 Flex等では、"System.gc()"を呼び出すことによって、強制的にガベージコレクションを実行することができますが、Silverlightにはそういうのないのかな、と思っていたら、ちゃんと存在していたんですね。

GC.Collect();

 呼び出しはたったのこれだけ。
 パフォーマンスが著しく低下するから、呼び出さない方が良いよ、なんて言われても、どうしても呼び出したい時というのはあるものです。
 でも、くれぐれも使いどころにはお気を付けください。

 もう書いたと思っていたのにエントリーが見当たらなかったので改めてメモ。
 方法自体はとっても簡単なのでとりあえずソースだけ。

StreamResourceInfo sri =
 App.GetResourceStream(new Uri("/assemblyName;component/filename.jpg", UriKind.Relative));
BitmapImage bi = new BitmapImage();
bi.SetSource(sri.Stream);
Image img = new Image(){ Source = bi };

 見難くてごめんなさい。

 とあるアプリケーションが、MacのSafariで正常に動作しないという報告がクライアントからありました。

 多少条件判定処理が多いくらいで、それ以外はどう考えてもごくごく普通の処理をしているだけの個所なのに、確かに動作がおかしかったので、前回のエントリーで書いたSilverlightとJavaScriptの連携を使ってログを吐きつつ調査をしてみたところ、恐ろしいことに気づいてしまいました。

 double型って==演算子で比較しちゃダメなの?(´・ω・`)

 明らかに等しいdouble値の==演算子の比較が常にfalseになっているようだったので、試しにEqualsで比較するようにしてみたら、正常に動作するようになりました。
 確かにEqualsメソッドもあるけど、別に==で比較しても良いんじゃないの?ヽ(`Д´)ノ
 何も明らかに等しい値を、しかもMacのSafariだけでスルーしなくても良いと思う(´;ω;`)

 ということで、今後はdouble型の比較には、==演算子じゃなくてEqualsメソッドを使いましょう、というお話しでした。

 でも忘れちゃいそうだなー( ;^ω^)

 SilverlightアプリケーションからアプリケーションをホストしているHTMLファイルに記述されたJavaScriptのファンクションを呼び出す方法はこんな感じ。

ScriptObject jsFunction =
  (ScriptObject)HtmlPage.Window.GetProperty("jsFunctionName");
if(jsFunction != null)
{
  jsFunction .InvokeSelf(parameter);
}

 引数を問題なく渡せることは確認しましたが、どんな型が渡せるのかとか、返り値もちゃんと渡って来るのかとか、外部JSファイルのファンクションはどうなんだ、とかいうのはまだ試していません。
 JavaScriptからSilverlightアプリケーション内のメソッドを呼び出すこともできるのですが、それはまた次回。

 これまで、XMLファイルをWebClientで読み込む処理は結構あったのですが、XAP内に同梱されたXMLを読み込んだことはなかったので、最初はどうすればいいかちょっと悩んでしまいました。
 でも方法さえわかってしまえばとっても簡単。

 プロジェクトにXMLファイルを追加して、"Build Action"を"Content"に設定してしまえば、あとは以下のような感じで読み込むことができます。

//data.xmlがSilverlightプロジェクト直下に配置されている場合
XmlReader reader = XmlReader.Create("data.xml");

 僕の場合は、この後XDocument.Load(reader)して、LINQ to XMLでモニャモニャすることが多いです。

 何かと便利なSilverlight.jsのリファレンスと、最新版の入手先と、さらに、いつか必要になりそうなSilverlight.supportedUserAgent.jsなんてものも発見したので併せてメモ。

■Silverlight.js

・最新版ダウンロード
http://code.msdn.microsoft.com/silverlightjs
・日本語版リファレンス
http://msdn.microsoft.com/ja-jp/library/cc838126(VS.95).aspx

■Silverlight.supportedUserAgent.js

・最新版ダウンロード
http://code.msdn.microsoft.com/SLsupportedUA

Silverlightで自分自身の絶対URIを取得するために使用するプロパティ。

▽XAPファイルの絶対URI
Application.Current.Host.Source.AbsoluteUri

▽HTMLファイルの絶対URI
HtmlPage.Document.DocumentUri.AbsoluteUri

 ちょっと必要になったので自分のためにメモ。

 まずはプロジェクトプロパティのFlexコンパイラでの設定で、追加コンパイラ引数に以下のオプションを追加して、カスタム設定ファイル用テンプレートを出力する。

-dump-config myconfig.xml

 出力されたファイルを編集した上で、それをコンパイル時に使用するために、上記のオプションを削除して以下のオプションを追加する。

-load-config+=myconfig.xml

 良くわからないけど、とりあえず行けてるっぽいです。

 Flex3でフォームアプリケーションを開発していた時に、ある画面でTABキーを押すと、アプリケーション全体がフリーズしてしまうという、不可解な現象に遭遇しました。

 フリーズ中にデバッガで一時停止してみたところ、FocusManagerが、次にフォーカスを設定するコンポーネントを探すために、ひたすらループしているのが原因のようでした。
 そのアプリケーションは、ひとつのMXML上にViewStackで結構な数の画面を配置してあり、コンポーネントもかなりの数に達していて、それらのコンポーネントの可視状態や有効状態などを、ひとつひとつチェックしているらしいのです。

 とそこまではわかったのですが、なぜそんな挙動をしているのかがさっぱりわからず、しかも他の画面では同じ現象も発生しないので、ものすごーく悩んでいたのですが、ほんのちょっとした修正で、無事に解決に至りました。

 その修正内容とは「tabIndexを指定する」ということです。

 なんでこれで解決したのかはわかりませんが、Flex SDK 3.2には、FocusManager絡みのバグがあるようなので、もしかするとそれが原因なのかもしれません。
 とにかくこれからは、tabIndexは必ず指定しようと、固く心に誓ったのでした。

 数値を表す文字列を数値に変換したい場合は、各数値型クラスのスタティックメソッド「Parse」を使用すれば良いわけですが、文字列が"FFFF"とか"F3C8"(←これにピンと来た人はおっさん)みたいに、16進数表記だった場合はどうすればいいんだろうという部分で行き詰まってしまいました。

 最初は、VBのValやCInt的なノリで、int.Parse("0xFF");とかやってみたのですが、残念ながらうまくいかず、調べたところ、オーバーロードされたParseの第二引数"NumberStyles"に秘密があったようです。
 いろいろなスタイルを指定できるようですが、16進数表記の文字列を変換する場合は、"NumberStyles.AllowHexSpecifier"を指定すれば良いようです。

int num = int.Parse("FF",NumberStyles.AllowHexSpecifier);

 上記の例でわかる通り、文字列には16進数を表す"0x"などを付けてはいけません。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちカテゴリに属しているものが含まれています。

前のカテゴリは牛丼ニュースです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.0.3
ぎゅう♪ぎゅう♪ぎゅう♪ぎゅう♪ ぎゅう♪ぎゅう♪ ぎゅう♪ぎゅう♪