From: NISHIKAWA Date: 2008-10-03T00:50:44+09:00 Subject: [ruby-list:45525] Re: vrubyのtabPanelについて質問です。 こんばんは。nyasu@3web です。 Thu, 2 Oct 2008 14:40:35 +0900 "Miyamoto Hiroaki" 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 ★ PGP指紋 : 973A 770C 4EA8 31A0 BB51 B9F1 CBC8 022E BD01 D96C ※ PGP公開鍵ID: 0xBD01D96C