[fpc-pascal] Compile error with published field

Michael Van Canneyt michael at freepascal.org
Sat Nov 18 15:22:15 CET 2006



On Fri, 17 Nov 2006, Joao Morais wrote:

> Joao Morais wrote:
> > Michael Van Canneyt wrote:
> > >
> > > On Wed, 15 Nov 2006, Joao Morais wrote:
> > >
> > > > Hello,
> > > >
> > > > I have a TPersistent decendant class that causes the following compiling
> > > > error:
> > > >
> > > > "Only class which are compiled in $M+ mode can be published"
> > > >
> > > > This is the inheritance:
> > > >
> > > > TPersistent (Classes unit)
> > > > +-TPressStreamable (PressClasses unit)
> > > >   +-TPressSubject (PressSubject unit)
> > > >     +-TPressObject (PressSubject unit)
> > > >
> > > > Am I missing something?
> > >
> > > Probably you have a published member in your class which is not a
> > > descendent
> > > of TPersistent. Only TPersistent descendents can be published members of a
> > > class (which in itself must be a TPersistent descendent).
> > >
> > > So, if TPressObject has a published property
> > >   Property MyProp : TMyPropClass Read...
> > >
> > > then TMyPropClass must also descend from TPersistent.
> > 
> > This is the code:
> > 
> >   TPressObject = class(TPressSubject)
> >     _Id: TPressString;
> >   private  // <- compiler stops here
> >     ...
> > 
> > and this is the inheritance:
> > 
> > TPersistent (Classes unit)
> > +-TPressStreamable (PressClasses unit)
> >   +-TPressSubject (PressSubject unit)
> >      +-TPressObject (PressSubject unit)
> >      +-TPressAttribute (PressSubject unit)
> >        +-TPressString (PressSubject unit)
> > 
> > I also tried to move the member to the published area; declared the class
> > under the $M+ directive; but no success. Moving the _Id member to the
> > private area solves the compilation problem.
> 
> The problem is - TPressString is a forward declaration and the compiler
> doesn't know that it inherits from TPersistent. Is this the expected behavior?

Yes. 
The compiler has no idea that _Id is publishable, and therefor rejects it.

Michael.



More information about the fpc-pascal mailing list