2016-03-02 23 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; 
}