2012-03-17 82 views
10

我已经添加了一些代码到我的delphi项目来与注册表进行交互,使用我在网上找到的一些教程来指导我的努力。我见过的每一个例子似乎用这种结构为他们的注册表访问:德尔福变量可能没有初始化警告

var 
    Registry: TRegistry; 
begin 
    try 
    Registry := TRegistry.Create; 
    //additional code to access and use the registry object could go here 
    finally 
    Registry.Free; 
end; 

但是,当我执行下面这个结构我的代码,我得到我的注册表变量可能还没有上线初始化的警告我释放TRegistry对象。

所以,我想知道我发现的例子是否正确访问注册表的错误。我是否应该在我的TRegistry对象上调用Free,而不管Create是否成功,并忽略该警告?相反,我的try/finally块只能在成功的构造函数调用后包围代码,但不能包装create调用?还有别的吗?

回答

22

在您的代码中,如果TRegistry.Create引发异常,则不会分配Registry变量。因此,finally将尝试访问一个未初始化的变量。

编写代码的正确方法是确保在输入try/finally块之前分配变量。

Registry := TRegistry.Create; 
try 
    //additional code to access and use the registry object could go here 
finally 
    Registry.Free; 
end; 

这是Delphi编码中最基本的生命周期管理模式,您应该深入研究肌肉记忆。

请注意,如果构造函数失败,那么它将在传播异常之前清理部分构造的对象。只有构造函数成功完成时,才会分配此代码中的新对象引用Registry

我希望你发现的例子实际上是按照我上面的代码写的,你不知怎的会错误地转录它们。如果它们是按照问题编写的,那么它们显然是错误的。

+0

我需要做的任何额外的检查后,尝试块之前创建实际确保注册表初始化好吗? – 2012-03-17 18:46:58

+0

只是例如,http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=656&lngWId=7将是我发现的那种教程之一,这确实看起来是错误的,因此这个问题试图了解代码是否类似于更高级的Delphi开发人员所做的事情。 – 2012-03-17 18:48:01

+0

显然你需要找到比该网站更好的来源! – 2012-03-17 19:00:00