バイト制限 Entry

Gtk::Entry#set_max_length() で Entry に入力できる最大 文字数を指定できますが、これは文字数であってバイト長ではありません。 たとえば5文字に制限した場合、"いろはにほ" の 10バイト入力できてし まいます。文字数でなくてバイト数で制限を掛けたい時もあります。とい うことで、バイト数の制限を掛ける set_max_byte() です。

このモジュールを使用するためには Ruby/Gtk に insert_text シグナル を処理するためのパッチと、signal_handler_block() を追 加するパッチを適用する必要があります。

このサンプルでは文字を入力してもカーソルが移動しません。 ruby-gtk-0.23 のリリースに合わせ近々変更予定。

…のつもりでしたが、今の Ruby/Gtk の仕組みではできません。そのうち できるようになるでしょう…。

module ByteEntry
  def set_max_byte(max)
    max_byte = max
    handler_id = signal_connect("insert_text") do |a|
      cur_len = get_text.length
      if cur_len < max_byte
        w, s, p = a
        if cur_len + s.length > max_byte
          len = max_byte - cur_len
          ss = ""
          s.scan(/./) do |a|
            break if ss.length + a.length > len
            ss << a
          end
          s = ss
        end
        signal_handler_block(handler_id)
        insert_text(s, p[0])
        signal_handler_unblock(handler_id)
      end
      signal_emit_stop("insert_text")
    end
  end
end

使用例

class MyEntry < Gtk::Entry
  include ByteEntry
end

w = Gtk::Window::new.show
h = Gtk::HBox::new.show
e = MyEntry::new.show
e.set_max_byte(7)
h.pack_start e, false, false
w.add h
Gtk::main

tommy@tmtm.org

Last modified: Sat Sep 15 04:12:53 JST 2001