2016-05-08 5 views
-1

Я пишу программу 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

Я никогда не пользовался Валой, но я предполагаю, что Subtract - это класс, в котором создается e1, а минус является членом этого класса. Как Vala обрабатывает класс для переменных? – oldtechaa

+0

Ваши переменные 'e1' и' e2' являются локальными для конструктора 'Subtract()'. Вместо этого вам нужно объявить их в классе 'Subtract'. (Я предполагаю, что вы знакомы с языком, например Python или Ruby, где переменные экземпляра определяются внутри функций, это не то, как работает Vala. Вам нужно будет объявить их вместе с методами.) – andlabs

+0

Я не знаю, как я объявляю их в vala язык. – rahi

ответ

1

Вы должны объявить переменные для виджетов (по крайней мере e1, e2 и lbl) в качестве полей:

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 и другие языки, кстати. –

+0

Это также описано в уроке Вала: https://wiki.gnome.org/Projects/Vala/Tutorial#Basics-1 –

 Смежные вопросы

  • Нет связанных вопросов^_^