delphi - 如何在过程参数('嵌套')中传递参数?
问题描述
我有这个:
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
.
我看到两种方法来解决这个问题:
- 定义 a
TFrmAPI.FSelectionProperties
,设置它并GetExactData
使用它 - 通过调用传递 TSelectionProperties(如这里):
.
function TFrmAPI.GetExactData(AFunc: TFuncGetData; ASelProps: TSelectionProperties): Integer;
var lStatus: Integer;
begin
FErrorMsg := '';
lStatus := AFunc(ASelProps);
第二种方法更安全(因为可能会覆盖 TFrmAPI.FSelectionProperties),但是还有其他更好的方法来构造它吗?
解决方案
一旦调用开始递归,甚至当对象在多个线程中使用时,设置要传递给函数的“全局”变量就会妨碍您。
使用附加参数增强您的方法只有以下优点:
- 递归调用仍然可以使用不同的值
- 您可以将其设为可选,提供默认值 (
Method( f: TFunc; p: TParam= 0 ): Integer;
) - 为了保证未来/不受约束,请定义您自己的类型(即可以在以后轻松扩展的记录,或者直接分配给另一个类似的类型
type TParam= Cardinal;
) - 老派/危险的方法是只使用指针,它可以让你交出任何东西(我不推荐这个,需要你这么灵活的情况很少见)
推荐阅读
- sql-server - 获取带有周数的日期,给定月份和年份的工作日
- macos - 将文件夹或文件从终端上移一个目录
- php - PHP 套接字超时和阻塞
- ruby-on-rails - 没有路线匹配 {:action=>"show", :controller=>"shops", :id=>nil},缺少必需的键:[:id]
- java - 使用 webview 时,我的一些网站在 chome 中打开,而不是直接在应用程序中打开
- python - 如果引用的文件不存在,则有效删除 Pandas DataFrame 中的行
- android - 条形码中的产品详细信息
- java - Here-API:PDE 请求返回 GeoboundingBox 之外的 POI
- c - 使用结构获取垃圾数据进行重新分配
- amazon-web-services - AWS 简单 Lambda 函数