2017-02-10 1 views
1

私は、GTK + 3をFreePascalのツールキットとして使用するプログラムのコールバック関数として構造化データ型内のプロシージャを使用しようとしています。 (私が持っているGTK + 3のバインディングは、gir2pascalツール(http://wiki.freepascal.org/gir2pascal)によって生成されました)Cライブラリ(GTK + 3)のコールバックとして構造化データ型のプロシージャを使用する

以下の例では、高度なレコードを使用していますが、クラス/オブジェクトは、

発生する問題は、コールバックプロシージャが呼び出されたときに、それ自身のレコード内の他のものにアクセスできないことです。それはどこから来るのかを「忘れる」ようです。

たとえば、以下の例では、myRecord.myIntという整数があります。これは、手続きmyRecord.testProcedureを呼び出すことで、設定して喜んで取得できます。 (私はボタンをクリックしたとき)testProcedureは、Cのコールバックとして使用されている場合しかし、私はいくつかの数(例えば30976)を受信しませんが、7

{$MODESWITCH ADVANCEDRECORDS} 
uses gobject2, gtk3, math; 

type 
    myRecord=record 
    public 
     myInt: Integer; 
     procedure testProcedure; cdecl; 
    end; 

    procedure myRecord.testProcedure; cdecl; 
    begin 
    WriteLn(myInt); 
    end; 

var 
    recordInstance: myRecord; 
    button, win: PGtkWidget; 
begin 
    SetExceptionMask([exDenormalized, exInvalidOp, exOverflow, 
    exPrecision, exUnderflow, exZeroDivide]); {this is needed for GTK not to crash} 

    gtk_init(@argc, @argv); 

    win:=gtk_window_new(GTK_WINDOW_TOPLEVEL); 

    recordInstance.myInt:=7; 

    button:=gtk_button_new; 

    {The following does not work. The procedure will run when the button is 
    clicked; it will print some number, but not the content of recordInstance.myInt} 
    g_signal_connect_data(button, 'clicked', 
    TGCallback(@recordInstance.testProcedure), nil, nil, 0); 

    {add button to window} 
    gtk_container_add(PGtkContainer(win), button); 

    gtk_widget_show_all(win); 

    {Test call to recordInstance.testProcedure to see that it outputs 
    '7' correctly} 
    recordInstance.testProcedure; 

    gtk_main; 
end. 

私の代わりに高度のクラスやオブジェクトを使用しようとすると録音は、私が受け取る種類のエラーメッセージが

"<procedure variable type of procedure of object;CDecl>" to "<procedure variable type of procedure;CDecl>" 

(もしあれば)上記の例のようにCのコールバックとして使用する手順で構造化データ・タイプを使用するのではどのような方法がありますか?

+0

私はCがコールバックとしてメソッドを使用する方法がないと思います。メソッド呼び出しは、通常のプロシージャ呼び出しに変換する必要があります。 「メソッドをWindows API呼び出しにコールバックとして渡す方法」(http://stackoverflow.com/q/2787887/576719)を参照してください。 –

答えて

1

クラス静的メソッドはプロシージャと互換性があります。しかし、彼らにはオブジェクトのデータへの参照がないという欠点もあります。

{$mode delphi} 

type 
    myRecord=record 
    public 
     myInt: Integer; 
     class procedure testProcedure; cdecl;static; 
    end; 

    tproctype = procedure; cdecl; 

class procedure myrecord.testProcedure; cdecl;static; 
begin 
end; 

var x : tproctype; 
    y : myrecord; 
begin 
x:=y.testprocedure; 
end. 

コンパイル、それは普通Cにマップする場合は、(暗黙)OO特性を有していないので使用は、無菌です。

関連する問題