This one has me scratching my head. I even had Robert review to make sure I wasn’t being stupid (insert snarky comment here). I have the following code to load a PopupMenu:
[code] while rs.eof = false
dim sText as string = rs.idxField(1).StringValue
dim v as variant = rs.idxField(2).value
pmList.addrow sText
pmList.RowTag(pmList.ListCount-1) = v
rs.MoveNext
wend[/code]
I can see v in the debugger, but if I try to access it in the RowTag it always comes back nil. Weird. I add a dictionary like this:
[code]while rs.eof = false
dim sText as string = rs.idxField(1).StringValue
dim v as variant = rs.idxField(2).value
pmList.addrow sText
pmList.RowTag(pmList.ListCount-1) = v
dictList.value(sText) = v
rs.MoveNext
wend[/code]
And then test the values like this;
dim v as variant = dictList.value(pmList.text)
dim v2 as variant = pmList.RowTag(pmList.ListIndex)
v has the correct value and v2 is always nil. Only one spot we’re being loaded so there’s no interference from anything else. Very bizarre. Just curious if anyone has run across anything like this before.
Alrighty then. One bit of information I failed to mention is that this control is on a dynamically loaded ContainerControl. The Load happens before the EmbedWithin happens.
When I switch the order so it does the EmbedWithin first and then the load it works as expected.
I’ll see if I can replicate in a small project and submit.
The thing with EmbedWithin is that Xojo delayes creating of underlaying objects until the EmbedWithin.
So while you have a listbox there, it’s not yet fully constructed.
This is not a bug. A control is ready when the Open event is raised by the framework. And Open will only be called when EmbedWithin is processed. The listbox might be there, but not in a state to be “used” (only the constructors have been called). You see this when logging with CurrentMethodName:
cc.load("Load Before Embed")
cc.EmbedWithin self, me.left, me.top + me.Height + 10, cc.width, cc.Height
>
PopupMenu1.Constructor
ContainerControl1.Constructor
ContainerControl1.Load // Controls are not ready here
ContainerControl1.PopupMenu1.Open
ContainerControl1.Open
cc.EmbedWithin self, me.left, me.top + me.Height + 10, cc.width, cc.Height
cc.load("Load After Embed")
>
PopupMenu1.Constructor
ContainerControl1.Constructor
ContainerControl1.PopupMenu1.Open
ContainerControl1.Open
ContainerControl1.Load // This will work
Hm…well, it’s semantics, IMO. The Row TEXT is being populated but not the RowTag.
Granted, it probably should have never worked in the first place, but the seven dynamic containers that use different controls all passed testing. It’s only the PopupMenu that does this.
After the Load method has been executed the popup menu has no entries in the debugger. The control is just not ready before the Open event it might work in some cases, but this is pure luck. The docs state for the Open event: “The window is about to open. Use this event to initialize a control.”
[quote=248075:@Bob Keeney]Alrighty then. One bit of information I failed to mention is that this control is on a dynamically loaded ContainerControl. The Load happens before the EmbedWithin happens.
When I switch the order so it does the EmbedWithin first and then the load it works as expected.
I’ll see if I can replicate in a small project and submit.
Sorry for the waste of bandwidth.[/quote]
Dont load controls BEFORE you embed the container they live on
This isn’t new
[quote=248146:@Norman Palardy]Dont load controls BEFORE you embed the container they live on
This isn’t new[/quote]
Well, sure. I’m surprised it worked, period. Like I said, the other dynamic controls worked no issue using the incorrect method. And with the exception of the RowTag property so did this popup menu.
Hopefully, someone learns from my stupidity and runs across this thread and figures it out sooner than I did.
I too have run into funky issues with execution order; however not this situation. Now I know; so it’s not wasted bandwidth and I do not consider you stupid for sharing.