ruby-****@sourc*****
ruby-****@sourc*****
2003年 9月 11日 (木) 02:06:35 JST
------------------------- REMOTE_ADDR = 218.231.205.39 REMOTE_HOST = URL = http://ruby-gnome2.sourceforge.jp/ja/?tut-gtk-calendar ------------------------- = カレンダー カレンダーウィジェットは効率的に月単位に日付の情報を表示したり取得することのできるウィジェットで,生成するのも利用するのもいたって簡単である. Gtk::Calendar.new 場合によってはカレンダーウィジェット内の多くの情報を変更したいかもしれない. そういう場合には次のメソッドを用いてカレンダーウィジェットへの変更過程がユーザの目に触れるのを防ぐことができる. Gtk::Calendar#freeze Gtk::Calendar#thaw - Gtk::Calendar#freeze/Gtk::Calndar#thawは,他の全てのウィジェットのfreeze/thawメソッドと同様に動作する. + Gtk::Calendar#freeze / Gtk::Calendar#thawは,他の全てのウィジェットのfreeze/thawメソッドと同様に動作する. ((-多分このメソッドは初出.freezeでウィジェットの外観の更新を止め,thawで更新を開始する?-)) Gtk::Calendar#display_options(flags) flags引数には次の5つのオプションの論理和を指定する: :Gtk::Calendar::SHOW_HEADING 月と年を表示する. :Gtk::Calendar::SHOW_DAY_NAMES 曜日を表示する.(localeによって"月","火"… や "Mon","Thu"…など) :Gtk::Calendar::NO_MONTH_CHANGE ユーザが表示月を変更することを禁止する.例えば,ある年の全ての月を12個のカレンダーウィジェットで表示したい場合などに有効である. :Gtk::Calendar::SHOW_WEEK_NUMBERS カレンダーの左側に週番号を表示する.(1月1日は第1週,12月31日は第52週) :Gtk::Calendar::WEEK_START_MONDAY 週の開始日を日曜(デフォルト)ではなく月曜に変更する. {{image_right "calendars1.png"}}{{br}} #! /usr/bin/env ruby require 'gtk2' Gtk.init window = Gtk::Window.new window.signal_connect("delete_event") {Gtk.main_quit} hbox = Gtk::HBox.new(false, 10) window.add(hbox) flag = 0 [ Gtk::Calendar::SHOW_HEADING, Gtk::Calendar::SHOW_DAY_NAMES, Gtk::Calendar::NO_MONTH_CHANGE, Gtk::Calendar::SHOW_WEEK_NUMBERS, Gtk::Calendar::WEEK_START_MONDAY, ].each do |f| c = Gtk::Calendar.new flag |= f c.display_options(flag) hbox.pack_start(c, true, true, 0) end window.show_all Gtk.main 次のメソッドで表示月/日を変更することができる: Gtk::Calendar#select_month(month, year) Gtk::Calendar#select_day(day) Gtk::Calendar#select_monthは,月の選択が成功したかどうかを1(成功)/0(失敗)で返す. Gtk::Calendar#select_dayで現在表示中の月の指定した日を(もし可能なら)選択状態にすることができる. 逆に非選択状態にするにはday引数に0を指定すればよい. カレンダーウィジェットは,日を選択状態にするだけでなく,複数の日を「マーク」することもできる. マークされた日はハイライト表示される. 次のメソッドは日のマークに関するメソッドである: Gtk::Calendar#mark_day(day) Gtk::Calendar#unmark_day(day) Gtk::Calendar#clear_marks ((-どうやらGtk::Calendar#mark_dateやGtk::Calendar#get_dateは実装されていない模様.-)) カレンダーウィジェットは日の選択や変更に応じて沢山のシグナルを生成する. シグナル名を見ればその意味は一目瞭然だろう: * month_changed * day_selected * day_selected_double_click * prev_month * next_month * prev_year * next_year {{image_right "calendars2.png"}}{{br}} =begin calendar.rb - Gtk::Calendar sample script. Copyright (c) 2002,2003 Ruby-GNOME2 Project Team This program is licenced under the same licence as Ruby-GNOME2. $Id: calendar.rb,v 1.5 2003/04/01 16:21:14 mutoh Exp $ =end require 'gtk2' Gtk.init cal = Gtk::Calendar.new w = Gtk::Window.new w.add(cal).show_all.signal_connect('delete_event') do Gtk::main_quit end date = Time.new cal.select_month(date.month, date.year) cal.select_day(date.day) cal.mark_day(date.day) #cal.clear_marks cal.display_options(Gtk::Calendar::SHOW_HEADING | Gtk::Calendar::SHOW_DAY_NAMES | Gtk::Calendar::NO_MONTH_CHANGE | Gtk::Calendar::SHOW_WEEK_NUMBERS | Gtk::Calendar::WEEK_START_MONDAY) year, month, day = cal.date puts "this is #{month} #{day}, #{year}" cal.signal_connect('day_selected') do year, month, day = cal.date puts "selected day: #{day}" end cal.signal_connect('month_changed') do year, month, day = cal.date puts "changed month: #{month}" end cal.signal_connect('day_selected_double_click') do year, month, day = cal.date puts "dclicked day: #{day}" end cal.signal_connect('prev_month') do year, month, day = cal.date puts "prev month: #{month}" end cal.signal_connect('next_month') do year, month, day = cal.date puts "next_month: #{month}" end cal.signal_connect('prev_year') do year, month, day = cal.date puts "prev_year: #{year}" end cal.signal_connect('next_year') do year, month, day = cal.date puts "next year: #{year}" end Gtk::main ((*以下Ruby/GTK(1)用です。*)) カレンダー用のウィジェットです。とても便利です。 == 基本的な使い方 カレンダーウィジェットとボタンウィジェットの例です。getボタンをクリックすると現在選択している年月日が標準出力に出力されます。 require 'gtk' cal = Gtk::Calendar.new cal.select_month(1, 2000) cal.select_day(15) button = Gtk::Button.new("get") button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do p cal.get_date p cal.year p cal.month p cal.day end Gtk::Window.new.add(Gtk::VBox.new.add(cal).add(button)).show_all Gtk.main --- Gtk::Calendar.new カレンダウィジェットを生成します。 --- Gtk::Calendar#select_month(month, year) --- Gtk::Calendar#mmyyyy=(month, year) 選択状態にする月・年を指定します。 * month - 月(1 〜 12) * year - 年 --- Gtk::Calendar#select_day(day) --- Gtk::Calendar#day=(day) 選択状態にする日を指定します。あまりエラーチェックとかは厳しくない(2/31とかも指定できてしまうがassertionが出たりする)ので注意。 * day - 日 --- Gtk::Calendar#date --- Gtk::Calendar#get_date 現在選択されている日付を[year, month, day]の配列で返します。 --- Gtk::Calendar#year --- Gtk::Calendar#month --- Gtk::Calendar#day --- Gtk::Calendar#get_year --- Gtk::Calendar#get_month --- Gtk::Calendar#get_day それぞれ、現在選択されている年、月、日を返します。 == 表示内容を変更する 次に、表示内容を変更します。 require 'gtk' cal = Gtk::Calendar.new cal.display_options(Gtk::Calendar::SHOW_DAY_NAMES|Gtk::Calendar::WEEK_START_MONDAY) Gtk::Window.new.add(cal).show_all Gtk.main --- Gtk::Calendar#display_options(options) 表示オプションを指定します。|(論理和)で複数指定できます。 * 0 - カレンダ部のみ * Gtk::Calendar::SHOW_HEADING - ヘッダ部(一番上の"< 3 月 > < 2002 >"の行) * Gtk::Calendar::SHOW_DAY_NAMES - ヘッダ部(jaの場合は月、火、水...の行) * Gtk::Calendar::SHOW_WEEK_NUMBERS - 1月の最初週からの週の数を表示する * Gtk::Calendar::WEEK_START_MONDAY - 週を月曜日から開始する * Gtk::Calendar::NO_MONTH_CHANGE - 年・月を変更できないようにする == 指定日をマークする 次に指定した日をマーク(強調表示)してみます。サンプルでは、markボタンをクリックすると選択している日がマークされ、unmarkボタンをクリックすると非選択になります。また、clearボタンをクリックすると、全てのマークがクリアされます。 require 'gtk' cal = Gtk::Calendar.new button1 = Gtk::Button.new("mark") button1.signal_connect(Gtk::Button::SIGNAL_CLICKED) do cal.freeze cal.mark_day(cal.day) cal.thaw end button2 = Gtk::Button.new("unmark") button2.signal_connect(Gtk::Button::SIGNAL_CLICKED) do cal.unmark_day(cal.day) end button3 = Gtk::Button.new("clear") button3.signal_connect(Gtk::Button::SIGNAL_CLICKED) do cal.clear_marks end vbox = Gtk::VBox.new vbox.add(cal).add(button1).add(button2).add(button3) Gtk::Window.new.add(vbox).show_all Gtk.main --- Gtk::Calendar#mark_day(day) 指定した日をマークします。 * day - マークする日 --- Gtk::Calendar#unmark_day(day) 指定した日のマークを解除します。 * day - マークを解除する日 --- Gtk::Calendar#clear_marks 全てのマークを解除します。 --- Gtk::Calendar#freeze --- Gtk::Calendar#thaw Gtk::Calendar#freezeからGtk::Calendar#thawの間、カレンダの再描画をフリーズします。 再描画は非常に時間のかかる処理になりますので、それをしないことで結果的に処理を高速化できます。 一度に大量にマークをする際などに使うと良いでしょう。 == カレンダウィジェットのシグナル カレンダウィジェットのシグナルを説明します。 require 'gtk' cal = Gtk::Calendar.new cal.signal_connect(Gtk::Calendar::SIGNAL_MONTH_CHANGED) do |w| p "SIGNAL_MONTH_CHANGED", w end cal.signal_connect(Gtk::Calendar::SIGNAL_DAY_SELECTED) do |w| p "SIGNAL_DAY_SELECTED", w end cal.signal_connect(Gtk::Calendar::SIGNAL_DAY_SELECTED_DOUBLE_CLICK) do |w| p "SIGNAL_DAY_SELECTED_DOUBLE_CLICK", w end cal.signal_connect(Gtk::Calendar::SIGNAL_PREV_MONTH) do |w| p "SIGNAL_PREV_MONTH", w end cal.signal_connect(Gtk::Calendar::SIGNAL_NEXT_MONTH) do |w| p "SIGNAL_NEXT_MONTH", w end cal.signal_connect(Gtk::Calendar::SIGNAL_PREV_YEAR) do |w| p "SIGNAL_PREV_YEAR", w end cal.signal_connect(Gtk::Calendar::SIGNAL_NEXT_YEAR) do |w| p "SIGNAL_NEXT_YEAR", w end Gtk::Window.new.add(cal).show_all Gtk.main これらのシグナルはボタンをクリックした時などに発生します。 * Gtk::Calendar::SIGNAL_MONTH_CHANGED - 月が変わった時 * Gtk::Calendar::SIGNAL_DAY_SELECTED - 日が選択された時 * Gtk::Calendar::SIGNAL_DAY_SELECTED_DOUBLE_CLICK - 日が選択されてかつダブルクリックされた時 * Gtk::Calendar::SIGNAL_PREV_MONTH - 前の月ボタンがクリックされた時 * Gtk::Calendar::SIGNAL_NEXT_MONTH - 次の月ボタンがクリックされた時 * Gtk::Calendar::SIGNAL_PREV_YEAR - 前の年ボタンがクリックされた時 * Gtk::Calendar::SIGNAL_NEXT_YEAR - 次の年ボタンがクリックされた時