2016-03-02 50 views
1

我想了解Vala代表與Gtk3。 我測試了回調和lambda沒有問題。 我想測試一個代表回調,在這裏我的代碼:如何在GTK3按鈕回調中使用VALA代表?

using Gtk; 

delegate void typeDelegate(Button button); 

int main (string[] args) { 
    Gtk.init (ref args); 
    typeDelegate cb = cbLabelf; 
    var window = new Window(); 
    window.title = "First GTK+ Program"; 
    window.border_width = 10; 
    window.window_position = WindowPosition.CENTER; 
    window.set_default_size (350, 70); 
    window.destroy.connect (Gtk.main_quit); 

    var button = new Button.with_label ("Click me!"); 

    //button.clicked.connect (cb); 
    //button.clicked+= cb; 
    button.clicked.connect+=cb; 

    window.add (button); 
    window.show_all(); 

    Gtk.main(); 
    return 0; 
} 

void cbLabelf(Button button) 
{ 
button.label = "tank yu"; 


} 

我也紅了生成的C代碼(當我使用拉姆達)瞭解。 這裏編譯錯誤:
GTKsampleDelegate.vala:20.5-20.30:錯誤:算術操作不支持類型Gtk.Button.clicked.connect' and typeDelegate' button.clicked.connect + = cb;

回答

1

好,

似乎你想要得到的是認爲,發出信號的情況下的特性變化,我覺得奇怪的是,VALA不會讓你使用一個委託變量通過參數來獲得它,然而,您可以使用下面的表格之一:不使用委託變量(A),或用閉包(B)繞過錯誤。

public class FooSignalClass : Object { 
    /* Gtk Button.clicked signal has the void f(void) signature */ 
    public signal void on_foo(); 
    public void foo() { 
     on_foo(); 
    } 
} 

public delegate void FooSignalFunc (FooSignalClass fooer); 

void on_foo_handler (FooSignalClass fooer) { 
    long fooer_memory_address = (long)fooer; 
    GLib.message(@"fooer exists? $(fooer!=null)."); 
    GLib.message(@"address=$fooer_memory_address."); 
} 

int main() { 

    var foo_signal = new FooSignalClass(); 
    long fooer_memory_address = (long)foo_signal; 
    GLib.message(@"foo_signal address=$fooer_memory_address."); 

    /* Option A: Connect directly without the delegate variable */ 
    foo_signal.on_foo.connect(on_foo_handler); 

    /* Option B: You cant use a delegate directly, bypass it with a closure */ 
    FooSignalFunc func = on_foo_handler; 
    foo_signal.on_foo.connect((instance) => { 
     func(instance); 
    }); 

    foo_signal.foo(); 

    return 0; 
}