04-23-2021, 03:52 PM
(This post was last modified: 04-23-2021, 04:29 PM by kpenzkofer.)
(04-23-2021, 03:34 PM)rlebeau Wrote:(04-23-2021, 01:43 PM)kpenzkofer Wrote: This is a delphi Example but i can't figue out how to do it in c++
That code is using an anonymous procedure, which is a bit more complex to handle in C++ than Delphi. See How to Handle Delphi Anonymous Methods in C++ in Delphi's documentation.
Thanks - as I thought it is a bit more complex
I will give it a try later.
I found the issue on my inital post for the non-anonymous version.
Forgot the __fastcall directive in the handler definition and had to remove the Reference (&) from calling the handler.
Now it's running very well.
Code:
void __fastcall TfrmMain::myCallbackMethod(TStringList *slList)
{
// some Code
}
void __fastcall TfrmMain::headerRightButtonClick(TObject *Sender)
{
WebApplication->RegisterCallBack("MyCallback", myCallbackMethod);
}
(04-23-2021, 03:34 PM)rlebeau Wrote:(04-23-2021, 01:43 PM)kpenzkofer Wrote: This is a delphi Example but i can't figue out how to do it in c++
The 2nd parameter of RegisterCallback() is a TIWCallBackFunction. All online references I can find (I don't have IntraWeb myself) show TIWCallBackFunction is a "procedure(TStringList) of object", which means your original C++ should have worked fine. However, since the "working" Delphi example is using an anonymous procedure for the callback, that means TIWCallBackFunction must have been changed at some point into a "reference to procedure(TStrings)" instead.
See How to Handle Delphi Anonymous Methods in C++ in Delphi's documentation.
If you are using one of the CLang-based C++ compilers, try using a lambda for the callback, eg:
Code:void __fastcall TfrmMain::headerRightButtonClick(TObject *Sender)
{
WebApplication->RegisterCallBack(_D("MyCallback"),
[](TStrings *slList){ ... }
);
}
Otherwise, if you are using the classic Borland compiler, try creating a custom functor instead, eg:
Code:class TMyCallbackRef : public TCppInterfacedObject<TIWCallBackFunction>
{
public:
INTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);
void __fastcall Invoke(TStrings *slList) {
...
}
};
void __fastcall TfrmMain::headerRightButtonClick(TObject *Sender)
{
WebApplication->RegisterCallBack(_D("MyCallback"),
_di_TIWCallBackFunction(new TMyCallbackRef())
);
}
Thanks for the addtional infos - very enlightening.
In firemonkey apps i had similar procedures.