是否有一种方法可以在.. do中使用Delphi的..迭代FireDAC的TFDParams?

问题描述 投票:2回答:2

[使用Delphi 10.2(Tokyo),我只想做一些简单的事情:

function ShowFinalSQL(const qry: TFDQuery): String;
var
  cSQL: String;
  oParam: TFDParam;
begin
  cSQL := qry.SQL.Text;
  for oParam in qry.Params do
    cSQL := cSQL.Replace(oParam.Name, oParam.Value);
  Result := cSQL;
end;

但是我总是收到错误消息:

[dcc32 Error] DTUtilBD.pas(3115): E2010 Incompatible types: 'TFDParam' and 'TCollectionItem'

有办法吗?

loops delphi iteration firedac delphi-10.2-tokyo
2个回答
2
投票

简短的回答:否,不使用in(为什么不这样做,请参见下文),但是一个好的老式数字for循环会正常工作:

function ShowFinalSQL(const qry: TFDQuery): String;
var
  cSQL: String;
//  oParam: TFDParam;
  i : Integer;
begin
  cSQL := qry.SQL.Text;
  for i := 0 to qry.ParamCount - 1 do
    cSQL := cSQL.Replace(qry.Params[i].Name, qry.Params[i].Value);
  Result := cSQL;
end;

for .. in不适用于类型为TFDParams的FDQuery的Params类的原因是,无论出于何种原因,TFDParams类都不提供“ GetEnumerator方法,该方法返回一个提供Next方法的对象,并且Current属性”,根据Marco Cantu出色的Delphi 2007手册进行。

顺便说一句,您可能会发现Nick Hodge's article关于for ... in很有趣。


0
投票

[TFDParams可以用for..in循环进行迭代,只是不是您尝试的方式。

TFDParams具有公共的GetEnumerator()方法,但是它是从GetEnumerator()继承来迭代TCollection项目的方法。它不是专门用于TCollection项目的。因此,这意味着您用于迭代的变量需要声明为TFDParam而不是TCollectionItem。这意味着您将必须强制转换变量以访问任何TFDParam特定成员。

尝试一下:

TFDParam
© www.soinside.com 2019 - 2024. All rights reserved.