<p dir="ltr">Seems that Delphi considers that the object is already created at the time AfterConstruction is called, so it understands that when it gets into AfterConstruction is sucessfully created. Semantically makes sense.</p>
<p dir="ltr">The counter proof is see if AfterConstruction is called when a exception occurs in constructor</p>
<p dir="ltr">Luiz</p>
<div class="gmail_extra"><br><div class="gmail_quote">Em 3 de set de 2016 11:50 PM, "silvioprog" <<a href="mailto:silvioprog@gmail.com">silvioprog@gmail.com</a>> escreveu:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hello,</div><div><br></div><div>My question at title seems stupid, but the reason why I've get this doubt is just because it get different results between Free Pascal and Delphi in the following example:</div><div><br></div><div>=== begin code ===</div><div><br></div><div><font face="monospace, monospace" size="1">program project1;</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">{$IFDEF FPC}</font></div><div><font face="monospace, monospace" size="1"> {$MODE DELPHI}</font></div><div><font face="monospace, monospace" size="1">{$ENDIF}</font></div><div><font face="monospace, monospace" size="1">{$IFDEF MSWINDOWS}</font></div><div><font face="monospace, monospace" size="1"> {$APPTYPE CONSOLE}</font></div><div><font face="monospace, monospace" size="1">{$ENDIF}</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">uses SysUtils;</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">type</font></div><div><font face="monospace, monospace" size="1"> TSomeClass = class</font></div><div><font face="monospace, monospace" size="1"> public</font></div><div><font face="monospace, monospace" size="1"> procedure LoadSomething;</font></div><div><font face="monospace, monospace" size="1"> end;</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1"> TA = class</font></div><div><font face="monospace, monospace" size="1"> private</font></div><div><font face="monospace, monospace" size="1"> FSomeObject: TSomeClass;</font></div><div><font face="monospace, monospace" size="1"> public</font></div><div><font face="monospace, monospace" size="1"> constructor Create; virtual;</font></div><div><font face="monospace, monospace" size="1"> destructor Destroy; override;</font></div><div><font face="monospace, monospace" size="1"> procedure AfterConstruction; override;</font></div><div><font face="monospace, monospace" size="1"> procedure BeforeDestruction; override;</font></div><div><font face="monospace, monospace" size="1"> property SomeObject: TSomeClass read FSomeObject;</font></div><div><font face="monospace, monospace" size="1"> end;</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">procedure TSomeClass.LoadSomething;</font></div><div><font face="monospace, monospace" size="1">begin</font></div><div><font face="monospace, monospace" size="1"> raise Exception.Create('An exception loading something');</font></div><div><font face="monospace, monospace" size="1">end;</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">constructor TA.Create;</font></div><div><font face="monospace, monospace" size="1">begin</font></div><div><font face="monospace, monospace" size="1"> WriteLn(1);</font></div><div><font face="monospace, monospace" size="1"> inherited Create;</font></div><div><font face="monospace, monospace" size="1">end;</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">destructor TA.Destroy;</font></div><div><font face="monospace, monospace" size="1">begin</font></div><div><font face="monospace, monospace" size="1"> WriteLn(2);</font></div><div><font face="monospace, monospace" size="1"> inherited Destroy;</font></div><div><font face="monospace, monospace" size="1">end;</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">procedure TA.AfterConstruction;</font></div><div><font face="monospace, monospace" size="1">begin</font></div><div><font face="monospace, monospace" size="1"> WriteLn(3);</font></div><div><font face="monospace, monospace" size="1"> FSomeObject := TSomeClass.Create;</font></div><div><font face="monospace, monospace" size="1"> FSomeObject.LoadSomething;</font></div><div><font face="monospace, monospace" size="1">end;</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">procedure TA.BeforeDestruction;</font></div><div><font face="monospace, monospace" size="1">begin</font></div><div><font face="monospace, monospace" size="1"> WriteLn(4);</font></div><div><font face="monospace, monospace" size="1"> FSomeObject.Free;</font></div><div><font face="monospace, monospace" size="1">end;</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">var</font></div><div><font face="monospace, monospace" size="1"> VA: TA;</font></div><div><font face="monospace, monospace" size="1">begin</font></div><div><font face="monospace, monospace" size="1"> VA := TA.Create;</font></div><div><font face="monospace, monospace" size="1"> try</font></div><div><font face="monospace, monospace" size="1"> finally</font></div><div><font face="monospace, monospace" size="1"> VA.Free;</font></div><div><font face="monospace, monospace" size="1"> end;</font></div><div><font face="monospace, monospace" size="1">end.</font></div><div><br></div><div>=== end code ===</div><div><br></div><div>I've compiled it in Free Pascal from trunk (version 3.1.1 [2016/08/26] for x86_64) installed on a Xubuntu 16.04 64 bits, and got the following log:</div><div><br></div><div><font face="monospace, monospace" size="1">$ ./project1</font></div><div><font face="monospace, monospace" size="1">1</font></div><div><font face="monospace, monospace" size="1">3</font></div><div><font face="monospace, monospace" size="1">2</font></div><div><font face="monospace, monospace" size="1">An unhandled exception occurred at $00000000004001CD:</font></div><div><font face="monospace, monospace" size="1">Exception: An exception loading something</font></div><div><font face="monospace, monospace" size="1"> $00000000004001CD LOADSOMETHING, line 30 of project1.lpr</font></div><div><font face="monospace, monospace" size="1"> $000000000040045A AFTERCONSTRUCTION, line 50 of project1.lpr</font></div><div><font face="monospace, monospace" size="1"> $00000000004002CC CREATE, line 38 of project1.lpr</font></div><div><font face="monospace, monospace" size="1"> $00000000004004FA main, line 62 of project1.lpr</font></div><div><br></div><div>and I've compiled the same code in an original version of Delphi Pro (version 10.1 Berlin 24.0.22858.6822), on a Windows 10 64 bits, and I got the log below and a critical exception (notice the result numbers, they are different from similar test compiled in Free Pascal):</div><div><br></div><div><font face="monospace, monospace" size="1">Win32\Debug>Project1.exe</font></div><div><font face="monospace, monospace" size="1">1</font></div><div><font face="monospace, monospace" size="1">3</font></div><div><font face="monospace, monospace" size="1">4</font></div><div><font face="monospace, monospace" size="1">2</font></div><div><font face="monospace, monospace" size="1">^C</font></div><div><br></div><div>(I need to kill the app by Ctrl+C within terminal)</div><div><br></div><div>the critical exception was the known:</div><div><br></div><div><font face="monospace, monospace" size="1">[Main Instruction]</font></div><div><font face="monospace, monospace" size="1">Project1.exe has stopped working</font></div><div><font face="monospace, monospace" size="1"><br></font></div><div><font face="monospace, monospace" size="1">[Content]</font></div><div><font face="monospace, monospace" size="1">Windows is checking for a solution to the problem...</font></div><div><br></div><div>So, is it a bug? If so, in which compiler?! Even after reading some documents about BeforeDestruction I still have doubt about which is the correct triggering of this method, and I would be glad if someone could help me to solve it.</div><div><br></div><div>--</div><div>Silvio Clécio</div>
</div>
<br>______________________________<wbr>_________________<br>
fpc-pascal maillist - <a href="mailto:fpc-pascal@lists.freepascal.org">fpc-pascal@lists.freepascal.<wbr>org</a><br>
<a href="http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal" rel="noreferrer" target="_blank">http://lists.freepascal.org/<wbr>cgi-bin/mailman/listinfo/fpc-<wbr>pascal</a><br></blockquote></div></div>