ruby-****@sourc*****
ruby-****@sourc*****
2008年 10月 22日 (水) 18:33:16 JST
------------------------- REMOTE_ADDR = 222.225.51.171 REMOTE_HOST = URL = http://ruby-gnome2.sourceforge.jp/ja/hiki.cgi?libglade2-tut-mainwindow ------------------------- @@ -27,11 +27,11 @@ {{image_right("ss_signals.png")}} ウインドウの右上にある×ボタン(「閉じる」ボタン)がクリックされたらアプリケーションを終了させることにします。 -×ボタンがクリックされると、main_windowは"delete_event" Signalを発生させるのでそれを捕捉してHandlerを呼び出します。Signal:欄で"delete_event"を選択すると、Handlerは自動的に"on_main_window_delete_event"という名前になります。名前を変更しても良いですが、ここではそのまま使います。Addボタンを押してリストにSignalとHandlerを追加します。 +×ボタンがクリックされると、main_windowは"delete_event" Signalを発生させるのでそれを捕捉してHandler(Rubyではメソッド)を呼び出します。Signal:欄で"delete_event"を選択すると、Handlerは自動的に"on_main_window_delete_event"という名前になります。名前を変更しても良いですが、ここではそのまま使います。Addボタンを押してリストにSignalとHandlerを追加します。 -(この"delete_event"はウィンドウマネージャからウィンドウを閉じようとした時に発生するSignalで、X Window Systemのイベントメカニズム由来のため、Handlerの最後で、Signalに対する処理を行ったかどうかを真偽値で返す必要があります。falseを返すとSignalを処理していないとみなされ、つづいて自動的に"destroy" Signalが発生します。trueを返すと処理終わったとみなされ、それ以上何も起こりません(ウィンドウは閉じられません)。((-ちょうどこの仕組みを利用して、文書が未保存のままウィンドウが閉じられようとした時に、保存するか否かまたはウィンドウを閉じること事態をキャンセルするか、の意思確認をする機能を作ることができます。具体的には、"delete_event"のHandler内で意思確認のためのダイアログを表示して、その入力結果によってHandlerから返す値を変更するなどの方法があります。-)) +この"delete_event"はウィンドウマネージャからウィンドウを閉じようとした時に発生するSignalで、X Window Systemのイベントメカニズム由来のため、Handlerの最後で、Signalに対する処理を行ったかどうかを真偽値で返す必要があります。falseを返すとSignalを処理していないとみなされ、つづいて自動的に"destroy" Signalが発生します。trueを返すと処理が終わったとみなされ、それ以上何も起こりません(ウィンドウは閉じられません)。((-ちょうどこの仕組みを利用して、文書が未保存のままウィンドウが閉じられようとした時に、保存するか否かまたはウィンドウを閉じること事態をキャンセルするか、の意思確認をする機能を作ることができます。具体的には、"delete_event"のHandler内で意思確認のためのダイアログを表示して、その入力結果によってHandlerから返す値を変更するなどの方法があります。-)) -Gladeで"delete_event" Signalを登録せずHandlerを書かなかった場合は、必ず"destroy" Signalが発生します。) +Gladeで"delete_event" Signalを登録せずHandlerを書かなかった場合は、必ず"destroy" Signalが発生します。 さらに"destroy" SignalのHandlerを作成するためにSignal:欄でdestroyを選択し直してこれもリストに追加します。このHandler(on_main_window_destroy)内には本当にウィンドウを閉じる(破棄する)場合に行う処理を書くことになります。((-Handler内では必ず"Gtk.main_quit"を呼び出すようにします。このモジュールメソッドは、アプリケーションがSignalを処理するためのメインループから脱け出す機能を持つので、これを呼び忘れると、ウィンドウが消えるにもかかわらずループが継続されてしまい、外部から強制的にプログラムを終了するしかない状態になってしまいます。-))