私は、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のコールバックとして使用する手順で構造化データ・タイプを使用するのではどのような方法がありますか?
私はCがコールバックとしてメソッドを使用する方法がないと思います。メソッド呼び出しは、通常のプロシージャ呼び出しに変換する必要があります。 「メソッドをWindows API呼び出しにコールバックとして渡す方法」(http://stackoverflow.com/q/2787887/576719)を参照してください。 –