有人知道 Delphi 2009 对“with”的处理有什么不同吗?

我昨天解决了一个问题,只是通过将“with”解构为完整引用,如“with Datamodule、Dataset、MainForm”。Delphi 2006 及更早版本对数据集应用“关闭”。Delphi 2009 对 MainForm 应用了“关闭”并退出了应用程序!

有帮助吗?

解决方案

什么都没有改变。你以前的观察是错误的。在with声明中提及的目的被认为是“从右至左”,所以在你的榜样,MainForm会先搜索,再Dataset,然后Datamodule。这就是它一直都是。这是一样的,如果你写的:

with Datamodule do
  with Dataset do
    with MainForm do begin
      Close;
    end;

继续前进,检查2006年德尔福文件;应该有一个名为段的的声明和说明的,这下你会发现的结构化语句的,包括的部分用语句的。

请你帮个忙,不要使用with。它会导致两种调试期间及维修,其中维修可能甚至谁前一天刚写代码的人进行期间后患无穷。

其他提示

With是恶。我不知道我需要多少次这样说,但显然我们还没有。

使用只能“安全地”被与永远不会改变的对象使用。如果你将它应用到您在自己的项目中定义的对象,所有的赌注都关闭,我敢说,你倒是应该只使用“如果随机(50)<25”的部分来执行你的代码,它至少记录在案,以奇怪的执行。

但问题是,一旦你开始与对象搞乱,引入新的方法或属性,或重命名旧的,使用这些方法都存在with陈述有可能改变意味着潜力。而不是在“警告:调用暧昧法”的变化无论是。该代码将只是做其他比它以前做了什么。如果不告诉你这件事。

例如,假设你有这样的:

with connection, file do
begin
    Close;
end;

然后你能指望什么发生?嗯,这是自然关闭文件,所以我希望该文件被关闭。让我们进一步假设该文件变量保存类型TSomeOddFile的对象没有定义关闭方法,而是一种CloseFile方法。然后,将上面陈述将关闭连接来代替。

都好,它的记录,没有人写了这段代码以为该文件将被关闭,毕竟,该方法被命名为CloseFile该对象,这只是我的假设是错误的,我不上工作项目。爱好。

和然后有人解决了,重命名CloseFile为关闭。上面的代码会悄悄地开始关闭的文件,而不是连接。没有警告,没有错误,因为之前更改方法名编译,就像罚款。运行正如细^ H ^ H ^ H,没有等待,也不会

所以是的,with会咬你在一个**。

使用with A,B,C,D是不好的做法,因为变化给其他单位可突然引起按照预期的代码停止工作。见这里更多信息,或的此处(搜索"with keyword")。

在编译器通常是相当扎实,所以我不会承担错误或更改你真的排除一切之前。有些事情我能迅速地想的:

1)看如果使用重载函数或运算符。由于STRING(和几种其它类型的)改变的定义,不同的变体可被选择,因为签名有效地改变。

2)它也可以是一些包括单元现在定义了已被使用的标识符,并且优先于一个在不同的单元露出。

如果不是,开始在最小的例子中分离的代码,使用尽可能少的单元作为可能的。做一步一步来,因为关键是最后一个变化是什么时,行为改变。

发表该(或URL)这里,它始终是有趣的。

与..做 是要小心使用。否则,真是让人头疼不已……我同意罗布·肯尼迪和其他人的观点。

作为 克雷格·斯图茨 (在其他帖子中关于 with..do) 和 拉塞 V.卡尔森 上面说了, 与..做 可以制造很多陷阱。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top