[#39989] TCPSocket.new でスレッドが止まる。 — take_tk <ggb03124@...>

たけ(tk)です。

15 messages 2004/09/02

[#40018] yaml.rbとdate.rbを組み合わせて使った際の問題 — "Keisuke Minami" <keisuke@...>

こんにちは。三並と申します。

14 messages 2004/09/07
[#40020] Re: yaml.rbとdate.rbを組み合わせて使った際の問題 — IWATSUKI Hiroyuki <don@...> 2004/09/07

岩月と申します。

[ruby-list:39984] ruby/tk のイベントハンドラをまとめて設定するには?

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2004-09-01 11:43:13 UTC
List: ruby-list #39984
山本です。

複数の図形に対して、下のような感じでループでまとめてイベントハンドラを
設定したいと考えています。下のコードは、それぞれクリックしたときに 1, 2, 3 を表示します。

require "tk"

#r = nil

TkCanvas.new {
  3.times {|i|
    h = i * 50
    r = TkcRectangle.new(self, 100 + h, 100 + h, 200 + h, 200 + h, :fill => :white)
    r.bind "ButtonPress-1", proc { p r.id }
  }
  pack
}

Tk.mainloop

ところが、コメントを外すと(つまり、外側のスコープに同名の変数があると)常に 3 しか
表示しなくなります。理由は http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Proc
でわかったのですが、Ruby2 では r はブロックローカルでなくなると聞いたので、コメントを
外さなくても常に 3 が表示されるようになると思います。

Javaだと

for (int i = 0; i < 3; ++i) {
  final Rectangle r = .....
  ....addActionListener(new ActionListener(){
    public void actionPerformed() {
      print r.toString();
    }
  }
}

とすれば、ループごとの r が actionPerformed にバインドされるのですが、ruby で将来にわたって
安全なやりかたというのは、どういった形になりますか?

-----------------------

生成と同時に bind するなら下のでいいのですが、今回は生成後に bind するということでよろしく
お願いします。bind に渡すコマンドで、クリックした図形のインスタンスが変えるようなものを
探したのですが、見つけられませんでした。("%W"はキャンバスが返るし)

require "tk"

TkCanvas.new {
  3.times {|i|
    h = i * 50
    TkcRectangle.new(self, 100 + h, 100 + h, 200 + h, 200 + h, :fill => :white) {
      bind "ButtonPress-1", proc { p self.id }
    }
  }
  pack
}

Tk.mainloop



In This Thread

Prev Next