[#35406] RE: win32ole で excel が終了しない — "Oka Yasushi" <oka@...>

こんにちは、岡といいます。

20 messages 2002/06/19
[#35407] Re: win32ole で excel が終了しない — Takashi Kanai <kanai@...4u.or.jp> 2002/06/19

金井です。

[#35408] Re: win32ole で excel が終了しない — Takashi Kanai <kanai@...4u.or.jp> 2002/06/19

金井です。

[#35412] Re: win32ole で excel が終了しない — "NAKAMURA, Hiroshi" <nakahiro@...> 2002/06/20

なひです。

[#35418] Re: win32ole で excel が終了しない — Takashi Kanai <kanai@...4u.or.jp> 2002/06/20

金井です。

[#35419] Re: win32ole で excel が終了しない — nobu.nakada@... 2002/06/21

なかだです。

[#35480] Re: 1.7 系を使っていますが、5月頃は式展開内のコメントが使えていましたが、今は使えなくなっていますね。 — "井上 浩一" <kyoui32@...>

=1B$B0f>e$G$9!#=1B(B

12 messages 2002/06/28
[#35490] Re: 1.7 系を使っていますが、5月頃は式展開内のコメントが使えていましたが、今は使えなくなっていますね。 — "Inoue" <rubyist@117.ne.jp> 2002/06/28

井上です。

[ruby-list:35326] update Tk

From: nagai@...
Date: 2002-06-04 10:40:03 UTC
List: ruby-list #35326
永井@知能.九工大です.

ruby-dev の方にも書きましたが,1.7.x の CVS の方で
Ruby/Tk 周りの修正を行いました.
今回の修正はかなり影響の大きいものになっていますから,
もし良かったらテストしてみていただけると助かります.
ポイントは以下の通りです.

・mainloop を作り直した.
  これにより,複数のスレッドを用いている際のレスポンスが向上したはずです.
  さらに,スレッド切り替えのタイミングをコントロールするパラメータも
  変更できるようにしましたので,アプリケーションのタイプや状態に応じて
  mainloop スレッドのプライオリティを制御できます.
  また,Tk.restart のことなども考え,root widget が破壊されても
  mainloop を終了しないようにするパラメータも加えています.

・mainloop_watchdog の追加.
  従来の mainloop は例えば Tk のコールバック中に Thread.new{b.invoke}.join 
  というようなことを行うと mainloop が停止して deadlock に陥りました.
  mainloop を使うところで代りに mainloop_watchdog を使えば,
  この問題を回避できます.
  ただし,監視スレッドが動くことになり,負荷が増えますから,
  特に必要なケース以外は従来の mainloop を使っておく方がいいでしょう.

・特定の safe-level でのコールバック実行の適正化.
  従来のイベントループでは,イベントループ以外のスレッドからの操作の際に
  $SAFE の指定がうまく機能しないケースがありましたので,対策を施しました.

・Tk でのパラメータ指定に Symbol を使えるようにした.
  属性名指定などに Symbol を使えるようになりました.
  ただし,キーボードを打つのが 1 文字減るだけだという話もあります.

・ウィジェットクラスでの new メソッドで,第 1 引数なしの記述を可能とした.
  parent 属性で指定するという形式を可能としました.
  以下のような記述が可能となります.
    TkFrame.new('classname'=>'User'){|base|
      pack
      f = TkFrame.new(base, :classname=>'ButtonFrame').pack
      TkButton.new(
         :parent     => f,
         :text       => 'Quit', 
         :command    => proc{exit}
      ).pack(
         :fill => :x, 
         :pady => 2
      )
    }

・キャンバスオブジェクトの new メソッドで,座標を属性で与えられるようにした.
  従来の new メソッドでは,座標値をひとつずつ引数で並べねばなりませんでした.
  これは,座標値の並びを配列で管理し,属性も Hash で指定したいという場合に
  少々不便です (属性を後で与えるなどとすると Tk 呼び出しが増えて嬉しくない).
  そこで coords 属性に座標値の並びを配列で与えることができるようにしました.

・TkAfter の強化.
  TkAfter オブジェクトに登録される反復手続きなどにおいて,
  ブロック引数でオブジェクト自身を受け取ることができるようにしました.
  これに伴い,TkAfter#current_interval, TkAfter#current_args, 
  TkAfter#return_value メソッドを追加し,現在のインターバル値や
  直前の反復手続きの戻り値などを受け取ることができるようにしています.
  従来でも proc の共通スコープの変数を使えば同じようなことができたのですが,
  それよりは少しながら自由度が上がっています.

・リソースデータベースをまともに活用できるようにした.
  リソースデータベース自体は従来から使えはしましたが,
  「ウィジェット名がわからない」,「アプリケーション名が指定できない」などで
  正直なところ,使い物にはなりませんでした.
  今回の修正で,きちんと使えるようになったと思います.
  具体的には以下のいくつかの修正が効いています.

・Tk.restart で app-name と use を指定できるようにした.
  app-name はアプリケーション名およびリソースクラスを決定します.
  use は root widget を指定した WINDOW ID のウィンドウに埋め込みます.
  これにより,一旦 require 'tk' をした後に restart することで,
  Ruby/Tk アプリケーションに名前を付けたり,特定のアプリケーションの中に
  埋め込んだりすることが可能となります.
  従来でもアプリケーション名は Tk.appname で付けることはできましたが,
  これではリソースクラスは変更されず,しかも複数起動すると 
  アプリケーション名には #1 などが付くため,リソースデータベースでは
  使い物になりませんでした.
  今回の修正でリソースクラスを指定できるようになりましたから,
  リソースデータベースを有効に使えるはずです.

・ウィジェットクラスの new メソッドでウィジェット名を指定できるようにした.
  widgetname 属性を追加しました.
  従来,ウィジェット名は自動で付けられていましたが,
  その場合,名前が特定できないことや特定できたとしても意味を持たない文字列
  であることから,リソースデータベースでの指定には支障がありました.
  これにより名前を指定することが可能になります.
  例えばリソースデータベースに Xxx*quit.text: QUIT などと設定し,
    Tk.restart('Xxx')
    TkButton.new(nil, 'widgetname'=>'quit', 'command'=>proc{exit}).pack
    Tk.mainloop
  などと実行すれば,quit ボタンの表示文字列は 'QUIT' になります.
  もちろん,リソースデータベースの項目はウィジェット生成前に
  有効になっていなければなりません.

・ユーザ定義手続きをリソースデータベースで設定するためのサポートを追加.
  TkOption::new_proc_class を追加しました.
  これは,リソースデータベース上でのユーザによる手続きの定義を
  受け付けるクラスを生成するものです.
  リソースデータベースでのクラス名の他,パラメータとして,
  定義できるメソッド一覧,実行の safe-level,メソッド追加を許すか,
  親となるクラスの指定が可能です.
  例えば resource-test というファイルに
    *CMD.foo: {|*args| p [$SAFE, :foo, args]}
    *CMD.XXX.bar: {|*args| p [$SAFE, :bar, args]}
    *Button.command: ruby {p self; p $SAFE; TkOption::CMD::XXX.bar(1,2,3)}
  などと設定(ボタンウィジェットなどの command 属性指定は,3 行目のように
  ruby { ... }としてください)をしておき,
    require 'tk'
    TkOption.readfile 'resource-test'
    p TkOption.new_proc_class(:CMD, [:foo], 1)
    p TkOption.new_proc_class(:XXX, [:bar], 2, false, TkOption::CMD)
    TkButton.new(:text=>'test').pack
    Tk.mainloop
  などと実行すれば,その効果を確認できると思います.
-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai@ai.kyutech.ac.jp

In This Thread

Prev Next