可能重复:
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流程中的帖子与讨论。*
答案 0 :(得分:6)
一般来说,这是不可能的。你的选择:
Self
。with
并为该实例创建一个局部变量。如果您可以控制班级,则选项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;