首页 > 解决方案 > 如何在过程参数('嵌套')中传递参数?

问题描述

我有这个:

type
  TFuncGetData = function: Integer of object;

function TFrmAPI.GetExactData(AFunc: TFuncGetData): Integer;
var lStatus: Integer;
begin
  FErrorMsg := '';
  lStatus   := AFunc;
  ...

然后一堆TFuncGetData这样的

function TFrmAPI.GetCurrentDivision: Integer;
begin
  ...

被调用:

lResult := GetExactData(GetCurrentDivision);

现在事实证明,所有这些都TFuncGetData需要一个参数来传递信息:

type
  TFuncGetData = function(ASelProps: TSelectionProperties): Integer of object;  

function TFrmAPI.GetCurrentDivision(ASelProps: TSelectionProperties): Integer;
begin
  ...

但是函数GetExactData现在lStatus :=aFuncE2035 Not enough actual parameters.

我看到两种方法来解决这个问题:

.

function TFrmAPI.GetExactData(AFunc: TFuncGetData; ASelProps: TSelectionProperties): Integer;
var lStatus: Integer;
begin
  FErrorMsg := '';
  lStatus   := AFunc(ASelProps);

第二种方法更安全(因为可能会覆盖 TFrmAPI.FSelectionProperties),但是还有其他更好的方法来构造它吗?

标签: delphiparametersproceduredelphi-10.3-rio

解决方案


一旦调用开始递归,甚至当对象在多个线程中使用时,设置要传递给函数的“全局”变量就会妨碍您。

使用附加参数增强您的方法只有以下优点:

  • 递归调用仍然可以使用不同的值
  • 您可以将其设为可选,提供默认值 ( Method( f: TFunc; p: TParam= 0 ): Integer;)
  • 为了保证未来/不受约束,请定义您自己的类型(即可以在以后轻松扩展的记录,或者直接分配给另一个类似的类型type TParam= Cardinal;
  • 老派/危险的方法是只使用指针,它可以让你交出任何东西(我不推荐这个,需要你这么灵活的情况很少见)

推荐阅读