You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Delphi中的`reference to procedure`转换为Lazarus等效实现?

在Lazarus中实现Delphi风格的托管方法引用等效方案

你提到的Delphi代码里的reference to procedure是托管方法引用,既可以绑定全局/静态过程,也可以绑定对象实例的方法。在Lazarus默认编译模式(无需开启mode Delphi或mode ObjFPC)下,可通过以下方式实现等效功能:

1. 类型定义直接适配

FPC(Lazarus的编译内核)在默认模式下支持reference to语法,直接沿用类似的类型定义即可:

type
  TProc = reference to procedure(const AControl: TControl);

该类型兼容全局过程、对象方法以及匿名方法的赋值与调用。

2. 不同场景的使用示例

绑定全局/静态过程

procedure MyGlobalProc(const AControl: TControl);
begin
  // 自定义逻辑
end;

var
  proc: TProc;
begin
  proc := MyGlobalProc;
  proc(SomeControl); // 调用回调
end;

绑定对象实例方法

type
  TMyClass = class
  public
    procedure MyInstanceMethod(const AControl: TControl);
  end;

procedure TMyClass.MyInstanceMethod(const AControl: TControl);
begin
  // 自定义逻辑
end;

var
  proc: TProc;
  MyObj: TMyClass;
begin
  MyObj := TMyClass.Create;
  proc := MyObj.MyInstanceMethod;
  proc(SomeControl); // 调用回调
  MyObj.Free;
end;

使用匿名方法

和Delphi一样,也可以直接赋值匿名方法作为回调,支持捕获外部变量:

var
  proc: TProc;
  StatusText: string;
begin
  StatusText := 'Callback triggered';
  proc := procedure(const AControl: TControl)
    begin
      ShowMessage(StatusText + ': ' + AControl.Name);
    end;
  proc(SomeControl);
end;

注意事项

  • 确保使用的Lazarus版本≥2.0(配套FPC≥3.0.0),更早版本对reference to语法的支持不完善。
  • 默认编译模式下无需额外配置编译选项,直接使用即可。

内容的提问来源于stack exchange,提问作者Adrian Maire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:25:52