SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight入門

Silverlight入門(3)-JavaScript によるオブジェクトの動的な制御

実行時にJavaScriptからオブジェクトを操作する


エラー処理

 Silverlightプラグインが実行時に何らかのエラーを発生させた場合、エラーの通知や原因の報告を行うことができます。デバッグ時にはもちろんですが、リリース後に利用者が予期しないエラーを発生させた時、エラーの報告に役立てることができるでしょう。Silverlightで発生したエラーは、onError()イベントで受け取ります。このイベントは、エラーが発生したときにSilverlightから呼び出されます。

onError()イベント
onError(sender, errorEventArgs)

 onError()イベントのハンドラは、Silverlight.createObject()メソッドの第5パラメータに渡すオブジェクトのonErrorメンバに設定します。onErrorがnull場合は、デフォルトのエラー処理が行われます。

 onError()イベントを受ける関数は、sendererrorEventArgsという2つのパラメータを受け取ることができます。senderには、イベントを発生させたSilverlight Plug-inオブジェクトが格納されています。errorEventArgsには、エラーコードやエラー型、エラーメッセージなどを格納するErrorEventArgsオブジェクトが格納されています。このオブジェクトは、直接インスタンス化して利用することはありません。onErrorイベントのハンドラのパラメータとして受け取るため、onError()イベントを呼び出すSilverlightによって自動的に生成されます。私たちは、onError()イベントのパラメータで受け取ったこのオブジェクトを利用するだけでよいのです。

 ErrorEventArgsオブジェクトは、エラーの原因に関連する情報を提供します。エラーを整数で表したエラーコードはErrorCodeプロパティから取得できます。

ErrorEventArgsオブジェクトErrorCodeプロパティ
value = eventargs.ErrorCode

 ErrorCodeが返す値は、エラーの種類に対応した整数です。プログラムによるエラーの種別には便利ですが、人間が直観的に把握するには不向きです。

 エラーの種類は、ErrorTypeプロパティから取得することもできます。

ErrorEventArgsオブジェクトErrorTypeプロパティ
value = eventargs.ErrorType

 ErrorTypeプロパティは、ErrorType列挙体によって宣言されているいずれかの値を返します。実際には、ErrorType列挙体によって定められている値が文字列として格納されています。例えば、XAMLの構文が間違っているような場合は"ParserError"が、画像のダウンロードに失敗した場合は"ImageError"といった文字列が返されます。

 エラーの詳細は、ErrorMessageプロパティから取得できます。ErrorMessageプロパティの値は、エラーの原因を表すテキストです。

ErrorEventArgsオブジェクトErrorMessageプロパティ
value = eventargs.ErrorMessage

 エラーが何によって引き起こされたのかをErrorTypeプロパティから種別し、ErrorCodeErrorMessageから得られる値で、具体的なエラー原因を特定できます。予期せぬエラーで利用者を混乱させないためにも、エラー処理は重要です。

コード03 index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>Silverlight test</title>
  <script type="text/javascript" src="Silverlight.js"></script>
  <script type="text/javascript">
function onErrorHandler(sender, errorEventArgs) {
 var errorPanel = document.getElementById("errorPanel");
 errorPanel.innerHTML = "<strong>エラーが発生しました</strong><br/>" +
  "エラーコード=" + errorEventArgs.ErrorCode + "<br/>" +
  "エラータイプ=" + errorEventArgs.ErrorType + "<br/>" +
  "メッセージ=" + errorEventArgs.ErrorMessage
 ;
}
  </script>
 </head>

 <body>
  <div id="errorPanel" style="color:red;"></div>
  <div id="silverlight"></div>

  <script type="text/javascript">
var parentElement = document.getElementById("silverlight");

Silverlight.createObject(
 "test.xaml",     //ソースファイル
 parentElement,   //Silverlight を表示するDIVタグのDOMオブジェクト
 "silverlight01", //任意の一意なプラグインID
 {
  width: "400",          //幅
  height: "300",         //高さ
  background: "#FFFFFF", //背景色
  version: "1.0"         //Silverlight のバージョン
 },
 {
  onError: onErrorHandler, //エラー時のイベントハンドラ
  onLoad: null             //読み込み時のイベントハンドラ
 },
 null,  //初期化パラメータ
 null   //onLoad イベントに渡される値
);
  </script>
 </body>
</html>
図03 実行結果
図03 実行結果

 コード03は、onErrorHandler()関数をonError()イベントとしてSilverlight.createObject()メソッドのパラメータに渡しています。その結果、このSilverlightプラグインでエラーが発生したときにonErrorHandler()関数が呼び出されます。例では、意図的に不適切なXAMLファイルを読み込ませてエラーを発生させています。onErrorHandler()関数は、ErrorEventArgsオブジェクトからエラーの種類や原因を取得し、DIVオブジェクトに表示させます。実行結果を見ると、SilverlightによってXAMLが読み込まれるとエラーが発生し、onErrorHandler()関数が呼び出されていることを確認できます。

XAMLファイルの動的な読み込み

 Silverlight Plug-inオブジェクトを使うことで、さらに柔軟なプログラムを実現することも可能です。例えばSourceプロパティはSilverlightが読み込んでいるXAMLファイルそのものを表すプロパティです。このプロパティは、現在のXAMLファイルのパスを取得するだけではなく、別のXAMLファイルを設定することも可能です。このプロパティの値を変更することで、まったく別のXAMLファイルを実行時に読み込ませることができます。また、Silverlightオブジェクトの構造を初期状態に復元したい場合にも応用できます。

Silverlight Plug-inオブジェクトSourceプロパティ
value = silverlightObject.Source
silverlightObject.Source = value

 onLoad()イベントで受け取ったオブジェクトをグローバルなスコープに保存しておいて、任意のタイミングでSourceプロパティの値を変更すれば、1つのSilverlightプラグインの中で複数のXAMLファイルの表示を切り替えることができます。

コード04 index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>Silverlight test</title>
  <script type="text/javascript" src="Silverlight.js"></script>
  <script type="text/javascript">
var silverlight;

function onLoadHandler(sender, context, source) {
 silverlight = sender;
}
function onClickHandler() {
 var xaml = document.getElementById("xamlInput");
 silverlight.Source = xaml.value;
}
  </script>
 </head>

 <body>
  <div>
   <input type="text" id="xamlInput"></input>
   <input type="button" onclick="onClickHandler()" value="OK"></input>
  </div>
  <div id="silverlight"></div>

  <script type="text/javascript">
var parentElement = document.getElementById("silverlight");

Silverlight.createObject(
 "test1.xaml",    //ソースファイル
 parentElement,   //Silverlight を表示するDIVタグのDOMオブジェクト
 "silverlight01", //任意の一意なプラグインID
 {
  width: "400",          //幅
  height: "300",         //高さ
  background: "#FFFFFF", //背景色
  version: "1.0"         //Silverlight のバージョン
 },
 {
  onError: null,         //エラー時のイベントハンドラ
  onLoad: onLoadHandler  //読み込み時のイベントハンドラ
 },
 "Dote up a cat.",       //初期化パラメータ
 "Kitty on your lap"     //onLoad イベントに渡される値
);
  </script>
 </body>
</html>
図04 実行結果
図04 実行結果

 コード04は、デフォルトで「test1.xaml」を表示していますが、テキストボックスにXAMLファイルのアドレスを入力して[OK]ボタンを押すと、入力されたXAMLファイルを読み込むというプログラムです。テキストボックスと[OK]ボタンはHTMLフォームによって表示されています。ボタンが押されるとonClickHandler()関数が呼び出され、Sourceプロパティの値を入力された値に変更します。コード04では、同じフォルダに「test2.xaml」と「test3.xaml」を置いてあるので、テキストボックスに入力して[OK]ボタンを押してみてください。

次のページ
スクリプトからオブジェクトを操作する

この記事は参考になりましたか?

Silverlight入門連載記事一覧

もっと読む

この記事の著者

赤坂 玲音(アカサカ レオン)

平成13年度「全国高校生・専門学校生プログラミングコンテスト 高校生プログラミングの部」にて最優秀賞を受賞。2005 年度~ Microsoft Most Variable Professional Visual Developer - Visual C++。プログラミング入門サイト WisdomSoft の管理人。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1938 2008/08/20 11:59

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー