Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.036 c
3-1144823579
MakNik
2006-04-12 10:32
2006.06.04
ADO и DLL, как передать коннект к БД?


2-1147756978
manevil
2006-05-16 09:22
2006.06.04
Еще один вопрос про OpenDialog


2-1147540891
serko
2006-05-13 21:21
2006.06.04
Запуск скрипта!


2-1147801737
alexey_newbie
2006-05-16 21:48
2006.06.04
Access violation


2-1147451540
mixa
2006-05-12 20:32
2006.06.04
DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский