Carl,
... your program sort of worked for me as well. One thing I did notice though was in your code, the last line here ...
DIALOG ATTRIBUTES ( UNBUFFERED, FIELD ORDER FORM )
INPUT BY NAME menu_option
ON ACTION dialogtouched
IF DIALOG.getCurrentItem() = "menu_option" THEN
CALL selected_submenu.clear()
FOR i = 1 TO submenu.getLength()
LET l_item = UPSHIFT( submenu[ i ].screen_desc )
LET l_option = UPSHIFT( menu_option )
... that should be
LET l_option = UPSHIFT(FGL_DIALOG_GETBUFFER())
(and you could move it before the FOR loop as the value doesn't change each iteration)
In ON ACTION dialogtouched, the current field won't be populated with what the user has typed in, when using UNBUFFERED. To get what has been typed in so far, use FGL_DIALOG_GETBUFFER(). For reason why, consider what would happen if the field was a DATE and how the date field would be populated after typing one character.
If you still have an issue, perhaps post your .4ad (or use the default.4ad in FGLDIR/lib/default.4ad). Make sure that the dialogtouched action has validate="no" defined
Hope that helps,
Reuben