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.