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

From: "Miyamoto Hiroaki" <miyamoto.hiroak@...>
Date: 2008-10-03 01:22:24 UTC
List: ruby-list #45526
nyasu@3web さん、ありがとうございました。

説明していただいた内容を理解して、
以下のようなプログラムで動作確認しました。

--------
require 'vr/vruby'
require 'vr/vrcomctl'
require 'vr/vrcontrol'

def btn1_clk_func
  if $cl == "c" then                    # panel0から呼ばれた (1)
    p "call child"
    p @button1.caption
    p @edit1.caption
    p @parent.panel1.edit2.caption      # parent(親)まで上がって参照
  end
  if $cl == "p" then                    # tabPanel1から呼ばれた (2)
    p "call parent"
    p @panel0.button1.caption
    p @panel0.edit1.caption
    p @panel1.edit2.caption
  end
end

module Cntn_tabPanel1_panel0
  include VRStdControlContainer
  attr :button1
  attr :edit1

  def _cntn_init
    addControl(VRButton,'button1',"button1",76,61,120,40,1342177280)
    addControl(VREdit,'edit1',"edit1",36,29,196,20,1342177408)
#   send_parent("button1","clicked")    # コメントで (1) 有効の場合 (2)を実行 

  end

  def button1_clicked
    $cl = "c"
    btn1_clk_func
  end
end

module Cntn_tabPanel1_panel1
  include VRStdControlContainer
  attr :edit2

  def _cntn_init
    addControl(VREdit,'edit2',"edit2",20,37,220,20,1342177408)
  end
end

module Cntn_tabPanel1
  attr :panel0
  attr :panel1
  def _cntn_init
    vrinit
    @panel0.extend(Cntn_tabPanel1_panel0)._cntn_init
    @panel1.extend(Cntn_tabPanel1_panel1)._cntn_init
  end

  def panel0_button1_clicked            # 追記
    $cl = "p"
    btn1_clk_func
  end
end

module Frm_form1
  def _form1_init
    self.caption = 'form1'
    self.move(288,549,300,200)
    addControl(VRTabbedPanel,'tabPanel1',"tabPanel1",8,8,272,152,1409286144)
    @tabPanel1.setupPanels(
*[
  'パネル1',
  'パネル2',
]
)
    @tabPanel1.extend(Cntn_tabPanel1)._cntn_init
  end

  def construct
    _form1_init
  end
end

# Top Form表示
frm=VRLocalScreen.newform
frm.extend Frm_form1
frm.move 100,100,300,300
frm.create.show
VRLocalScreen.messageloop

----- Original Message ----- 
From: "NISHIKAWA" <nyasu@osk.3web.ne.jp>
To: "ruby mailing list" <ruby-list@ruby-lang.org>
Sent: Friday, October 03, 2008 12:50 AM
Subject: [ruby-list:45525] Re: vrubyのtabPanelについて質問です。


> こんばんは。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

Prev Next