As a Xojo web developer probably you’re used to embedding controls inside others, like Rectangles
or Containers
; but I bet sometimes you don’t get the expected results. Read on to learn a quick fix that uses an extended method to correct a common problem you might run into when embedding menus.
In this example, think about a WebPopupMenu
embedded inside a rectangle that is embedded in a second rectangle. If the entries added to the WebPopupMenu are wider than the width of the rectangle it is embedded in or if it has more entries than the WebRectangle height, then these entries will be cropped in the deployed app. This screenshot better shows the problem:
The solution is quite easy! Just add an extended method to the WebControl
class (inside a Module
, where —Pro Tip!— you would likely want to add all these kinds of utility methods) and use the following signature when creating it:
- Method Name:
ParentsVisibleOverflow
- Parameters:
Extends Source As WebControl, Value As Boolean = true
- Scope:
Global
Add the following snippet of code in the resulting Code Editor for the new method:
If source <> Nil Then Var parentRoots() As WebControl Var current As WebControl = source.Parent While current IsA WebControl And Not current IsA WebPage parentRoots.Add(current) current = current.Parent Wend Var set As String = If(value, "visible", "Hidden") Var id As String Var s As String For Each item As WebControl In parentRoots id = item.ControlID s = "document.getElementById('"+id+"').style.overflow='"+set+"';" item.ExecuteJavaScript(s) Next item End If
All we need to do now in the Shown Event of the PopupMenu is call our method on the instance:
Me.ParentsVisibleOverflow
Now we see the expected items all visible in the menu!
Paul learned to program in BASIC at age 13 and has programmed in more languages than he remembers, with Xojo being an obvious favorite. When not working on Xojo, you can find him talking about retrocomputing at Goto 10 and on Mastodon @lefebvre@hachyderm.io.