[ruby-list:45525] Re: vrubyのtabPanelについて質問です。

From: NISHIKAWA <nyasu@...3web.ne.jp>
Date: 2008-10-02 15:50:44 UTC
List: ruby-list #45525
こんばんは。nyasu@3web です。

Thu, 2 Oct 2008 14:40:35 +0900 
"Miyamoto Hiroaki" <miyamoto.hiroak@jp.fujitsu.com> wrote

Miyamoto> 下記コードで、tabPanel0上のbutton1クリックで、同一tabPanel0上のedit1は
Miyamoto> @edit2.caption
Miyamoto> で参照できますが、
Miyamoto> tabPanel1上のedit2を参照しようとして、@edit2.captionに変更するとエラーになります。
Miyamoto> 
Miyamoto> どのように記述すればいいかできれば教えていただけないでしょうか?

とりあえず状況説明から。
「@」で始まる変数は、ある特定のオブジェクトの中でしか共有しませんから、
Cntn_tabPanel1_panel1で定義された@edit2は、外部のbtn1_clk_func 
からは見えません。btn1_clk_funcの呼び出しでトップレベルのメソッドが動いている
ように見えますが、実際はpanel0のメソッドが動いています。
・トップレベルへの定義→ Kernelモジュールへの定義→ Object経由で全クラスへ継承
#のでいいのですよね。btn1_clk_funcでp selfしてみて、迂闊にもびっくりしました。
#こういう使い方普段はしないもので

各オブジェクトとbtn1_clk_funcのの親子他人関係は
+ btn1_clk_func  <他人に見えるが...>
+ frm(Frm_form1)
    +----tabPanel1(Cntn_tabPanel1)
            +--panel0(VRPanel+Cntn_tabPanel1_panel0)
                  +- button1
                  +- edit1
            +--panel1(VRPanel+Cntn_tabPanel1)
                  +- edit2
です。

edit1が@edit1として見えるのはpanel0の中だけです。
同様に@edit2が見えるのはpanel1だけです。
今回、panel0のbtn1_clk_funcが動いているので、
そこで見えるのは、button1とedit1だけです。

で、次にお望みのものの実現方法です。
要はpanel0で処理しようとするからややこしいので、tabPanel1で処理します。
VRMessageParentRelayerを使う手もありますが、現状から手っ取り早い方法では
以下のようにする手があります。

・ まずCntn_tabPanel1_panel0の_cntn_initで、
      send_parent("button1","clicked")
   を呼んでおく。これでtabPanel側で、panel0_button1_clicked が
   発生するようになります。
・ 次にCntn_tabPanel1 に  panel0_button1_clicked を定義(panel0から移設)
   中身は btn1_clk_func
   これで、button1が押されると、btn1_clk_funcが呼ばれます。
   (定義位置の通り、tabPanel1での動作になります)
・すると、既にattrは十分定義していただいているので、btn1_clk_funcから
    @panel0.button1.caption
    @panel0.edit1.caption
    @panel1.edit1.caption
  などでアクセスできます。
  この時、btn1_clk_funcは、tabPanel1内で動作しています。


おまけ(元々の物から多分最短の改修方法)
一応、上記をちゃんと理解した上で使われることをおすすめします。
(説明が悪いかも知れませんが)
駆使しすぎると、そのうち訳が分からなくなります。

def btn1_clk_func
  p @parent.panel1.edit2.caption
end


以下、要点を残して勝手にざくざく略(もはや動きません)
Miyamoto> def btn1_clk_func
Miyamoto>   p @edit1.caption      # ここでtabPanel1上のedit2を参照したいのですが?
Miyamoto> end
Miyamoto> 
Miyamoto> module Cntn_tabPanel1_panel0
Miyamoto>   attr :button1
Miyamoto>   attr :edit1
Miyamoto> 
Miyamoto>   def _cntn_init
Miyamoto>     addControl(VRButton,'button1',"button1",76,61,120,40,1342177280)
Miyamoto>     addControl(VREdit,'edit1',"edit1",36,29,196,20,1342177408)
Miyamoto>   end
Miyamoto> 
Miyamoto>   def button1_clicked
Miyamoto>     btn1_clk_func
Miyamoto>   end
Miyamoto> end
Miyamoto> 
Miyamoto> module Cntn_tabPanel1_panel1
Miyamoto>   attr :edit2
Miyamoto>   def _cntn_init
Miyamoto>     addControl(VREdit,'edit2',"edit2",20,37,220,20,1342177408)
Miyamoto>   end
Miyamoto> end
Miyamoto> 
Miyamoto> module Cntn_tabPanel1
Miyamoto>   attr :panel0
Miyamoto>   attr :panel1
Miyamoto>   def _cntn_init
Miyamoto>     vrinit
Miyamoto>     @panel0.extend(Cntn_tabPanel1_panel0)._cntn_init
Miyamoto>     @panel1.extend(Cntn_tabPanel1_panel1)._cntn_init
Miyamoto>   end
Miyamoto> end
Miyamoto> 
Miyamoto> module Frm_form1
Miyamoto>   def _form1_init
Miyamoto>     addControl(VRTabbedPanel,'tabPanel1',"tabPanel1",8,8,272,152,1409286144)
Miyamoto>     @tabPanel1.extend(Cntn_tabPanel1)._cntn_init
Miyamoto>   end
Miyamoto> end
Miyamoto> 
Miyamoto> frm=VRLocalScreen.newform
Miyamoto> frm.extend Frm_form1


__ 
☆ nyasu@3Web    <nyasu@osk.3web.ne.jp>
★  PGP指紋    : 973A 770C 4EA8 31A0 BB51  B9F1 CBC8 022E BD01 D96C
※  PGP公開鍵ID: 0xBD01D96C



In This Thread