2012-03-17 3 views
10

Я добавил код в свой проект delphi для взаимодействия с реестром, используя некоторые обучающие программы, которые я нашел в Интернете, чтобы направлять мои усилия. Каждый пример, я видел, кажется, использует эту структуру для их доступа к реестру:Ошибка 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.

Итак, мне интересно, не найдены ли примеры, которые я нашел, для правильного доступа к реестру. Должен ли я звонить Free на мой объект TRegistry независимо от того, будет ли Create suceeeds и просто игнорировать предупреждение? Должен ли вместо этого мой блок try/finally окружать код после успешным вызовом конструктора, но не обернуть вызов create? Что-то другое?

ответ

22

В вашем коде, если TRegistry.Create вызывает исключение, то переменная Registry не будет назначена. И таким образом, наконец, попытается получить доступ к неинициализированной переменной.

Правильный способ написания кода - убедиться, что переменная назначена перед вводом блока try/finally.

Это самый фундаментальный шаблон управления жизненным циклом в кодировке Delphi, и вы должны глубоко посвятить его мышце.

Обратите внимание, что если конструктор выходит из строя, он будет убирать частично сконструированный объект перед распространением исключения. Новая ссылка на объект, Registry в этом коде, назначается только в том случае, если конструктор успешно завершен.

Я хотел бы надеяться, что приведенные вами примеры были написаны в соответствии с моим кодом выше, и вы как-то переписывали их неправильно. Если они написаны в соответствии с вопросом, то они явно ошибаются.

+0

Мне нужно сделать дополнительную проверку после создания перед блоком try, чтобы на самом деле убедиться, что инициализирован Registry ok? –

+0

И только, например, http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=656&lngWId=7 был бы одним из тех уроков, которые я нашел, что действительно кажется ошибочным, следовательно, вопрос, чтобы попытаться понять, действительно ли этот код напоминает то, что сделал бы более продвинутый разработчик delphi или нет. –

+0

Очевидно, вам нужно найти лучшие источники, чем этот сайт! –

Смежные вопросы