【问题标题】:How to pass on parameters in procedure parameter ('nested')?如何在过程参数('嵌套')中传递参数?
【发布时间】:2020-03-24 00:50:45
【问题描述】:

我有这个:

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 :=aFunc 调用与 E2035 Not enough actual parameters 时阻塞。

我看到了两种解决方法:

  • 定义一个TFrmAPI.FSelectionProperties,设置它并让GetExactData使用它
  • 通过调用传递 TSelectionProperties(如 here):

.

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

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

【问题讨论】:

  • 就个人而言,我会使用第二种方法,因为它更具可读性。如果您在执行GetExactData 方法后不需要存储ASelProps,它也很有用。此外,您将能够通过ASelProps 传递任何数据,以防将来更改参数数量。
  • 我不明白。您想让GetExactData 方法的ASelProps 参数可选吗?或者目标是什么(你说“所有这些 TFuncGetData 都需要一个参数” 这是你已经拥有的)?

标签: delphi parameters procedure delphi-10.3-rio


【解决方案1】:

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

用一个额外的参数来扩充你的方法只有好处:

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

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多