如何在类型常量中包含方法指针?

时间:2013-06-15 09:12:05

标签: delphi

我想在记录中使用对象的过程,如下:

TCommandRec = record
  name: string;
  fn: procedure of object;
end;

我可以通过赋值创建一个数组:

commands: array [0..1] of TCommandRec;

...

commands[0].name := '-help';
commands[0].fn := DoHelp;
commands[1].name := '-load';
commands[1].fn := DoLoad;

我真正想做的是宣布一个常数:

const
  cmds: array [0..1] of TCommandRec =
  (
    (name: '-help'; fn: DoHelp),
    (name: '-load'; fn: DoLoad)
  );

但是,我收到了DoHelp和DoLoad的错误 - 期望的常量表达式。这是一类的两种方法。是否有一些语法需要用来使这项工作或我在运行时坚持构建数组?

2 个答案:

答案 0 :(得分:7)

对象的方法是所谓的双指针类型。它包含以下信息:

  1. 该功能的地址。
  2. 对象或主题的地址。
  3. 前者在编译时是已知的,但通常后者不是。这就是您通常需要在运行时创建这些内容的原因。

    如果您可以安排在编译时知道主题,那么您可以声明记录类型的类型常量。例如:

    type
      TMyRecord = record
        Foo: procedure of object;
      end;
    
      TMyStaticClass = class
        class procedure Foo;
      end;
    
    class procedure TMyStaticClass.Foo;
    begin
    end;
    
    const
      MyRecord: TMyRecord = (Foo: TMyStaticClass.Foo);
    

    当然,如果你的函数作为类方法而不是实例方法可行,那么这对你有用。我只是添加上面的代码来说明你可以拥有常量方法指针,只要主题是编译时常量。

答案 1 :(得分:2)

您可以存储指向记录中方法的指针(这些指针在编译时已知,因此在const定义中指定它们没有问题):

TCommandRec = record
  name: string;
  fn: Pointer;
end;

...
const
  cmds: array [0..1] of TCommandRec =
  (
    (name: '-help'; fn: @DoHelp),
    (name: '-load'; fn: @DoLoad)
  );

然后,当你需要调用fn的{​​{1}}时(我想调用发生在定义cmds[i]DoHelp方法的同一个类中),写类似的东西:

DoLoad