ruby-****@sourc*****
ruby-****@sourc*****
2008年 10月 13日 (月) 09:10:32 JST
------------------------- REMOTE_ADDR = 222.225.51.171 REMOTE_HOST = URL = http://ruby-gnome2.sourceforge.jp/ja/hiki.cgi?libglade2-tut-mainwindow ------------------------- @@ -27,18 +27,18 @@ {{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を呼び出します。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"のHandler内で意思確認のためのダイアログを表示して、その入力結果によってHandlerから返す値を変更するなどの方法があります。 -さらに"destroy" SignalのHandlerを作成するためにSignal:でdestroyを選択し直してこれもリストに追加します。 +ちなみにGladeで"delete_event" Signalを登録せずHandlerを書かなかった場合は、必ず"destroy" Signalが発生します。) -{{br}} +さらに"destroy" SignalのHandlerを作成するためにSignal:欄でdestroyを選択し直してこれもリストに追加します。このHandler内には本当にウィンドウを閉じる(破棄する)場合に行う処理を書くことになります。 -#後で、on_main_window_delete_eventとon_main_window_destroyというメソッドをRubyで記述し、実際の終了コードを書きます。 +{{br}} -ちなみにdelete_event SignalのHandler(on_main_window_delete_event)からfalseを返すと、「ウィンドウを破棄しても良い」と答えたとみなされdestroy Signalが発生し、trueを返すと破棄が中止されます。Gladeでdelete_event Signalを登録せずHandlerを書かなかった場合は、必ずdestroy Signalが発生します。 +#後で、"on_main_window_delete_event"と"on_main_window_destroy"というメソッドをRubyで記述し、実際の終了コードを書きます。 -またdestroy SignalのHandler(on_main_window_destroy)では必ずGtk.main_quitを呼び出すようにします。このモジュールメソッドは、アプリケーションがイベントを処理するためのメインループから脱け出す機能を持つので、これを呼び忘れると、GUIが消されたにもかかわらずスクリプトの実行がトップレベルに戻らずプログラムが終了できない、という状態になってしまいます。 +また"destroy" SignalのHandler(on_main_window_destroy)では必ず"Gtk.main_quit"を呼び出すようにします。このモジュールメソッドは、アプリケーションがSignalを処理するためのメインループから脱け出す機能を持つので、これを呼び忘れると、ウィンドウが消されたにもかかわらずスクリプトの実行がトップレベルに戻らずプログラムが終了できない、という状態になってしまいます。