Там в перегруженной версии Execute функции TDBXCallback вызывает в Data.DBXJSon, который выглядит, как этотОшибки в перегружено выполнить метод TDBXCallback, который принимает и возвращает TObject
function Execute(Arg: TObject): TObject; overload; virtual; abstract;
Что в моем клиенте DataSnap, я «ве реализован так:
type
ServerChannelCallBack = class(TDBXCallback)
public
function Execute(const Arg: TJSONValue): TJSONValue; overload; override; // this works!
function Execute(Arg: TObject): TObject; overload; override; // this doesn't
end;
function ServerChannelCallBack.Execute(Arg: TObject): TObject;
var
i: Integer;
begin
Result := TObject.Create; // is this correct?
try
if Arg is TStringList then
begin
FormClient.QueueLogMsg('ServerChannel', 'Got TStringList');
for i := 0 to TStrings(Arg).Count - 1 do
FormClient.QueueLogMsg('ServerChannel', TStringList(Arg)[i]);
end;
finally
end;
end;
Это называется с сервера DataSnap, как это:
procedure TFormServer.Button2Click(Sender: TObject);
var
sr: TStringList;
begin
sr := TStringList.Create;
try
sr.Add('one');
sr.Add('two');
ServerContainer2.DSServer1.BroadcastObject('SERVERCHANNEL', sr);
finally
// sr
end;
end;
Это вслед из примера в видео, представленном Matt Делонг
Heavyweight Callbacks with DataSnap - Part 1: Thick Client
Обратный вызов отлично работает, но только один раз! При втором вызове с сервера (Button2Click), я получаю AV в клиенте. Это может быть ошибка в коде DBX. Я не знаю. Я не могу проследить там. Или, возможно, я инициализировал результат из ServerChannelCallBack.Execute неправильно. Любая помощь приветствуется.
UPDATE
Обратный вызов зарегистрирован на клиенте так:
TFormClient = class(TForm)
CMServerChannel: TDSClientCallbackChannelManager;
...
private
ServerChannelCBID: string;
...
procedure TFormClient.FormCreate(Sender: TObject);
begin
ServerChannelCBID := DateTimeToStr(now);
CMServerChannel.RegisterCallback(
ServerChannelCBID,
ServerChannelCallback.Create
);
...
Не взглянув на код dbx, я бы предположил, что функция должна возвращать тот же объект, который был передан ему: Результат: = Arg; а не создавать новую. – dummzeuch
@ dummzeuch Я изменил код, чтобы сделать именно это (Результат: = Arg), но я получил тот же результат. Я думаю, что это ошибка, я должен отчитываться перед Качественным Порталом. – nolaspeaker
Если бы я опубликовал весь код, он бы обфускал вопрос. Ясно, что люди не используют ТАК, как они привыкли, просто из-за таких людей, как вы. – nolaspeaker