2009-07-20 19 views
1

私の生産コードのバグをテストケースに減らすために、 "How to undersand the POE-Tk use of destroy?"を投稿しました。しかし、テストケースに対する解決策は、完全なプログラムでは機能していないようです。POE-Tkの名前空間の理解

プログラムは800行以上ありますので、私は完全に投稿することを躊躇しています。私がここで提供しているスニペットは短すぎて使用することはできませんが、解決策を探す場所や、私が提供できる追加情報について何らかの方向性を得ることを望みます。

私のPOE-TkアプリケーションのSession :: Createセクションは次のとおりです。


POE::Session->create(
    inline_states => { 
     _start  => \&ui_start, 
     get_zone => \&get_zone, 
     ping  => \&ping, 
     mk_disable => \&mk_disable, 
     mk_active => \&mk_active, 
     pop_up_add => \&pop_up_add, 
     add_button_press => sub { 
      my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP]; 
      print "\nadd button pressed\n\n"; 
      &validate; 
     }, 
     ih_button_1_press => sub { 
      my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP]; 
      print "\nih_button_1 pressed\n\n"; 
      if(Tk::Exists($heap->{ih_mw})) { 
       print "\n\nih_mw exists in ih_button_1_press\n\n"; 
      } else { 
       print "\n\nih_mw does not exist in ih_button_1_press\n\n"; 
      } 
      1; 
      $heap->{ih_mw}->destroy if Tk::Exists($heap->{ih_mw}); 
      &auth; 
     }, 
     pop_up_del => \&pop_up_del, 
     auth  => \&auth, 
#  validate => \&validate, 
     auth_routine => \&auth_routine, 
     raise_widget => \&raise_widget, 
     del_action => \&del_action, 
     over  => sub { exit; } 
    } 
);

add_button_pressと呼ばれます。


sub pop_up_add { 
    ... 
    my $add_but_2 = $add_frm_2->Button( 
     -text => "Add Record", 
     -command => $session->postback("add_button_press"), 
     -font => "{Arial} 12 {bold}") -> pack(
      -anchor => 'c', 
      -pady => 6, 
     ); 
    ... 
}

validateは、トップレベルウィジェット$ heap - > {ih_mw}を作成します。


sub validate { 
    ... 
    if(! $valid) { 
     print "\n! valid entered\n\n"; 
     $heap->{label_text} .= "Add record anyway?"; 
     my $lt_ref = \$heap->{label_text}; 
    ... 
     my $heap->{ih_mw} = $heap->{add_mw}->Toplevel(-title => "ih_mw"); 
    ... 
     if(Tk::Exists($heap->{ih_mw})) { 
      print "\n\nih_mw exists in validate\n\n"; 
     } else { 
      print "\n\nih_mw does not exist in validate\n\n"; 
     } 
    ... 
     my $ih_but1 = $heap->{ih_mw}->Button(-text => "Add", 
      -font => 'vfont', 
      -command => $session->postback("ih_button_1_press"), 
      )->pack(-pady => 5); 
    ... 
}

$ ih_but1を押すとこの結果になります。

C:\scripts\alias\resource>alias_poe_V-3_0_par.pl

ボタンを追加

呼ば

サブ検証を押します!有効は

ih_mw

だから $heap->{ih_mw}ウィジェットも ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];」を含めると ih_button_1_press無名サブルーチンに未知であるように思わ ih_button_1_press

には存在しません

ih_mwを押し

ih_button_1検証に存在して入力されました"

+0

$ heapと$ heap - > {ih_mw)の両方が実際に定義されているかどうかを確認してください()。 $ヒープが定義されていない場合、あなたは以前の投稿と同じ問題を抱えている可能性があります。 – Inshallah

+0

if(defined($ heap))をif(Tk :: Exists($ heap - > {ih_mw}))の前に追加しました。 $ヒープが定義されたことが戻ってきました。 押しih_button_1は... ヒープが定義されている... ih_mwがih_button_1_pressに存在しない ... – jpolache

+0

何については、定義された($ヒープ - > {} ih_mw)? – Inshallah

答えて

2

$ヒープはどこですか&検証はどこから来たのですか?それをパラメータとして渡さないでください。 $ の$ヒープを有効にし、&の$ヒープin_button_1_pressを同じものにすることはできませんか? $ヒープの文字列形式を表示して、2つの関数のアドレスが同じであるかどうか確認しましたか?

+0

コードがありません。 使用Tk; POE qw(ループ:: TkActiveState)を使用します。 からperldoc POE :: Session; POE ::セッションの呼び出し規約 sub handle_event { my($ kernel、$ heap、$ parameter)= @_ [KERNEL、HEAP、ARG0]; ...; } ほとんどの例のように、C "$ _ [KERNEL]"、C "$ _ [HEAP]"、C "$ _ [ARG0]"のインラインでの使用。 ここで起こっていることは、むしろ基本的なことです。 Perlは@_配列を使ってサブルーチンやメソッドにパラメータを渡します。 "KERNEL"、 "HEAP"、 "ARG0"などは、POE :: Sessionによってエクスポートされる定数です(プログラムがPOEを使用するときは無料です)。 "stringy形式の$ヒープ"? – jpolache

+0

あなたは私の質問に答えませんでした:$ヒープはどこから来て&検証しますか?引数なしでadd_button_pressから呼び出して&validateするので、$ heap = @ _ [HEAP]を介して$ヒープを取得して検証すると、あなたは驚いているでしょう。また、関数呼び出しの&validate形式は、単純な単純な検証とは異なり、呼び出しコンテキストから@を継承しません。 –

+2

これは正しく表示されません(検証時): my $ heap - > {ih_mw} ... 'my'を付けずに試してみてください。 –