可能重复:
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;我可以将这个动态对象传递给类似于“function (TQuery)”这样的函数吗?
,我只想知道这是否可能。我不是在找一个总结为什么WITH语句是坏的或好的。还有关于StackOver流的其他文章和讨论。
发布于 2012-01-18 15:16:35
一般来说,这是不可能的,以一种干净的方式。你的选择:
使用Self.
如果您能够控制类,则选项1是可行的。但这让这门课看起来很奇怪。为什么一个类需要一个返回实例的实例方法?如果您无法控制这个类,那么您可以像RRUZ所建议的那样使用一个类助手,但我认为使用类助手是最后的手段。我从来没有解决过班级帮手的问题。
这就剩下了选择2,这就是我解决问题的方法。
发布于 2012-01-18 15:21:30
那么使用类助手呢?
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;发布于 2012-01-18 15:25:16
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;https://stackoverflow.com/questions/8912337
复制相似问题