如何获取对WITH语句中创建的TQuery对象的引用?

时间:2012-01-18 15:03:51

标签: delphi

  

可能重复:
  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流程中的帖子与讨论。*

2 个答案:

答案 0 :(得分:6)

一般来说,这是不可能的。你的选择:

  1. 向返回Self
  2. 的类添加方法
  3. 停止使用with并为该实例创建一个局部变量。
  4. 如果您可以控制班级,则选项1是可行的。但这让班级看起来很奇怪。为什么类需要一个返回实例的实例方法?如果您无法控制该类,那么您可以使用类助手,因为RRUZ建议但我认为使用类助手是最后的手段。我从来没有解决过班助手的问题。

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

答案 1 :(得分:4)

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;