Larry,

I did a little experiment.

I set visible frame on and clicked off all the frame sides.

When I run the form the control has no border.

My button issues:
property xx FrameSides 'sdTop,sdLeft'

Voila!  The top and left frames are turned on!

I have absolutely no use for this (at least right now) but it does show that 
you can work with this kind of property in code.
The key is the list that shows in the object inspector next to FrameSides.
The + in the inspector gives a GUI way to set the individual items easily.

Dennis

________________________________
From: [email protected] [mailto:[email protected]] On Behalf Of Lawrence Lustig
Sent: Thursday, November 11, 2010 5:20 PM
To: RBASE-L Mailing List
Subject: [RBASE-L] - Re: Panel Question

<<
How does one access sub-properties
I tried this for fun

getproperty xx FrameSides 'vTmp'
-- gets a list of sides that are true, i.e.  sdRight,SdLeft

getproperty xx FrameSides|sdRight 'vTmp'
-- gets nothing, is there a syntax for referencing just the one sub-property?
>>

Well, I wrote a whole long message about how this wont work, because R:Base 
can't understand Delphi enumerations and sets.  Then, on a lark, I tried it, 
and it appears RBTI is one step (at least) ahead of me.  I've left the original 
message below because it contains interesting information notwithstanding that 
it is, factually, wrong.  Wrong, wrong, wrong.

Basically, there IS no sdRight property.  There is only a FrameSides property 
which is a set "containing" 0 or more of the values sdRight, sdLeft, sdTop, and 
sdBottom.  (In reality, it's a set of four bit flags, each representing one of 
the possible values being on or off in the set, but that's not important.)

R:Base converts the set into a comma delimited list when you read it and (this 
is too cool) it decodes a comma-delimited list and updates the property:

PROPERTY xx FRAMESIDES 'sdRight,sdLeft'

will set the control to have the frame only on the left and right.
--
Larry

ORIGINAL (WRONG, WRONG, WRONG) ANSWER:

That's a bit harder.

There are all kinds of compound properties and R:Base needs to supply special 
proxy properties for us to be able to access them from R:Base.

For example, the Delphi font property for any control is an instance of TFont, 
which has, among others, a Style property which is a set of one or more of 
fsBold, fsStrikethrough, fsUnderline, and fsItalic (which themselves are part 
of a Delphi enumeration, they map to integer values).  Because R:Base has no 
concept of enumerations or sets, RBTI has thoughtfully supplied proxy 
properties name Font_Bold, Font_Strikethrough, Font_Underline, and Font_Italic 
that can be set to boolean values (actually, pseudo-boolean text values, since 
R:Base doesn't support BOOL directly).

What's happening when you read or write the proxy property is that R:Base 
contains code to read or write the underlying Delphi type.  But this only works 
if they've taken the trouble to create a proxy for the property you're 
interested in.

In the case you cited, there's no "sdRight" property to read, since sdRight is 
simply an enumeration value that's been added to the set-type property 
FrameSides.  In order for you as an R:Base programmer to read or write the 
various sides, RBTI would have to create proxy properties like FrameSide_Left, 
FrameSide_Right and so on and internally handle the mapping between those 
proxies and "real" properties.  Alternatively, they could override the property 
the way they've done with Anchors, which accepts a comma-delimited list.  In 
any event, I find it hard to imagine that they've done it for an obscure issue 
like frame sides.

Reply via email to