Delphi 请解释下一行的“是什么?”;具有“做”;代表

Delphi 请解释下一行的“是什么?”;具有“做”;代表,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是一个表达式,产生对记录、对象实例、

在代码中:pbOut是一个TPaintBox

 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语句并不是一个真正有用的构造

    它会导致混乱、难以阅读的代码,因为你总是必须考虑不合格的标识符真正指的是什么。
  • 还有