【问题标题】:How do you get a reference to a TQuery object created in a WITH statement? [duplicate]如何获得对 WITH 语句中创建的 TQuery 对象的引用? [复制]
【发布时间】:2012-01-18 15:03:51
【问题描述】:

可能重复:
Reference object instance created using “with” in Delphi

我用来在 Delphi 中创建查询对象的一种方法遵循第一个代码示例。它给了我一个对象的引用,然后我可以将对象传递给一个函数。

procedure SomeProcedure;
var
  qry: TQuery;
begin
  qry := TQuery.Create(nil);

  with qry do
  begin
    Connection := MyConn;
    SQL.Text := 'SELECT * FROM PEOPLE';
    Open;

    funcDisplayDataSet(qry);
    Free;
  end;

end;

是否也可以在 WITH 语句中执行此操作,其中您的 Create 对象包含在 WITH 语句中?

procedure SomeProcedure;
begin
  with TQuery.Create(nil) do
  begin
    Connection := MyConn;
    SQL.Text := 'SELECT * FROM PEOPLE';
    Open;

    funcDisplayDataSet( ??? );  // Here I'm unsure how to pass the object created...
    Free;
  end;
end;

我可以将这个动态对象传递给像 `funcDisplayDataSet(TQuery) 这样的函数吗?

我只是想知道这是否可能。我不是在寻找一个 总结为什么 WITH 语句是坏的或好的。还有其他 StackOver flow 上的帖子与该讨论。*

【问题讨论】:

  • +1 对于有趣的问题,尽管我怀疑没有办法干净/清晰地做到这一点,如果有的话。如果解决方案被证明是某种巫术,会让下一个人不得不去看看你是怎么做到的,那么你不应该这样做。
  • 同样的问题reference-object-instance-created-using-with-in-delphi,Alexander 提供了解决方案。
  • 只需使用一个局部变量并取出 WITH 即可。如果你去做一些邪恶的黑客行为,只是为了把 WITH 保留在那里,那么我将不得不追踪你,并让你喘不过气来。

标签: delphi


【解决方案1】:

一般来说,这是不可能的,以干净的方式。您的选择:

  1. 在类中添加一个返回Self的方法。
  2. 停止使用with 并为实例创建一个局部变量。

如果您可以控制班级,选项 1 是可行的。但这让课堂看起来很奇怪。为什么一个类需要一个返回实例的实例方法?如果您无法控制班级,那么您可以按照 RRUZ 的建议使用班级助手,但我认为使用班级助手是最后的手段。我从来没有用类助手解决过问题。

剩下选项 2。这就是我解决问题的方法。

【讨论】:

  • +1 "我从来没有用类助手解决过问题"
  • 我用一个班级助手解决了一个问题......它将 50 小时的工作变成了 6 小时的修复......在紧急情况下,他们真的很方便。跨度>
【解决方案2】:

使用类助手怎么样?

type
  TQueryHelper = class helper for TQuery
  public
    function Instance: TQuery;
  end;


function TQueryHelper.Instance: TQuery;
begin
  Result := Self;
end;

并像这样使用

   With TQuery.Create(nil) do
   begin
     SQL.Text:='Select * from OTGH';
     ShowMessage(Instance.SQL.Text);
   end;

【讨论】:

  • 嗯,这可以完成工作,但未能通过我的“干净”测试。 +1
  • 大卫,我也反对with 声明,这只是对...I just would like to know if this is possible 问题的回答。
  • 与我上面链接中的解决方案(由 Alexander 提供)几乎相同。没有类助手,但按照大卫的标准仍然不是“干净”的。
  • @RRUZ 绝对。甚至文档也建议您不要使用它们。现在,如果它们像 C# 扩展方法那样工作,那将是完全不同的。
  • 这只是一个愚蠢的想法。带出去。
【解决方案3】:

with 语句未提供可用于在语句外部传递的引用。

使用TQuery,您可以使用引用父级的属性来绕过它:

begin
  with TQuery.Create(nil) do
  begin
    Connection := MyConn;
    SQL.Text := 'SELECT * FROM PEOPLE';
    Open;
    // Fields have reference to parent component, but your implementation may vary
    funcDisplayDataSet(TQuery(Fields.Fields[0].GetParentComponent));
    Free;
  end;
end;

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多