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

Tim*_*ski 5 delphi

可能重复:
在Delphi中使用"with"创建的引用对象实例

我在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;
Run Code Online (Sandbox Code Playgroud)

是否也可以在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;
Run Code Online (Sandbox Code Playgroud)

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

我只是想知道这是否可行.我不是在寻找关于为什么WITH语句不好或好的总结.StackOver流程中有其他帖子与讨论.*

Dav*_*nan 6

一般来说,这不可能以干净的方式进行.你的选择:

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

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

这留下了选项2.这将是我如何解决问题.


RRU*_*RUZ 5

使用类助手怎么样?

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


function TQueryHelper.Instance: TQuery;
begin
  Result := Self;
end;
Run Code Online (Sandbox Code Playgroud)

并使用这样的

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

  • 这只是一个愚蠢的想法.拿出来. (4认同)
  • 嗯,这样做的工作,但我的测试是"干净".+1 (3认同)