ListBoxes and TreeListBoxes - "in-place" editing
Published 15 SEP 2022 at 03:28:26PM
One of the new features that was added to the ListBox and TreeListBox controls in version 10 was the ability to use "in-place" editing on the items in the same manner as the Windows Explorer when you press "F2" or double-click an item. If you've done any work with the OpenInsight Menu Designers you will have seen this capability in action.
The READONLY property
Enabling in-place editing is as simple as setting the READONLY property to False - once you've done that the user can press "F2" while using the control and edit the text of the currently selected item. Pressing "Enter" when editing will update the item text (as will losing focus or selecting another item), while pressing "Esc" will abandon the changes. Obviously that's a very simple take on the topic and hardly worth a blog post in and of itself, so next we'll take a look at some of the properties, methods and events that you can use to tailor the editing process.
The EDITING property
This is a simple boolean property that returns TRUE$ if an item is being edited.
The EDITORHANDLE property
This property returns the HANDLE of the editor control if an item is being edited.
The EDITKEY property
By default, hitting "F2" on an item puts the control into "edit mode", just like the Windows Explorer. However, if you wish to change this then you may use the EDITKEY property to select another key instead. The edit key is a Windows virtual key code and constants for these codes can be found in the MSWIN_VIRTUALKEY_EQUATES insert record.
The EDITOPTIONS property
This property allows you to fine-tune some of the validation options for the editor:
- TextCase - Specifies if the text entered is lower-case only, upper-case only or mixed (See the EDITLINE TEXTCASE property for more details).
- ValidChars - Specifies which characters may be entered into the editor (See the EDITLINE VALIDCHARS property for more details).
- MaxLimit - Specifies the maximum number of characters that may be entered into the editor (See the EDITLINE LIMIT property for more details).
At runtime this property is an @fm-delimited array - constants for use with this property can be found in the PS_LISTBOX_EQUATES insert record.
The INCLUDEEDITORTEXT property
By default getting item text from the ListBox (e.g. via the LIST property) will include the text from an item currently being edited, even if that edited text has not yet been saved. Setting this property to FALSE$ ensures that the returned item text ignores the value in the editor instead.
The BEGINEDIT method
This method allows you to programmatically put the ListBox into edit mode, as if the user had pressed "F2" (or whatever value the EDITKEY property is set to). You may specify the index of the item to edit, otherwise it will default to the current item.
RetVal = Exec_Method( CtrlEntID, "BEGINEDIT", itemIndex )
The ENDEDIT method
This method allows you to programmatically stop the item editing process, optionally allowing any changes to be accepted as if the "Enter" key had been pressed (the default is to reject any changes as if the "Esc" key had been pressed).
RetVal = Exec_Method( CtrlEntID, "ENDEDIT", bUpdate )
The ITEMEDITING event
This event is raised when an item it put into edit mode, and passes the index of the item as a parameter:
bForward = ITEMEDITING( CtrlEntID, CtrlClassID, ItemIndex )
The ITEMCHANGED event
This event is raised when the item is updated via the editor, i.e. the user hit the "Enter" key, the control lost the focus, or the EDITEDIT method was used with the bUpdate parameter set to TRUE$. The event passes the index of the item that has changed as well as the old and new data:
bForward = ITEMCHANGED( CtrlEntID, CtrlClassID, ItemIndex, | NewData, | PrevData )
The ITEMUNCHANGED event
This event is raised when an item leaves edit mode without being updated, i.e. the user hit the "Esc" key or the EDITEDIT method was used with the bUpdate parameter set to FALSE$. The event passes the index of the item that was being edited:
bForward = ITEMUNCHANGED( CtrlEntID, CtrlClassID, ItemIndex )
So that wraps up this short post on ListBox editing - we're sure that you'll find many useful ways of implementing this new feature when expanding your application's functionality.