delphi - 使用 SuperObject 调用类中的过程

标签 delphi superobject

我试图使用 super 对象调用类中的过程,但它不起作用,我在这里做错了什么?

代码示例:

program test_rpc;

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

uses
  SysUtils, superobject;

type
  TCC = class(TObject)
  published
    procedure controler_method1(const This, Params: ISuperObject; var Result: ISuperObject);
  end;

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

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

那会崩溃,我在这里做错了什么?

它实际上到达“使用参数调用的操作”,但无法显示参数...

最佳答案

super 方法的签名如下:

TSuperMethod = procedure(const This, Params: ISuperObject;
    var Result: ISuperObject);

这意味着您无法使用实例方法,因为实例方法具有不兼容的签名。您的方法必须如下所示:

procedure sm(const This, Params: ISuperObject; var Result: ISuperObject);
begin
  ....
end;

您收到运行时错误而不是编译时错误的原因是您使用 @ 运算符放弃了类型系统。删除@,您的程序将在编译时失败,并显示一条错误消息,该错误消息是我上面所说的更简洁的版本。

必须使用 @ 运算符来获取函数指针,这是 Delphi 编程的一大谬误。这是一个坏习惯,最好改掉。

关于delphi - 使用 SuperObject 调用类中的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15186788/

相关文章:

java - 以编程方式创建虚拟串口

delphi - 导入COM组件: Difference c# vs. Delphi XE

json - 在 JSON 中存储记录数组

delphi - 人们如何在 Web 客户端上使用 DataSnap XE 处理分页?

delphi - Delphi鼠标单击坐标

delphi - 从 Delphi 2009 升级的原因

delphi - SuperObject 无法处理空字符串

json - SuperObject 多维数组

json - 使用 StringReplace 从 JSON 响应中删除不需要的字符的替代方法

json - Delphi SuperObject 按与添加顺序不同的顺序对值进行排序