TGraphicClass provides you with the same scope as TGraphic, from which it is
derived.  In your code, that is outside graphics.pas, the variable, gCls,
cannot see TGraphic.Create, but it can see TObject.Create.  This visibility
is determined at compile time and the code is bound to TObject.Create.

Inside graphics.pas however, TGraphicClass *CAN* see TGraphic.Create -
because inside the same unit member visibility is public.  Therefore, the
line of code:

>   NewGraphic := TGraphicClass(Value.ClassType).Create;

Actually calls TGraphic.Create instead of TObject.Create.  Because
TGraphic.Create is virtual and TMyGraphic.Create overrides it, by applying
the rule that inherited members cannot lower the visibility of their
ancestors, TMyGraphic.Create is "visible" to the line of code in
graphics.pas.  In actual fact, the visibility isn't checked here because at
compile time, Delphi binds the call to TGraphic.Create and at run time, the
v-table is used to figure out the address of  TMyGraphic.Create.

Dennis.

----- Original Message -----
From: "Jianming Lin (ASL)" <[EMAIL PROTECTED]>
To: "Multiple recipients of list delphi" <[EMAIL PROTECTED]>
Sent: Friday, October 18, 2002 11:49 AM
Subject: RE: [DUG]: polymorphism problem


> Dear Dennis,
>
> I read the help of Delphi, it says :
> A protected member is visible anywhere in the module where its class is
> declared
> and from any descendant class, regardless of the module where the
descendant
> class appears.
>
> Now I purposely make my constructor to be Protected member, then step into
>     myPic.Graphic := nGra;
> in the unit of graphics.pas,
> the call
>   NewGraphic := TGraphicClass(Value.ClassType).Create;
> of Tpicture class still call my protected construstor correctly.
> But nGra := gCls.Create won't. Why?
>
> //----------------------------------------
> Type TMyGraphic = class(TGraphic)
> Protected
>     constructor Create;  override;
> public
>     procedure Assign(Source: TPersistent); override;
> end;
>
> procedure TMyGraphic.Assign(Source: TPersistent);
> begin
>  //
> end;
>
> constructor TMyGraphic.Create;
> begin
>   inherited;
>   CallNo := CallNo + 1;
> end;
>
>
>
> var CallNo : Integer;
> //------------------------------------------------------------------------
> procedure TryIt;
> var gCls : TGraphicClass;
>     nGra : TGraphic;
>     myPic : TPicture;
> begin
>     CallNo := 0;
>     gCls := TGraphicClass(TMyGraphic);
>     nGra := gCls.Create;
>     ShowMessage(IntToStr(CallNo));   // 0
>
>     myPic := TPicture.Create;
>     myPic.Graphic := nGra;
>     ShowMessage(IntToStr(CallNo));   // 1
> end;
>
>
>
> -----Original Message-----
> From: Jianming Lin (ASL) [mailto:JianmingL@;aslnz.co.nz]
> Sent: Friday, 18 October 2002 11:20 a.m.
> To: Multiple recipients of list delphi
> Subject: RE: [DUG]: polymorphism problem
>
>
> Dear Dennis,
>
> YOU are right, TGraphic's constructor in D5 IS INDEED protected.
>
> Thanks everyone who has replied to this thread
>
> Jianming
>
> -----Original Message-----
> From: Dennis Chuah [mailto:dennis_cs_chuah@;hotmail.com]
> Sent: Friday, 18 October 2002 11:02 a.m.
> To: Multiple recipients of list delphi
> Subject: Re: [DUG]: polymorphism problem
>
>
>
> I stepped through your code in D6 (don't have D5 installed on this
> machine) - but perhaps there is something wrong in D5?  I am wondering in
D5
> whether TGraphic's constructor is protected?
>
> Dennis.
>
> ----- Original Message -----
> From: "Jianming Lin (ASL)" <[EMAIL PROTECTED]>
> To: "Multiple recipients of list delphi" <[EMAIL PROTECTED]>
> Sent: Friday, October 18, 2002 9:10 AM
> Subject: RE: [DUG]: polymorphism problem
>
>
> >
> >
> > -----Original Message-----
> > From: Dennis Chuah [mailto:dennis_cs_chuah@;hotmail.com]
> > Sent: Friday, 18 October 2002 7:14 a.m.
> > To: Multiple recipients of list delphi
> > Subject: Re: [DUG]: polymorphism problem
> >
> >
> >
> > I stepped through your code and it *DEFINITELY* calls TMetadata.Create.
> > What you have done looks correct and this is certainly not a
polymorphism
> > pproblem.  Few suggestions:
> >
> > 1.  Check that you do not have $(DELPHI)\Lib in your project path - it
> > should only be in the global library path.
> >
> > Checked
> >
> > 2.  What if you replaced your code with:
> >   NGraphic := TMetadata.Create;
> >
> > Step through the code - does it call TMetadata.Create?
> >
> > Yes it does
> >
> > 3.  Check the class type of NGraphic and compare
> Pointer(NGraphic.ClassType)
> > against Pointer(TMetadata).  Are they the same pointer values?
> >
> > Checked. still not get called.
> >
> > What version of Delphi are you using?
> >
> > D5 Ent
> >
> >
> > Dennis.
> >
> > ----- Original Message -----
> > From: Jianming Lin (ASL)
> > To: Multiple recipients of list delphi
> > Sent: Thursday, October 17, 2002 4:35 PM
> > Subject: [DUG]: polymorphism problem
> >
> >
> >
> >
> > G'Day, guys,
> >
> > procedure TryMetadata(ImgType : Integer);
> > var NGraphic: TGraphic;
> >     GraphicClass: TGraphicClass;
> > begin
> >   ImgType := 1;
> >   case ImgType of
> >     1 :  GraphicClass := TMetaFile;
> >     2 :  GraphicClass := TBitmap;
> >   end;
> >   NGraphic := GraphicClass.Create;
> > end;
> >
> >
> > Why constructor  of TMetafile.Create is not called instead only
> > TObject.Create is called?
> >
> >
> >
> >
> >
> > [Jianming Lin (ASL)]
> >
> >
> >
> >
> >
> > This e-mail message has been scanned for Viruses and Content and cleared
> by
> > MailMarshal - For more information please visit www.marshalsoftware.com
>
> --------------------------------------------------------------------------
> -
> >     New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
> >                   Website: http://www.delphi.org.nz
> > To UnSub, send email to: [EMAIL PROTECTED]
> > with body of "unsubscribe delphi"
> > Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/
> >
> >
>
############################################################################
> #########
> > This e-mail message has been scanned for Viruses and Content and cleared
> > by MailMarshal
> > For more information please visit www.marshalsoftware.com
> >
>
############################################################################
> #########
>
> --------------------------------------------------------------------------
> -
> >     New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
> >                   Website: http://www.delphi.org.nz
> > To UnSub, send email to: [EMAIL PROTECTED]
> > with body of "unsubscribe delphi"
> > Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/
> >
> --------------------------------------------------------------------------
-
>     New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
>                   Website: http://www.delphi.org.nz
> To UnSub, send email to: [EMAIL PROTECTED]
> with body of "unsubscribe delphi"
> Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/
>
>
############################################################################
> #########
> This e-mail message has been scanned for Viruses and Content and cleared
> by MailMarshal
> For more information please visit www.marshalsoftware.com
>
############################################################################
> #########
> --------------------------------------------------------------------------
-
>     New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
>                   Website: http://www.delphi.org.nz
> To UnSub, send email to: [EMAIL PROTECTED]
> with body of "unsubscribe delphi"
> Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/
>
>
############################################################################
#########
> This e-mail message has been scanned for Viruses and Content and cleared
> by MailMarshal
> For more information please visit www.marshalsoftware.com
>
############################################################################
#########
> --------------------------------------------------------------------------
-
>     New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
>                   Website: http://www.delphi.org.nz
> To UnSub, send email to: [EMAIL PROTECTED]
> with body of "unsubscribe delphi"
> Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/
>
---------------------------------------------------------------------------
    New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
                  Website: http://www.delphi.org.nz
To UnSub, send email to: [EMAIL PROTECTED] 
with body of "unsubscribe delphi"
Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/

Reply via email to