0

API呼び出しをテストするために小さなhttpクライアントを書いています。これは、vala を学習し、gtk3 を使用する機会です。

gtk インターフェイスと http リクエストを処理するクラスを作成しました。

using GLib;
using Gtk;

public class RequestHandler : Object
{
    public string uri { get; private set; default = ""; }

    // Constructor
    public RequestHandler ()
    {
    }

    [CCode (instance_pos = -1)]
    public void on_url_changed (Entry entry, Button button)
    {
        stderr.printf ("this#%p\n", this);
        if (entry.get_text_length () == 0)
        {
            button.set_sensitive (false);
            this.uri = "";
        }
        else
        {
            button.set_sensitive (true);
            this.uri = entry.get_text();
        }
    }

    [CCode (instance_pos = -1)]
    public void on_send_clicked (Button button)
    {
        assert (this.uri != null );
        stderr.printf ("Send request to : %s\n", this.uri);
    }
}

この線

stderr.printf ("this#%p\n", this);
// => fprintf (_tmp0_, "this#%p\n", self); in the C file

「this#0x1」のたびに表示され、プログラムは次の行でセグメンテーション違反で失敗しました

this.uri = entry.get_text();
// _g_free0 (self->priv->_uri); in the C file

UIはで構築されています

var builder = new Builder ();
builder.add_from_file (UI_FILE);
var signals_handler = new RequestHandler ();
builder.connect_signals (signals_handler);

私は本当にvalaの初心者で、自分の間違いがわかりません。

[編集]

...
<object class="GtkEntry" id="entry2">
    <property name="visible">True</property>
    <property name="can_focus">True</property>
    <property name="receives_default">True</property>
    <property name="hexpand">True</property>
    <property name="invisible_char">●&lt;/property>
    <property name="input_purpose">url</property>
    <signal name="changed" handler="request_handler_on_url_changed" object="button1" swapped="no"/>
</object>
...

ui は完全にグレードで生成されます。

4

1 に答える 1

1

on_url_changedメソッドに追加の引数があります。Gtk.Editable.changedシグナルには、変更されたGtk.Editableという単一の引数が必要です。自動接続された信号には型安全性がないため、機能するpublic void on_changed (Gtk.Entry entry);はずです。

上記で投稿したコードで何が起こっているのかというと、次のようなものが生成されているということです。

void request_handler_on_changed (GtkEntry* entry, GtkButton* button, RequestHandler* self) {
  fprintf (stderr, "this#%p\n", self);
}

そしてgtk+はそれを次のように呼んでいます

request_handler_on_changed (editable, request_handler);

したがって、Valaコードが情報を取得すると、ボタン引数にRequestHandlerが含まれ、self(「this」変数の生成方法)はガベージになります。

基本的にValaを回避し、生成されたCに直接接続しているため、信号を自動接続する場合は十分に注意する必要があります。Valaには型の安全性を提供する方法がありません。

于 2013-02-21T19:46:19.220 に答える