Hey Giovanni, RTTI info relies on you subclassing from Tpersistent. This
is how Tfont etc all work also. 

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:owner-delphi@;delphi.org.nz] On
Behalf Of Moretti, Giovanni
Sent: Friday, 25 October 2002 4:15 p.m.
To: Multiple recipients of list delphi
Subject: RE: [DUG]: Polymorphic assignment to Color - THANKS + New Info


Hi

Thanks to you all for your help and the tutorial on interfaces which was
very handy as I'm still wrapping my mind around them (apart from this
problem).

I decided to use Kyley's RTTI interrogation technique - I understand
what it's doing whereas my OO development is still digesting interfaces.
In due course I may go the interface way, but for the moment, the RTTI
method will suffice. 

I decided to check the functions worked as I expected by creating my own
object (rather than using Form/Panel, Font background ...)

I defined a minimal object with get/set properties and tried to use it
(see skeletal code below). Compiled fine but gave a "Doesn't have a
Colour Property" message, which means that IsPublishedProp is returning
nil.

After wandering around the help system on RTTI I went home and the
answer (well a solution anyway) came while I was driving. I was
pondering on why the system-defined objects were fine and mine wasn't.
Answer - they're all derived from TComponent. Even though the property
is public and published, for "IsPublishedProp()" to work, the class
(apparently) has to be a descendent of TComponent, TObject won't work. 

So now I have a method I can use for both VCL objects and those I
create.

I greatly appreciate your help

Thank you all

Giovanni 
CompSci - Massey Uni

==========================================================
// TMyColourSetTester = class(TObject) <= FAILS AT RUNTIME

   TMyColourSetTester = class(TComponent) <= WORKS FINE
    private
       MyColour         : TColor;
       function  GetCol : TColor;
       procedure SetCol (value : TColor);
    public
       constructor create; // just calls inherited create
    published
        property
          color : TColor read GetCol write SetCol;
    end;
 
procedure SetObjectColour (name      : string; 
                           AObject   : TObject; 
                           newColour : TColor);
var result : boolean;
    propinfo : PPropInfo;
    classTypeInfo : PTypeInfo;
begin
  result   := IsPublishedProp(AObject,'color');
  If result then SetOrdProp(AObject,'Color',newColour)
  else showmessage(name+' doesn''t have a Color property'); end;

var Coltester : TMyColourSetTester;

  ColTester:= TMyColourSetTester.create;
  ColTester.color:= clYellow;  // Make sure it goes

  setObjectColour('ColTester', ColTester, clAqua);

==========================================================
------------------------------------------------------------------------
---
    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