![]() |
| ||
|
|
Новости |
Поиск |
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"
Palladin (2006-05-29 11:18:00) [1]
> novill © (29.05.06 10:40) [51]
obj:=TObj.Create;
Try
Finally
obj.Free;
End;
novill (2006-05-29 10:40:00) [2]Так как же все-таки правильно делать?
Жуков Олег (2006-05-26 21:36:00) [3]Простой способ получить Exception в конструкторе любого компонента. Вполне вероятный.
SomeComponent1: TSomeComponent;
SomeComponent2: TSomeComponent;
SomeComponent1 := TSomeComponent.Create(nil);
...
SomeComponent1.Free();
...
SomeComponent2 := TSomeComponent.Create(SomeComponent1);
Сергей М. (2006-05-26 16:46:00) [4]
> jack128 © (26.05.06 16:43) [46]
> можно получить исключение. EOutOfMemory
Запросто.
Так что правда и на твоей стороне)
Игорь Шевченко (2006-05-26 16:45:00) [5]jack128 © (26.05.06 16:43) [46]
Женя, а спора, собстна никакого нету. Я никоим боком не хочу убедить кого-то не использовать исключения в конструкторах. Просто я могу повторить, что поиском наиболее распространенных приемов программирования я занимаюсь в исходниках VCL, кстати, там на EOutOfMemory конструируемые объекты не проверяются :)
Джо (2006-05-26 16:45:00) [6]> что при создании _любого_ объекта можно получить исключение.
> EOutOfMemory :-)
Вот только есть сомнение, что это исключение удастся корректно обработать :)
jack128 (2006-05-26 16:43:00) [7]Ладно, чтоб уж совсем не чувствовать себя проигравшим в споре отмечу, что при создании _любого_ объекта можно получить исключение. EOutOfMemory :-)
Игорь Шевченко (2006-05-26 16:01:00) [8]jack128 © (26.05.06 15:58) [43]
> Отсюда следует, что если хендл не удаётся создать - будет
> поднято исключение
С этим никто не спорит. Но это произойдет не в конструкторе формы, если она не visible.
jack128 (2006-05-26 16:00:00) [9]jack128 © (26.05.06 15:58) [43]
constructor TForm2.Create(AOwner: TComponent);
begin
inherited;
ShowMessage(BoolToStr(HandleAllocated, True)); // Выведет True. Следовательно в конструкторе была попытка создать хендл. Удачная попытка.
end;
А!!! Черт, и здесь облажался.
jack128 (2006-05-26 15:58:00) [10]Игорь Шевченко © (26.05.06 12:27) [40]
> TForm при недостатке оконных ресурсов
Не получу
procedure TWinControl.CreateWnd;
begin
...
CreationControl := Self;
CreateWindowHandle(Params);
if FHandle = 0 then
RaiseLastOSError; //!!!!!!!!!
...
end; Отсюда следует, что если хендл не удаётся создать - будет поднято исключение.
constructor TForm2.Create(AOwner: TComponent);
begin
inherited;
ShowMessage(BoolToStr(HandleAllocated, True)); // Выведет True. Следовательно в конструкторе была попытка создать хендл. Удачная попытка.
end;
Игорь Шевченко © (26.05.06 12:27) [40]
> TBrush - при недостатке граф. ресурсов
Не получу
Хм. Да, тут поторопился.
Fay (2006-05-26 13:17:00) [11]Удалено модератором
Zz_ (2006-05-26 12:44:00) [12]Взлетит :)
Игорь Шевченко (2006-05-26 12:27:00) [13]
> TFileStream при отсутствии файлов
Получу.
> TForm при недостатке оконных ресурсов
Не получу
> TBrush - при недостатке граф. ресурсов
Не получу
jack128 (2006-05-26 12:15:00) [14]Игорь Шевченко © (26.05.06 9:25) [38]
попытайся создать любой объект, являющий оболочкой над любым ресурсом ОС и тут же получишь исключение в конструкторе. TFileStream при отсутствии файлов, TForm при недостатке оконных ресурсов, ResurceStream при отсутствии ресурса в модуле, TBrush - при недостатке граф. ресурсов и тд и тп...
Игорь Шевченко (2006-05-26 09:25:00) [15]Жуков Олег (26.05.06 00:56) [37]
> TFileStream.Create('шт!@!$!@5asasdf', fmInOut);
Кстати, обработка ошибки сделана не совсем корректно - так как выдается только факт, что нельзя создать FileStream, но не выдается почему его нельзя создать.
Но я говорил про типичность решения, если ты почитаешь посты.
Жуков Олег (2006-05-26 00:56:00) [16]
> Игорь Шевченко © (25.05.06 23:26) [36]
>
>
FileStream := TFileStream.Create('шт!@!$!@5asasdf', fmInOut);
Игорь Шевченко (2006-05-25 23:26:00) [17]Джо © (25.05.06 22:27) [34]
Leonid Troyanovsky © (25.05.06 22:31) [35]
Я обычно за распространенными решениями лезу в VCL. Вот распространенности такого решения я там не нашел. Плохо искал ?
Leonid Troyanovsky (2006-05-25 22:31:00) [18]
> Игорь Шевченко © (25.05.06 22:22) [33]
> А чем она, собственно, абсолютно нормальна ? Как-то нечасто
> встречаются конструкторы с raise внутри...
Пуркуа бы не па?
Иногда очень удобно похерить весь креативный процесс,
особо не обременясь высвобождением внутренностей.
Т.е., пусть это деструктор думает, освобождать ли Assigned(x).
--
Regards, LVT.
Джо (2006-05-25 22:27:00) [19]> [33] Игорь Шевченко © (25.05.06 22:22)
Часто или не слишком часто, но, ИМХО, НЕнормального ничего нету. Особенно, если конструктор с параметрами.
Игорь Шевченко (2006-05-25 22:22:00) [20]jack128 © (25.05.06 18:57) [29]
> это абсолютно нормальная ситуация.
А чем она, собственно, абсолютно нормальна ? Как-то нечасто встречаются конструкторы с raise внутри...