Yo Brett,
The process is similar to Flash v2 components.
Basically there are getters and setters on nearly every property in
the Flex Controls Framework.
For v2 components we always had to wait for the onLoad events before
we could really do anything.
It's now been elaborated to commitProperties(), measure(),
updateDisplayList() etc, which dispatch various events.
Its much nicer to work with than what it was.
Get your hands dirty with the AS3 version of components and it should
be much more understandable.
That was the easiest way for me coming from an AS2 background,
Bjorn
On 27/03/2007, at 3:31 PM, Gordon Smith wrote:
Brett, I'm not clear on what you're trying to accomplish. You said
you need to create components dynamically and set their properties.
If you simply need to set the width and height of a newly created
component, you can do that immediately after 'new'ing the component
in the same way that you set x and y.
- Gordon
From: flexcoders@yahoogroups.com
[mailto:[EMAIL PROTECTED] On Behalf Of Alex Harui
Sent: Monday, March 26, 2007 3:22 PM
To: flexcoders@yahoogroups.com
Subject: RE: [flexcoders] Setting properties on AS-created components
You can't be as procedural as old Flash AS.
If you do:
b = new Button()
you can't ask for the width until after your method is over because
the validation mechanism normally doesn't kick in until "later".
You can force validation by doing:
b.validateNow().
Generally, you don't want to do that. Usually, if you create the
Button in createChildren() or on an event, your updateDisplayList
will get called at the appropriate time, and the child will be
sized by then. So, instead of writing one long "create-and-draw"
function, we recommend finding the right methods to override or
events to listen to, and writing a few lines of code in the right
places.
-Alex
From: flexcoders@yahoogroups.com
[mailto:[EMAIL PROTECTED] On Behalf Of Brett Walker
Sent: Monday, March 26, 2007 2:49 PM
To: flexcoders@yahoogroups.com
Subject: Re: [flexcoders] Setting properties on AS-created components
hi Alex,
Thanks for the reply. I did try using getExplicitOrMeasuredWidth()
before I switched to using a listener, and it returned 0. Are you
suggesting that it should return the accurate value, though? Or
that I should be using getExplicitOrMeasuredWidth() *anytime* I
want to access a child's width property? I will try moving the
event listener to something earlier than creationComplete -- I was
just happy that I got it to work at all!
-brett
On 3/26/07, Alex Harui <[EMAIL PROTECTED]> wrote:
We can always use more documentation. Books are coming out left
and right these days which may also help.
You're right, the width/height isn't set until the
updateDisplayList pass. We use a invalidate/validate model for
performance reasons.
Another thing is that we use a top-down layout model. The
application is sized, then its children, then their children,
etc... Essentially, children are sized by their parents. Parents
laying out their children generally don't care about the width/
height because they will dictate it. Instead they care about the
child's measured or explicitly set height and try to honor that.
There is a method call getExplicitOrMeasuredWidth()/Height() that
we use all the time.
The source code shipped with the product which is a good place to
look. There is a keep-generated flag that shows you what AS the
MXML compiler generates.
Final note, creationComplete is very late, the equivalent of
automatically hitting a button to effect change, so you'll probably
be better off using getExplicitOrMeasured...()
From: flexcoders@yahoogroups.com
[mailto:[EMAIL PROTECTED] On Behalf Of Brett Walker
Sent: Monday, March 26, 2007 12:34 AM
To: flexcoders@yahoogroups.com
Subject: [flexcoders] Setting properties on AS-created components
hi there,
Long time AS developer, new Flex developer. Coming from a pure
ActionScript background, I've been really banging my head against the
Flex framework. I'm working on a Flex 2 project where I need to
dynamically instantiate Flex components using ActionScript, and
then lay them out manually. I finally got everything sorted out,
but I'm wondering if there really isn't a better way to do this.
Basically, I'm creating Flex components at runtime using "new ___
()". In particular, I came across a problem trying to modify a
Button component that I created inside a Panel. Setting the x and y
immediately was no problem, however the width property kept
returning 0
. I tried explicitWidth, measuredWidth, every arcane width I could
find in the docs, but always 0. Then I realized that the Button
probably hadn't finished its layout processes yet. Okay, after some
more hand-wrenching, I decided to add a listener to the Button for
the FlexEvent.CREATION_COMPLETE event, and set the props on that.
Gods be praised, it worked. The width property finally had a value.
But really, this seems very inelegant to me. Don't get me wrong, I
love the AS3 event system (mostly), but having to create listener
functions just to set visual properties of AS-created
components...ugh. Is there a better way to accomplish this? Did I
miss something?
I think that Adobe needs to concentrate more documentation on using
Flex from a non-MXML perspective. It is very frustrating trying to
get up to speed with such a complicated framework, when most of the
documentation uses MXML to teach concepts.
thanks,
-brett