Oh nice. Feel free to QP. E2003WithConstsInDescendingClassesConsoleProject
Posted by jpluimers on 2017/12/06
Oh nice. Feel free to QP. Fails at least in Delphi XE8.
program E2003WithConstsInDescendingClassesConsoleProject; {$APPTYPE CONSOLE} uses ParentUnit in 'ParentUnit.pas', ChildUnit in 'ChildUnit.pas'; begin end.
unit ParentUnit; interface type TParent = class // section can be strict protected, protected, public, published or nothing const InitialBooleanValue = False; InitialIntegerValue = -1; end; implementation end.
unit ChildUnit; interface uses ParentUnit; type TChild = class(TParent) // section can be strict protected, protected, public, published or nothing const // Initial and final values need to be different to test the behaviour FinalBooleanValue = not InitialBooleanValue; FinalIntegerValue = InitialIntegerValue + 1; //[dcc32 Error] ChildUnit.pas(13): E2003 Undeclared identifier: 'InitialBooleanValue' //[dcc32 Error] ChildUnit.pas(14): E2003 Undeclared identifier: 'InitialIntegerValue' //[dcc32 Error] ChildUnit.pas(14): E2026 Constant expression expected end; implementation end.
[WayBack] Oh nice. Feel free to QP. unit ParentUnit; interface type TParent = class …
Cesar Romero said
Been there too, I know the answer in QP “closed as designed”.
As a workaround use
TParent.*
jpluimers said
Thanks. I should have included the workaround, so thanks for posting that.
rvelthuis said
That is not a “workaround”. That is how nested constant and type declarations work. It was your expectation (that they are somehow inherited and can be accessed without qualification) that was wrong.