Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как избежать варинига при создании объекта в try finally [D6, WinXP]


Страницы:   1 2 3

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 внутри...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо