![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как избежать варинига при создании объекта в try finally [D6, WinXP]
novill © (2006-05-25 11:06:00)если удаление объекта происходит в блоке finally, то компилятор пишет предупреждение, что объект может быть не создан.
Мне строчка эта сильно не нравится, хотя понимаю, что ничего страшного. Как надо написать чтобы ее не было?
вот пример кода
var
SD:TSaveDialog;
begin
try
SD:=TSaveDialog.Create(MyForm);
SD.InitialDir:=GetCurrentDir;
SD.Filter:='Excel files (*.xls)|*.XLS';
if SD.Execute then filename:=SD.FileName;
finally
SD.Free;
end;
Компилятор пишет "Variable 'SD' might not have been initialized"
Игорь Шевченко (2006-05-25 13:23:00) [41]
> Предложенный мною способ в ран-тайме не будет НИЧЕМ отличаться
> от "правильного способа".
Пальцы жалко. И глаза.
Loginov Dmitry (2006-05-25 13:11:00) [42]И еще (для) [6], [7]
Не стоит быть такими категоричными. Предложенный мною способ в ран-тайме не будет НИЧЕМ отличаться от "правильного способа". Если объект не будет создан, то метод Free выполниться НОРМАЛЬНО. Так что не к чему тут разводить ...
Kolan (2006-05-25 13:09:00) [43]А вот всякие ненужные варнинги такой способ убирает - это точно!
Ненужных Warning'ов небывает. :)
Сергей М. (2006-05-25 12:50:00) [44]
> novill (25.05.06 11:06)
> понимаю, что ничего страшного
Неправильно понимаешь. Именно о "страшном" предупреждает тебя компилятор.
Представь себе, что при выполнении строчки
SD:=TSaveDialog.Create(MyForm);
возникла искл.ситуация (по каким причинам - не важно).
В результате объект класса TSaveDialog не был создан, и в переменную SD не было ничего записано (при этом ее содержимое не определено)
Поскольку строчка, вызвавшая исключение, была включена в try-finally-блок, управление тут же будет передано в секцию finally этого блока, где ты пытаешься уничтожить несуществующийобъект, что практически 100%-но гарантирует возникновение нового исключения (AV).
Именно об этом тебя и предупреждает компилятор.
Loginov Dmitry (2006-05-25 12:45:00) [45]Самообмана тут нет (сам так ни разу не делал :)
А вот всякие ненужные варнинги такой способ убирает - это точно!
@BraIN (2006-05-25 12:29:00) [46]
> Loginov Dmitry © (25.05.06 11:47) [2]
>
> SD := nil; перед try finally
Бред и самообман.
evvcom (2006-05-25 12:25:00) [47]
> Затем, чтобы не было
> "Variable 'SD' might not have been initialized"
Гон или как там сейчас любят говорить? Баян?
Kolan (2006-05-25 12:14:00) [48]
var
SD:TSaveDialog;
begin
SD:=TSaveDialog.Create(MyForm);
try
...
finally
SD.Free;
end;
В этом случае предупреждения нет. И этот вариант гораздо правильнее. А
SD := nil;
try
SD:=TSaveDialog.Create(MyForm);
SD.InitialDir:=GetCurrentDir;
SD.Filter:='Excel files (*.xls)|*.XLS';
if SD.Execute then filename:=SD.FileName;
finally
SD.Free;
end;
Вообще смысла особого не имеет. Зачем давать такие советы?
Loginov Dmitry (2006-05-25 11:55:00) [49]Kolan © (25.05.06 11:48) [3]
Зачем?
Затем, чтобы не было
"Variable 'SD' might not have been initialized"
Kolan (2006-05-25 11:48:00) [50]Loginov Dmitry © (25.05.06 11:47) [2]
Зачем?
Сергей М. © (25.05.06 11:13) [1]
Это стандартная конструкция.
Loginov Dmitry (2006-05-25 11:47:00) [51]SD := nil; перед try finally
Сергей М. (2006-05-25 11:13:00) [52]var
SD:TSaveDialog;
begin
SD:=TSaveDialog.Create(MyForm);
try
...
finally
SD.Free;
end;