Delphi 请解释下一行的“是什么?”;具有“做”;代表
在代码中:pbOut是一个TPaintBoxDelphi 请解释下一行的“是什么?”;具有“做”;代表,delphi,Delphi,在代码中:pbOut是一个TPaintBox with pbOut.Canvas, Font do begin .... end; 问题是,我想知道逗号跟。。结构能做什么?是否与使用pbOut.Canvas.Font编写相同?查看: with语句是引用记录的字段或对象的字段、属性和方法的缩写。with语句的语法为: with obj do statement 或: with obj1, ..., objn do statement 其中,obj是一个表达式,产生对记录、对象实例、
with pbOut.Canvas, Font do
begin
....
end;
问题是,我想知道逗号跟。。结构能做什么?是否与使用pbOut.Canvas.Font编写相同?查看:
with语句是引用记录的字段或对象的字段、属性和方法的缩写。with语句的语法为:
with obj do statement
或:
with obj1, ..., objn do statement
其中,obj是一个表达式,产生对记录、对象实例、类实例、接口或类类型(元类)实例的引用,语句是任何简单或结构化语句。在语句中,您可以仅使用obj的标识符(即不带限定符)引用obj的字段、属性和方法
当with之后出现多个对象或记录时,整个语句将被视为一系列嵌套with语句。因此:
with obj1, obj2, ..., objn do statement
相当于:
with obj1 do
with obj2 do
...
with objn do
// statement
with pbOut.Canvas do
begin
with pbOut.Canvas.Font do
begin
{ See notes underneath }
end;
end;
with pbOut.Canvas do
begin
with Font do
begin
{ See notes underneath }
end;
end;
在这种情况下,语句中的每个变量引用或方法名都被解释为objn的一个成员(如果可能);否则,如果可能,将其解释为objn1的成员;等等同样的规则也适用于解释OBJ本身,因此,例如,如果objn同时是obj1和obj2的成员,则将其解释为obj2.objn
由于with语句需要对变量或字段进行操作,因此有时将其与属性一起使用会很棘手。with语句期望它所操作的变量通过引用可用
通常将
与
一起使用会导致灾难,因为从外观上看,很难知道一条语句是指带有块的中的一个块(以及哪个块)还是外部作用域
要回答这个问题,
是否与使用pbOut.Canvas.Font编写相同
如果您只想访问Font
属性,则相同,但如果您想访问pbOut.Canvas的其他成员,则不相同
为了您和他人的利益,请不要将与
语句一起使用 研究:
with语句是引用记录的字段或对象的字段、属性和方法的缩写。with语句的语法为:
with obj do statement
或:
with obj1, ..., objn do statement
其中,obj是一个表达式,产生对记录、对象实例、类实例、接口或类类型(元类)实例的引用,语句是任何简单或结构化语句。在语句中,您可以仅使用obj的标识符(即不带限定符)引用obj的字段、属性和方法
当with之后出现多个对象或记录时,整个语句将被视为一系列嵌套with语句。因此:
with obj1, obj2, ..., objn do statement
相当于:
with obj1 do
with obj2 do
...
with objn do
// statement
with pbOut.Canvas do
begin
with pbOut.Canvas.Font do
begin
{ See notes underneath }
end;
end;
with pbOut.Canvas do
begin
with Font do
begin
{ See notes underneath }
end;
end;
在这种情况下,语句中的每个变量引用或方法名都被解释为objn的一个成员(如果可能);否则,如果可能,将其解释为objn1的成员;等等同样的规则也适用于解释OBJ本身,因此,例如,如果objn同时是obj1和obj2的成员,则将其解释为obj2.objn
由于with语句需要对变量或字段进行操作,因此有时将其与属性一起使用会很棘手。with语句期望它所操作的变量通过引用可用
通常将与
一起使用会导致灾难,因为从外观上看,很难知道一条语句是指带有
块的中的一个块(以及哪个块)还是外部作用域
要回答这个问题,
是否与使用pbOut.Canvas.Font编写相同
如果您只想访问Font
属性,则相同,但如果您想访问pbOut.Canvas的其他成员,则不相同
为了您和他人的利益,请不要将与
语句一起使用 逗号只是一个分隔符,用于使用with对要“范围到”的事物列表进行分隔
至于你的问题,严格地说,这取决于
您可以假设pbOut.Canvas
始终具有Font
属性(因为您知道TCanvas
具有Font
属性)。但是,没有什么能强制<代码> >画布>代码>变量为<代码> TCANVase/Copy>类型,所以实际上你必须考虑2种可能性。
在您的情况下,下面解释的第一种可能性最有可能适用,但了解另一种可能性很重要
关于你的具体问题:
这与使用pbOut.Canvas.Font编写相同吗
几乎一样,但不完全一样。这不会公开原始代码所公开的pbOut.Canvas
可能性1
如果Font
是pbOut.Canvas
的成员,则该语句相当于:
with obj1 do
with obj2 do
...
with objn do
// statement
with pbOut.Canvas do
begin
with pbOut.Canvas.Font do
begin
{ See notes underneath }
end;
end;
with pbOut.Canvas do
begin
with Font do
begin
{ See notes underneath }
end;
end;
在这里,您可以直接引用pbOut.Canvas
或pbOut.Canvas.Font
的成员;没有完全限定引用
pbOut.Canvas
和pbOut.Canvas.Font
中具有相同标识符的任何成员都将发生冲突。编译器将支持带项目的内部。这意味着您仍然必须完全限定pbOut.Canvas
成员才能访问它
可能性2
另一方面,如果Font
不是pbOut.Canvas
的可访问成员,则该语句相当于:
with obj1 do
with obj2 do
...
with objn do
// statement
with pbOut.Canvas do
begin
with pbOut.Canvas.Font do
begin
{ See notes underneath }
end;
end;
with pbOut.Canvas do
begin
with Font do
begin
{ See notes underneath }
end;
end;
与前面的构造类似,您可以直接访问pbOut.Canvas
或Font
的成员;没有完全限定引用
我必须指出,with语句并不是一个真正有用的构造
它会导致混乱、难以阅读的代码,因为你总是必须考虑不合格的标识符真正指的是什么。
- 还有