T. Guilleminot wrote 25 lines
Hi,
I'd like to be able to pass/access variable(s ?) to/from the "data" part
of the "g_signal_connect" function, eg :
...
Procedure MyActionProcedure (widget : pGtkWidget ; data : gpointer)
cdecl;
begin
... // Using data content here...
end;
...
g_signal_connect (G_OBJECT(pMyButton), 'button-release-event',
G_CALLBACK(@MyActionProcedure), MyData);
// Passing information here
-------------------------------------------------------------------^^^^^^
...
However I'm unable to handle it once MyActionProcedure called.
- Does anyone have a *simple* example to do this ? I can only find C
sample on the web.
- Is "data" able to store single or multiple (and different) variable ?
- If multiple variables possible, can they be of different types
(integer, string...) ?
You can pass inside the data-pointer what you like to, from my memory:
type
TMyDataRec: record
a: integer;
b: string;
end;
TMyDataObj: class
procedure DoSomething;
end;
Procedure MyActionProcedure (widget : pGtkWidget ; data : gpointer)
cdecl;
begin
{ you have to know or check the type of data's content
and cast it! }
with data as TMyDataObj do
begin
DoSomething;
or
if (TMyDataRec(data).a = 123) then
begin
...
At the spot where you are passing the pointer the data has to be set up *before* connecting the callback.
var
MyData: TMyDataRec;
MyData2: TMyDataObj;
begin
MyData.a := 124;
g_signal_connect (G_OBJECT(pMyButton), 'button-release-event',
G_CALLBACK(@MyActionProcedure), MyData);
MyData2 := TMyDataObj.create;
g_signal_connect (G_OBJECT(pMyButton2), { <-- another button } 'button-release-event', G_CALLBACK(@MyActionProcedure), MyData2); { <-- another data item }
The only way to change the data item after assigning would be to hold a reference to it and set it on the fly (e.g. for remembering a state or the like).
HTH,
Marc