2013-03-03 2 views
2

Я использую этот блок суперобъектов в одном из моих проектов как протокол rpc и внутри удаленной процедуры (подпись имеет аргумент var Result). Я хочу знать, как использовать этот аргумент. ..Использование аргумента результата в SuperObject

Нет документации? Благодарю.

program test_rpc; 

{$IFDEF FPC} 
    {$MODE OBJFPC}{$H+} 
{$ELSE} 
    {$APPTYPE CONSOLE} 
{$ENDIF} 

uses 
    SysUtils, superobject; 

procedure controler_method1(const This, Params: ISuperObject; var Result: ISuperObject); 
var 
    i: Integer; 
begin 
    write('action called with params '); 
    writeln(Params.AsString); 

    try 
    // How do i use Result arg to return a value ? as if it were a function returning string 
    Result 
    except 
    exit; 
    end; 
end; 

var 
    s: ISuperObject; 
begin 
    s := TSuperObject.Create; 
    s.M['controler.action1'] := @controler_method1; 
    try 
    s['controler.action1("HHAHAH")']; 
    finally 
    s := nil; 
    writeln('Press enter ...'); 
    readln; 
    end; 
end. 
+0

Вы уверены, что вы дали нам достаточно информации? Мне непонятно, что этот «результат» - это то, о чем вы говорите. Вам нужно больше объяснить? Вы говорите о 'TSuperMethod = procedure (const This, Params: ISuperObject; var Result: ISuperObject);'? И если да, о чем вы спрашиваете? –

+0

Упс, похоже, форум поддержки на http://www.progdigy.com/forums/ ушел –

+0

@DavidHeffernan: да что один ..;] – 2013-03-03 13:05:29

ответ

3

Когда controler_method1 вызывается, параметр Resultvar является nil. Чтобы вернуть что-то вызывающему абоненту, вам необходимо назначить Result.

Result := TSuperObject.Create; 

Это пустой супер объект. Теперь вы можете заполнить его любыми значениями, которые вам нравятся обычным способом.

Вот простая демонстрация:

program test_rpc; 

{$IFDEF FPC} 
    {$MODE OBJFPC}{$H+} 
{$ELSE} 
    {$APPTYPE CONSOLE} 
{$ENDIF} 

uses 
    SysUtils, 
    superobject in 'superobject.pas'; 

procedure controler_method1(const This, Params: ISuperObject; 
    var Result: ISuperObject); 
begin 
    Result := TSuperObject.Create('Foo'); 
end; 

var 
    s: ISuperObject; 
begin 
    s := TSuperObject.Create; 
    s.M['controler.action1'] := controler_method1; 
    Writeln(s['controler.action1("HHAHAH")'].AsString); 
    Readln; 
end. 
Смежные вопросы