2016-05-08 25 views
-1

私はValaにGUIプログラムを書いています。私はそれをコンパイルすると、コンパイラはこのエラーを生成します。フィールドの宣言方法は?

The name e1 does not exist in the context of Subtract.minus 

コードは次のとおりです。

using Gtk; 
class Subtract:Window{ 
    public Subtract(){ 
     this.title="Subtract program"; 
     this.destroy.connect(Gtk.main_quit); 
     var e1=new Entry(); 
     var e2=new Entry(); 
     var lbl=new Label("Result"); 
     var btn=new Button.with_label("Subtract"); 
     var box=new Box(Gtk.Orientation.VERTICAL,5); 
     box.add(e1); 
     box.add(e2); 
     box.add(lbl); 
     box.add(btn); 
     this.add(box); 
     btn.clicked.connect(minus); 
    } 
    public void minus(){ 
     int a=int.parse(e1.get_text()); 
     int b=int.parse(e2.get_text()); 
     int result=a-b; 
     lbl.set_label(result.to_string()); 
    } 
    public static int main(string[]args){ 
     Gtk.init(ref args); 
     var win=new Subtract(); 
     win.show_all(); 
     Gtk.main(); 
     return 0; 
    } 
} 

にはどうすればminus方法から変数にアクセスできるようにすることができます。

+0

私はValaを使ったことがありませんが、Subtractはe1が作成されるクラススコープであり、マイナスはそのクラスのメンバーであると仮定します。 Valaは変数のクラススコープをどのように扱いますか? – oldtechaa

+0

あなたの 'e1'と' e2'変数は 'Subtract()'コンストラクタに対してローカルです。代わりに 'Subtract'クラスの中でそれらを宣言する必要があります。 (あなたは、PythonやRubyのような言語に慣れていて、インスタンス変数は関数内で定義されていると仮定しています;それはValaの仕組みではありません)。 – andlabs

+0

valaで宣言する方法は分かりません。言語。 – rahi

答えて

1

あなたはフィールドとして(少なくともe1e2lbl)あなたのウィジェットのための変数を宣言する必要があります。

using Gtk; 

class Subtract: Window { 

    // Fields (sometimes also called "attributes") 
    private Entry e1; 
    private Entry e2; 
    private Label lbl; 
    private Button btn; 
    private Box box; 

    public Subtract() { 
     title = "Subtract program"; 
     destroy.connect (Gtk.main_quit); 
     // You don't have to use "this." to access fields in Vala 
     // I.e. "this.e1" is equivalent to "e1" in the code below 
     e1 = new Entry(); 
     e2 = new Entry(); 
     lbl = new Label ("Result"); 
     btn = new Button.with_label ("Subtract"); 
     box = new Box (Gtk.Orientation.VERTICAL, 5); 
     box.add (e1); 
     box.add (e2); 
     box.add (lbl); 
     box.add (btn); 
     add (box); 
     btn.clicked.connect (minus); 
    } 

    public void minus() { 
     // The compiler happily accepts "e1" (etc.) here now 
     // since I have declared them as fields 
     int a = int.parse (e1.get_text()); 
     int b = int.parse (e2.get_text()); 
     int result = a - b; 
     lbl.set_label (result.to_string()); 
    } 

    public static int main (string[] args) { 
     Gtk.init (ref args); 
     var win = new Subtract(); 
     win.show_all(); 
     Gtk.main(); 
     return 0; 
    } 
} 

PS:正しい専門用語は、ここで「スコープ」です。あなたのコードは、コンストラクタのスコープで変数を持っていました。私のコードは、クラススコープのフィールドとしての変数として、クラスのすべてのメソッドで可視になりました。

Valaコンパイラは「コンテキスト」を呼び出しますが、この場合はほぼ同じです。

+0

私の問題を理解できるようにこのプログラムを修正してください。なぜなら、バラのチュートリアルが少ないからです。 – rahi

+0

あなたのコードを修正しました。私の答えのコードは正常に動作します、キーポイントは、クラスの冒頭にプライベート属性の宣言です。これはC++/C#/ Javaや他の言語、btwに似ています。 –

+0

また、Valaのチュートリアル:https://wiki.gnome.org/Projects/Vala/Tutorial#Basics-1 –