Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

raise in Constructor   Найти похожие ветки 

 
VEZ   (2006-05-19 14:28) [0]

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


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

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


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

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


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

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


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


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

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

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

Да


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


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


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

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

Т.е.

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

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

end;


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

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.


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

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


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

Ты это к чему ?

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


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


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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.055 c
2-1147761317
DimonS
2006-05-16 10:35
2006.06.04
SQL+Sum()


15-1146945640
GanibalLector
2006-05-07 00:00
2006.06.04
Кто помнит pascal...


8-1135496232
vitaliy14
2005-12-25 10:37
2006.06.04
Окнтуривание изображений


15-1146814781
Ega23
2006-05-05 11:39
2006.06.04
С Днём рождения! 5 мая


6-1135231175
Asail
2005-12-22 08:59
2006.06.04
Вопрос по авторизации в IIS под CGI (delphi)...