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

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

raise in Constructor [D7, WinXP]


VEZ ©   (2006-05-19 14:28:00) 

Здравствуйте! Корректно ли в конструкторе генерить исключение для того чтоб отменить создания объекта. Проблема в том что в конструктор класса передаётся имя файла, и конструктор проверяет правильность его формата, если формат неверен, то объект создавать ненужно. Особенно это актуально у фреймов или форм, когда надо заполнить элементы управления на них, при этом чтоб не срабатывало событие OnChange. И какие есть способы отмены создания объекта самим собой на этапе его создания.


Сергей М.   (2006-05-19 15:40:00) [1]


> мой деструктор вызывается автоматически


Иначе и быть неможет.

Повсему - "все в твоих руках" (С) Известная приятная барышня


Сергей М.   (2006-05-19 15:40:00) [2]

Удалено модератором


Сергей М.   (2006-05-19 15:38:00) [3]

Ты это к чему ?

К тому что Делфи-отладчик для тебя - пятно на Луне ?


VEZ   (2006-05-19 15:37:00) [4]

Действительно, мой деструктор вызывается автоматически, и там происходит попытка освободить несозданный в конструкторе объект, проблема закрыта, всем спасибо.


VEZ   (2006-05-19 15:10:00) [5]

constructor TMyObj.Create(Parent:TObj; VisParent: TComponent;
                        Node: TTreeNode; ini: TMemIniFile);
var
s:string;
IONode:TTreeNode;
DeleteFile:boolean;
Ext:string;
{tmpini}OriginalFileName:TFileName;
begin
Ext:=ExtractFileExt(ini.FileName);
//DeleteFile:=fa
OriginalFileName:=ini.FileName;
if AnsiCompareText(Ext,'.Hex')=0 then
 begin
  ini.Rename(ConvertHexTotmpIni(ini.FileName),true);
  //ini.Rename('',false);
  SysUtils.DeleteFile(ini.FileName)
  {if tmpini<>'' then
   begin
    ini.Free;
    ini:=TIniFile.Create(tmpini);
   end;}
 end;
FVisParent:=VisParent;
FParent:=Parent;
FChanged:=false;
FChangedDate:=FileDateToDateTime(FileAge({ini.FileName}OriginalFileName));
if FChangedDate=-1 then
 FChangedDate:=Now;
FCanDrag:=true;
FMyObjType:=GetMyObjTypeTypeFromIni(ini);
if FENKSType=Unknown then
 {Exit}raise Exception.Create('Неизвестный тип Объекта'); // Тут генерицца исключение
... // Some code - не выполняется при исключении
end; // Тут возникает AV.


Сергей М.   (2006-05-19 14:56:00) [6]


> освобождается ли память выделенная под объект при таком
> подход


Да, освобождается.

Но - под объект, а не под все то что он успел "поназанимать" в ходе исполнения своего конструктора.

Т.е.

constructor TSomeClass.Create(..);
begin
.,.
 GetMem(SomePtr, 16);
..
.. здесь возникла искл.ситуация
end;

destructor TSomeClass.Destroy;
begin
...
 FreeMem(SomePtr); без этоц строчки мемлик будет гарантирована
...

end;


Плохиш   (2006-05-19 14:55:00) [7]


> VEZ   (19.05.06 14:47) [2]
> Ну у меня случилась такая ситуация

Не могли бы Вы показать эту ситуацию на примере кода?

> VEZ   (19.05.06 14:50) [3]
> И ещё меня интересует освобождается ли память выделенная
> под объект при таком подходе.

Да


VEZ   (2006-05-19 14:50:00) [8]

И ещё меня интересует освобождается ли память выделенная под объект при таком подходе.


VEZ   (2006-05-19 14:47:00) [9]

Ну у меня случилась такая ситуация, что после сообщения с исключением происходит Acess Violation, причём в дебагере посмотрел вроде всё нормально, после raise дебагер перескакивает в конец конструктора, и после следующего нажатия F8 выскакивает AV.


Сергей М.   (2006-05-19 14:32:00) [10]

По дифолту - корректно .. А в чем сомнения ? Ты сомневаешься в том , будет ли вызван в такой ситуации диструктор ?


Наверх

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