You know you can go about this from another point of view. I actually
posted about this a bit ago. This won't accomplish exactly what you are
asking for but it may be something you can use.

First, remember that even when you have a very large collection or entity
selection, as you seem to, you can make references to it WITHOUT
duplicating it. This saves memory, obviously, but also means you can work
with the list without having to worry about syncing it. It's even better
when you are working with an entity collection. With 'lazy loading' the
collection only contains references to the entities not a full copy of the

Next, if it's the case the highlighted elements are being generated by some
sort of filter or search perhaps you can accomplish your goal by only
showing the records that match whatever criteria you have. I would think
this is especially true with a list of 40K items. Personally I would really
not want to have to scroll down to the second item highlighted when it's

So, you have your 40k entity selection. The trick is not to put this in the
listbox. Instead make a reference to it and display that. Remember neither
of these entity selections consists of the data and the second one, the one
in the listbox, is only a reference to the first. I learned from JPR that
this is very memory efficient.

Let's say you put the entity selection in a process var (I would most
likely use Form for this) but to simplify the example let's call it
'entitySelection'. Next make a collection on Form called
"displayCollection" (or whatever) as


Use Form.displayCollection in the listbox. By default the listbox shows all
the elements of entitySelection.

To show a selection of this list you could do:

Form.displayCollection:=entitySelection.query("dateHired < :1";(Current
date-90))  //borrowing a query example from the docs.
Form.displayCollection:=Form.displayCollection  //  forces the listbox to
update itself

What are we doing? The query on the entity selection returns a collection.
The contents of the collection are references to the respective elements in
entitySelection. We're putting the query result into Form.displayCollection
and since we have defined our listbox to use displayCollection the listbox
now contains the query result.

This is very fast. Like update while the user is typing fast. And since we
are working with references changes you make to the something in the
listbox populates back to the entity selection, entitySelection. Plus it's
memory efficient.

Another thing I learned at the WT - the entitySelection.toCollection
command can be helpful BUT it does move the actual entity data to the
collection. For something like a 40k element entity selection this might
matter. So be sure to stick with your entity selection when it's large. And
in this case the data would be in entitySelection but not in the references
to it.

On Tue, Apr 16, 2019 at 9:11 AM Keith Culotta via 4D_Tech <> wrote:

> Douglas,
> That seems promising.  Since the listbox is a collection/entity selection,
> each row's color would be set by the rows presence in the "Selected items"
> collection.  I imagine the performance would be OK as long as the search
> only took place as the row becomes visible to the User.
> Kirk's proposal alludes to a solution that 4D seems inches away from,
> where a row's membership in the selected items collection automatically
> grants it a highlight, similar to the boolean array of the array based
> listbox, and the HighlightSet of the selection based listbox.
> Thanks,
> Keith - CDI
> > On Apr 16, 2019, at 10:44 AM, Douglas von Roeder via 4D_Tech <
>> wrote:
> >
> > Keith:
> >
> > How about this - rather than change the highlight, what about just
> changing
> > the color of the rows to mimic that they’re selected? You can still
> > maintain array of record numbers/ID’s that represent the selection but
> just
> > update the UI so that it looks like the rows are selected.
> >
> > My thinking is that by using the list box code to select the rows, that’s
> > causing 4D to reload the records. The thought "Why would you want to do
> > that (if you don’t have to)?”, comes to mind. :-)
> >
> > --
> > Douglas von Roeder
> > 949-336-2902
> >
> >
> > On Tue, Apr 16, 2019 at 7:22 AM Keith Culotta via 4D_Tech <
> >> wrote:
> >
> >> Justin,
> >>
> >> Thank you for the suggestion.
> >>
> >> I switched the deselect-all code to
> >>   LISTBOX SELECT ROW(*;"valsBox";1;lk replace selection)
> >>   LISTBOX SELECT ROW(*;"valsBox";1;lk remove from selection)
> >> and the selection did clear, however as soon as this add-to-selection
> code
> >> is executed
> >>   LISTBOX SELECT ROW(*;"valsBox";0;lk replace selection)
> >> 4D immediately crashes.
> >>
> >> If all 40k rows get deselected, using either method, and selecting them
> >> all again is done in a loop, the loop finishes in about two seconds.
> >> At that point the macOS spinning wheel appears for three minutes. The
> >> highlight then appears and control is returned to the app.
> >> The fewer the records being highlighted, the shorter the macOS wheel
> spins.
> >>
> >> Regards,
> >> Keith - CDI
> >>
> >>> On Apr 15, 2019, at 7:50 PM, Justin Carr via 4D_Tech <
> >>> wrote:
> >>>
> >>> On 16 Apr 2019, at 5:04 am, Keith Culotta via 4D_Tech <
> >>> wrote:
> >>>>
> >>>> Hello,
> >>>>
> >>>> I'm looking for a fast way to highlight a selection of rows in an
> >> entity selection listbox.  The way I am aware of works OK unless the
> >> listbox gets a large number of rows.
> >>>>
> >>>> Adding records to the Selected Items name in the Property list does
> not
> >> highlight the listbox contents.  The equivalent of adding records to the
> >> "UserSet" is not available with entity selection listboxes.
> >>>>
> >>>> Highlighting all with LISTBOX SELECT ROW(*;"listBox";0;lk add to
> >> selection) crashes 4D if the listbox contains enough records.
> >>>> LISTBOX SELECT ROW(*;"listBox";$position;lk add to selection) crashes
> >> if put in a fast FOR loop.  If the loop is executed more slowly there is
> >> success.  The slowness comes from looking for entitySelected[i] within
> the
> >> entity selection and highlighting its position in the listbox.
> >>>>
> >>>> Is there a better way to get there?
> >>>
> >>> Hey Keith
> >>>
> >>> Are you clearing the listbox selection first (with LISTBOX SELECT
> >> ROW(*;"listBox";0;lk remove from selection)? If so, that is probably the
> >> cause of the crashing you are seeing. You can workaround it by
> highlighting
> >> and unhighlighting the first row instead, i.e.
> >>>
> >>> LISTBOX SELECT ROW(*;"listBox";1;lk replace selection)
> >>> LISTBOX SELECT ROW(*;"listBox";1;lk remove from selection)
> >>>
> >>> cheers
> >>> Justin
> >>
> >> **********************************************************************
> >> 4D Internet Users Group (4D iNUG)
> >> Archive:
> >> Options:
> >> Unsub:
> >> **********************************************************************
> > **********************************************************************
> > 4D Internet Users Group (4D iNUG)
> > Archive:
> > Options:
> > Unsub:
> > **********************************************************************
> **********************************************************************
> 4D Internet Users Group (4D iNUG)
> Archive:
> Options:
> Unsub:
> **********************************************************************

Kirk Brooks
San Francisco, CA

What can be said, can be said clearly,
and what you can’t say, you should shut up about

*Wittgenstein and the Computer *
4D Internet Users Group (4D iNUG)

Reply via email to