【问题标题】:Passing procedure as a parameter in Delphi [closed]在Delphi中将过程作为参数传递[关闭]
【发布时间】:2015-05-19 22:55:34
【问题描述】:

我有这个代码>

type
  TCallBack = procedure(APerc: Integer) of object;

....

procedure CallingProcedure(a, b, c: Integer; ACallBack: TCallBack = nil);

....

我从我的主类/对象中调用这个函数,如下所示:

CallingProcedure(1, 2, 3, DoOnCallBack);

DoOnCallBack 定义为:

procedure DoOnCallBack(APerc: Integer);

这编译得很好,没问题 - 我这样做了很多次。

但在 CallingProcedure 中,当我想检查 Assigned(ACallBack) 是否为 False 时。

谁能告诉我我做错了什么。

我是从 Thread 调用这个,这可能是个问题吗?

【问题讨论】:

  • 据我所见应该没有任何问题。您能否发布一个演示该问题的 SSCCE。
  • 这个编译?我不这么认为...DoOnCallback 是一个常规程序——TCallBack 被定义为procedure of object。你能发布你的真实代码吗?
  • 两个人抱怨代码没有展示问题,但都没有投票关闭。带有伪造代码的问题不在此处讨论。
  • @RobKennedy 抱歉,我通常会这样做 - 早些时候非常忙,没待太久,我就忘记了。
  • @Wolf 这个问题没有谈到从另一个线程调用一个线程。并没有说所有跨线程数据访问都必须同步。不要宣传这样的错误信息。线程交互的方式有很多种。橙子不是唯一的水果。

标签: delphi


【解决方案1】:

我和你叫它的地方没有区别。语法是一样的。我刚刚做了这个小测试示例:

type
  TCallBack = procedure(APerc: Integer) of object;
  TForm20 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure CallingProcedure(a, b, c: Integer; ACallBack: TCallBack = nil);
    procedure DoOnCallBack(APerc: Integer);
  public
    { Public declarations }
  end;

var
  Form20: TForm20;

implementation

{$R *.dfm}

procedure TForm20.CallingProcedure(a, b, c: Integer; ACallBack: TCallBack);
begin
  if Assigned(ACallBack) then
    ACallBack(a);
end;

procedure TForm20.DoOnCallBack(APerc: Integer);
begin
  ShowMessage(IntToStr(APerc));
end;

procedure TForm20.FormCreate(Sender: TObject);
begin
  CallingProcedure(1, 2, 3, DoOnCallBack);
  CallingProcedure(1, 2, 3, nil);
end;

而且效果很好。调整你的代码看起来像这样。由于您尚未发布真实代码,因此我只能猜测问题所在。

【讨论】:

  • 对于给您带来的不便和愚蠢的问题,我深表歉意。这段代码运行良好 - 但经过 14 多个小时的编码后,我没有意识到我正在从另一个默认值始终为 NIL 的地方调用函数......对不起您的时间,感谢您的回答!
猜你喜欢
  • 2023-03-06
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
相关资源
最近更新 更多